当前位置:网站首页>Redis分布式锁的实现
Redis分布式锁的实现
2022-07-04 19:03:00 【大丈夫在世当日食一鲲】
1导入jedis依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>随便填版本</version>
</dependency>
2 加锁&&解锁
@Component
class RedisTool {
private static final String LOCK_SUCCESS = “OK”;
private static final String SET_IF_NOT_EXIST = “NX”;
private static final String SET_WITH_EXPIRE_TIME = “PX”;
/**
* 尝试获取分布式锁
* @param jedis Redis客户端
* @param lockKey 锁
* @param requestId 请求标识
* @param expireTime 超期时间
* @return 是否获取成功
*/
public static boolean tryGetDistributedLock(Jedis jedis, String lockKey, String requestId, int expireTime) {
String result = jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);
if (LOCK_SUCCESS.equals(result)) {
return true;
}
return false;
}
/**
* 释放分布式锁
* @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;
}
}
3 这个比较简单,官方建议使用reddsion建立分布式锁
4 这里存在一些问题 后续再补充,先抛出来,并提供一些方案,如有不足,欢迎开喷
1.此处设置了过期时间,但是如果两个服务先后发起了一个请求,a服务卡住了,锁到期了,B服务启动了,但是B服务开的锁被A服务关了,B服务处于无锁状态,A服务关的不是自己的锁,所以。。。。
对于这种问题 上面用了requestId 来解决
2 假设因业务需要,不需要设定过期时间的情况下,服务挂了,重启 这个锁,锁了寂寞。此处可以利用redis的哨兵模式了
3 假设redis挂了,锁失效,服务接近于裸奔,数据也不知道是不是脏了,针对业务点,适当使用事务回滚进行操作
边栏推荐
- 强化学习-学习笔记2 | 价值学习
- 剑指 Offer II 80-100(持续更新)
- Hash quiz game system development how to develop hash quiz game system development (multiple cases)
- 【ISMB2022教程】图表示学习的精准医疗,哈佛大学Marinka Zitnik主讲,附87页ppt
- 【历史上的今天】7 月 4 日:第一本电子书问世;磁条卡的发明者出生;掌上电脑先驱诞生
- 太方便了,钉钉上就可完成代码发布审批啦!
- Chrome development tool: what the hell is vmxxx file
- FS4061A升压8.4V充电IC芯片和FS4061B升压12.6V充电IC芯片规格书datasheet
- Cann operator: using iterators to efficiently realize tensor data cutting and blocking processing
- Free soldier
猜你喜欢
Huawei Nova 10 series supports the application security detection function to build a strong mobile security firewall
Pointnext: review pointnet through improved model training and scaling strategies++
Crystal optoelectronics: ar-hud products of Chang'an dark blue sl03 are supplied by the company
C # better operation mongodb database
AP8022开关电源小家电ACDC芯片离线式开关电源IC
Practical examples of node strong cache and negotiation cache
【深度学习】一文看尽Pytorch之十九种损失函数
Small hair cat Internet of things platform construction and application model
#夏日挑战赛#带你玩转HarmonyOS多端钢琴演奏
Common verification rules of form components -1 (continuously updating ~)
随机推荐
同事的接口文档我每次看着就头大,毛病多多。。。
idea插件
[Beijing Xunwei] i.mx6ull development board porting Debian file system
[problem] Druid reports exception SQL injection violation, part always true condition not allow solution
Flet教程之 06 TextButton基础入门(教程含源码)
Practical examples of node strong cache and negotiation cache
Win11系统wifi总掉线怎么办?Win11系统wifi总掉线的解决方法
NetCore3.1 Json web token 中间件
What are the consequences of closing the read / write channel?
Optimization cases of complex factor calculation: deep imbalance, buying and selling pressure index, volatility calculation
What is involution?
2022 version of stronger jsonpath compatibility and performance test (snack3, fastjson2, jayway.jsonpath)
#夏日挑战赛#带你玩转HarmonyOS多端钢琴演奏
[in-depth learning] review pytoch's 19 loss functions
最长的可整合子数组的长度
Win11亮度被锁定怎么办?Win11亮度被锁定的解决方法
Win11无法将值写入注册表项如何解决?
应用实践 | 蜀海供应链基于 Apache Doris 的数据中台建设
YOLOv5s-ShuffleNetV2
Ziguang zhanrui completed the first 5g R17 IOT NTN satellite on the Internet of things in the world