Redis分布式锁

Posted zad27

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis分布式锁相关的知识,希望对你有一定的参考价值。

 1 package com.zad.jedis;
 2 
 3 import redis.clients.jedis.Jedis;
 4 
 5 import java.util.Collections;
 6 
 7 /**
 8  * 描述:
 9  * 分布式锁
10  *
11  * @author zad
12  * @create 2018-09-14 13:58
13  */
14 public class Distributed {
15     private static final String LOCK_SUCCESS = "OK";
16     private static final String SET_IF_NOT_EXIST = "NX";
17     private static final String SET_WITH_EXPIRE_TIME = "PX";
18     private static final Integer RELEASE_SUCCESS = 1;
19     private static final Integer DEFAULT_TIME = 5;
20 
21     /**
22      * 尝试获取分布式锁
23      *
24      * @param jedis      Redis客户端
25      * @param lockKey    锁
26      * @param requestId  请求标识
27      * @return 是否获取成功
28      */
29     public static boolean tryGetDistributedLock(Jedis jedis, String lockKey, String requestId) {
30 
31         String result = jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, DEFAULT_TIME);
32 
33         if (LOCK_SUCCESS.equals(result)) {
34             return true;
35         }
36         return false;
37 
38     }
39 
40 
41     /**
42      * 尝试获取分布式锁
43      *
44      * @param jedis      Redis客户端
45      * @param lockKey    锁
46      * @param requestId  请求标识
47      * @param expireTime 超期时间
48      * @return 是否获取成功
49      */
50     public static boolean tryGetDistributedLock(Jedis jedis, String lockKey, String requestId, int expireTime) {
51 
52         String result = jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);
53 
54         if (LOCK_SUCCESS.equals(result)) {
55             return true;
56         }
57         return false;
58 
59     }
60 
61     /**
62      * 释放分布式锁
63      *
64      * @param jedis     Redis客户端
65      * @param lockKey   锁
66      * @param requestId 请求标识
67      * @return 是否释放成功
68      */
69     public static boolean releaseDistributedLock(Jedis jedis, String lockKey, String requestId) {
70 
71         String script = "if redis.call(‘get‘, KEYS[1]) == ARGV[1] then return redis.call(‘del‘, KEYS[1]) else return 0 end";
72         Object result = jedis.eval(script, Collections.singletonList(lockKey), Collections.singletonList(requestId));
73 
74         if (RELEASE_SUCCESS.equals(result)) {
75             return true;
76         }
77         return false;
78 
79     }
80 }

 

以上是关于Redis分布式锁的主要内容,如果未能解决你的问题,请参考以下文章

分布式锁三种解决方案

分布式锁Redis分布式锁注解灵活实现

分布式Redis锁并发编程Redis分布式锁实例

Redis进阶学习03---Redis完成秒杀和Redis分布式锁的应用

间谍高度(上帝视角)和redis分布式锁

分布式锁,及Redis实现分布式锁