• 欢迎光临~

redis分布式锁代码实现

开发技术 开发技术 2022-08-02 次浏览

1 private static final String LOCK_SUCCESS = "OK";
2 private static final String SET_IF_NOT_EXIST = "NX";
3 private static final String SET_WITH_EXPIRE_TIME = "PX";
4 private static final Long RELEASE_SUCCESS = 1L;
5
6 // Redis客户端
7 private Jedis jedis;
8
9 /**
10 * 尝试获取分布式锁
11 * @param lockKey 锁
12 * @param expireTime 超期时间
13 * @return 是否获取成功
14 /
15 public boolean lock(String lockKey, int expireTime) {
16 //获取客户唯⼀识别码,例如:mac+线程信息
17 String custId = getCustId();
18 String result = jedis.set(lockKey, custId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);
19
20 if (LOCK_SUCCESS.equals(result)) {
21 return true;
22 }
23 **
24 return false;
25 }
26
27 /

28 * 释放分布式锁
29 * @param lockKey 锁
30 * @param requestId 请求标识
31 * @return 是否释放成功
32 /
33 public boolean unlock(String lockKey,) {
34 //获取客户唯⼀识别码,例如:mac+线程信息
35 String custId = getCustId();
36 String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end"
37 Object result = jedis.eval(script, Collections.singletonList(lockKey), Collections.singletonList
38
39 if (RELEASE_SUCCESS.equals(result)) {
40 return true;
41 }
42 return false;
43 }
44
45 /

46 * 获取锁信息
47 * @param lockKey 锁
48 * @return 是否重⼊锁
*49 /
50 public boolean checkReentrantLock(String lockKey){
51 //获取客户唯⼀识别码,例如:mac+线程信息
52 String custId = getCustId();
**53 **
54 //获取当前锁的客户唯⼀表示码
55 String currentCustId = redis.get(lockKey);
56 if (custId.equals(currentCustId)) {
57 return true;
58 }
59 return false;
60 }
61

2. 调⽤示例:
1 public void test() {
2 String lockKey = "lockKey";
3 //判断是否重⼊锁
4 if (!checkReentrantLock(lockKey)) {
5 //⾮重⼊锁
6 while (!lock(lockKey)) {
7 //获取锁失败, 则阻塞⾄获取锁
8 try{
9 Thread.sleep(100)
10 } catch(Exception e) {
11 }
12 }
13 }
14 //TODO 业务处理
**15 **
16 //释放锁
17 unlock(lockKey);
18 }
1

程序员灯塔
转载请注明原文链接:redis分布式锁代码实现
喜欢 (0)