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,这个讲解比较清楚。

  • 相关阅读:
    【LeetCode】17. Letter Combinations of a Phone Number
    【LeetCode】16. 3Sum Closest
    【LeetCode】15. 3Sum 三个数和为0
    【LeetCode】14. Longest Common Prefix 最长前缀子串
    【LeetCode】13. Roman to Integer 罗马数字转整数
    【LeetCode】12. Integer to Roman 整型数转罗马数
    【LeetCode】11. Container With Most Water
    【LeetCode】10. Regular Expression Matching
    Models of good programmer
    RSA Algorithm
  • 原文地址:https://www.cnblogs.com/zhi-leaf/p/10502646.html
Copyright © 2011-2022 走看看