Redis Demo系列之(五)分布式锁

版权声明:欢迎转载,转载请说明出处https://csdn.yanxml.com。大数据Github项目地址https://github.com/SeanYanxml/bigdata。 https://blog.csdn.net/u010416101/article/details/81229410

前言

线程之间锁问题多解决主要有数据库锁机制、Redis分布式锁、ZooKeeper分布式锁。其中Redis内单节点的分布式锁可以使用setnx进行处理。集群环境需要使用redisson

本文相关代码,可在我的Github项目https://github.com/SeanYanxml/bigdata/tree/master/redis 目录下可以找到。
PS: (如果觉得项目不错,可以给我一个Star。)


Demo

/**
 * Jedis lock.
 * 
 * */
public class RedisLockDemo {

    public static Jedis jedis = new JedisPoolManager().getJedis();


    // demo1 Jedis lock can do but not perfect.
    public static boolean notperfectLock(String key){
         Long result = jedis.setnx(key, "This is a Lock.");
         if(result == 1l){
             return true;
         }else{
             return false;
         }
    }

    // demo1 Jedis unlock can do but not perfect.
    public static boolean notperfectUnlock(String key){
        jedis.del(key);
        return true;
    }

    // demo1 Jedis unlock can do but also not perfect.
    public static boolean notperfectUnlock2(String lockKey, String lockValue){
        if(lockKey.equals(jedis.get(lockKey))){
            jedis.del(lockKey);
        }
        return true;
    }

    // demo2 perfect lock demo.
    private static final String LOCK_SUCCESS = "OK";
    private static final String SET_IF_NOT_EXISTS = "NX";
    private static final String SET_WITH_EXPIRE_TIME = "PX";

    /**
     * 设置分布式锁
     * @param jedis Redis客户端
     * @param lockKey 锁
     * @param requestId 请求标识
     * @param expireTime 生效时间
     * @return 是否释放成功
     */
    public static boolean tryGetDistributedLock(String lockKey,String requestId,int expireTime){
        String result = jedis.set(lockKey, requestId, SET_IF_NOT_EXISTS,SET_WITH_EXPIRE_TIME,expireTime);
        if(LOCK_SUCCESS.equals(result)){
            return true;
        }
        return false;
    }


     private static final Long RELEASE_SUCCESS = 1L;

        /**
         * 释放分布式锁
         * @param jedis Redis客户端
         * @param lockKey 锁
         * @param requestId 请求标识
         * @return 是否释放成功
         */
        public static boolean releaseDistributedLock(Jedis jedis, String lockKey, String requestId) {

            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(lockKey), Collections.singletonList(requestId));

            if (RELEASE_SUCCESS.equals(result)) {
                return true;
            }
            return false;

        }

        public static void main(String[] args) {
            releaseDistributedLock(jedis,"hello","hello");
        }
}

Reference

[1]. Redis分布式锁的正确实现方式(Java版)
[2]. 分布式锁的几种使用方式(redis、zookeeper、数据库)
[3]. Redis学习笔记(六)redis实现分布式锁

阅读更多

扫码向博主提问

在风中的意志

非学,无以致疑;非问,无以广识
  • 擅长领域:
  • Java
  • 大数据
去开通我的Chat快问
换一批

没有更多推荐了,返回首页