redis分布式锁代码实现

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

posted @   开源遗迹  阅读(615)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
点击右上角即可分享
微信分享提示