zoukankan      html  css  js  c++  java
  • Redis分布式锁实例

    maven依赖

    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>3.0.1</version>
    </dependency>

    代码实现

    package com.zhi.demo;
    
    import java.util.Collections;
    
    import redis.clients.jedis.Jedis;
    import redis.clients.jedis.JedisPool;
    import redis.clients.jedis.JedisPoolConfig;
    import redis.clients.jedis.params.SetParams;
    
    /**
     * Redis分布式锁
     *
     * @date 2019年03月05日17:20:05
     *
     */
    public class RedisLock {
        private static JedisPool jedisPool;
        /**
         * 加锁成功标示
         */
        private static final String LOCK_SUCCESS = "OK";
        /**
         * 解锁成功标示
         */
        private static final Long RELEASE_SUCCESS = 1L;
    
        static {
            JedisPoolConfig config = new JedisPoolConfig();
            config.setMaxIdle(5);
            config.setTestOnBorrow(false);
    
            jedisPool = new JedisPool(config, "192.168.153.137", 6379);
        }
    
        /**
         * 申请锁
         * 
         * @param key       锁名
         * @param requestId 请求ID,一般用UUID(用于记录谁申请的锁)
         * @return 是否成功
         * 
         */
        public static boolean lock(String key, String requestId) {
            try (Jedis jedis = jedisPool.getResource();) {
                SetParams params = new SetParams();
                params.ex(100); // 设置超时时间
                params.nx(); // 若锁不存在才进行写操作
                String back = jedis.set(key, requestId, params);
                return LOCK_SUCCESS.equals(back);
            }
        }
    
        /**
         * 解锁,判断requestId的一致性和删除锁必须放在一个请求中,防止时间差引起错误
         * 
         * @param jedis
         * @param key       锁名
         * @param requestId 请求ID
         * @return 是否解锁成功
         * 
         */
        public static boolean unlock(String key, String requestId) {
            try (Jedis jedis = jedisPool.getResource();) {
                String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
                Object result = jedis.eval(script, Collections.singletonList(key), Collections.singletonList(requestId));
                return RELEASE_SUCCESS.equals(result);
            }
        }
    
        public static void main(String[] args) {
            if (RedisLock.lock("redis", "1")) {
                System.out.println("申请锁成功");
                if (RedisLock.lock("redis", "2")) {
                    System.out.println("再次申请锁成功");
                } else {
                    System.out.println("再次申请锁失败");
                }
                if (RedisLock.unlock("redis", "1")) {
                    System.out.println("解锁成功");
                } else {
                    System.out.println("解锁失败");
                }
            } else {
                System.out.println("申请锁失败");
            }
            jedisPool.close();
        }
    }

    有兴趣的同学可以参考:https://www.cnblogs.com/linjiqin/p/8003838.html,这个讲解比较清楚。

  • 相关阅读:
    2011年需要关注的9大编程语言 狼人:
    微软在华推广Win7拒绝“黑屏” 狼人:
    ifanr访谈:GuruDigger — Web工程师排排坐 狼人:
    10种破除网页设计师障碍的实用方法 狼人:
    英特尔CEO:微软Windows 7是PC更新的催化剂 狼人:
    Windows 7市场份额突破25% XP持续下滑 狼人:
    Office Web Apps中文版正式上线 狼人:
    机器学习实现线性梯度算实现octave
    管理系统数据库sql server 数据库管理
    缓存代码sencha Touch 缓存问题解析
  • 原文地址:https://www.cnblogs.com/zhi-leaf/p/10502646.html
Copyright © 2011-2022 走看看