Redis分布式锁导致死锁、锁误删的场景及解决方法
创作时间:
作者:
@小白创作中心
Redis分布式锁导致死锁、锁误删的场景及解决方法
引用
CSDN
1.
https://blog.csdn.net/qq_33204709/article/details/139338591
Redis 天生就可以作为一个分布式系统来使用,所以它实现的锁都是分布式锁。
Redis 可以通过 setnx 命令(set if not exists)命令实现分布式锁,实现方式如下所示:
# 加锁
setnx mylock 1
# 释放锁
del mylock
通过执行结果是否为1,可以判断是否成功获取到锁,如下图所示:
Redis 分布式锁存在什么问题?
Redis 分布式锁存在两个问题:
死锁问题:如果在加锁之后,未设置过期时间、锁忘记释放、加锁后还没来得及释放锁就宕机了这3种情况都会导致死锁问题。
锁误删问题:设置了超时时间,但是线程执行超过过期时间后锁误删问题。
解决死锁问题
- 方式一:set 升级
MySQL 中解决死锁问题是通过设置超时时间,Redis 也是如此,但是问题来了,第一步先加锁,然后再设置超时时间,那么就不满足原子性了,那怎么办?
官方在 Redis 2.6.12 版本之后,新增了一个功能,我们可以使用一条命令既执行加锁操作,又设置过期时间,相当于:setnx + expire。如下图所示:
- 第1条命令加锁成功,并设置 30s 过期时间。
- 第2条命令跟在第1条命令后,还没有超过 30s,所以加锁失败。
- 方式二:setIfAbsent 新方法
setIfAbsent() 是 Redis 专门为分布式锁实现的原子操作,其中封装了获取 key、设置 key、设置过期时间等操作。
RedisUtils 工具类:
@Component
public class RedisUtils {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
/**
* 原子性操作 加锁
*/
public boolean setIfAbsent(String key, String value, long timeout, TimeUnit unit) {
return Boolean.TRUE.equals(redisTemplate.opsForValue().setIfAbsent(key, value, timeout, unit)
热门推荐
如何治疗小腿肚子疼和臀部麻木的症状
18世纪苏格兰水手荒岛生存4年成《鲁滨逊漂流记》原型
6步教你做外焦里糯的大黄米莲藕饼
大黄米:冬季养生的营养担当,3种食谱助你调养身体
特朗普贸易政策引发韩股暴跌,三星股价跌至四年新低
libstdc++ 6:C++开发者的必备神器
成都6个热门夜市,每当夜幕降临,好吃嘴都蜂拥而至
如何在微信中高效管理多个账号,实现间接联动?
广西江西2025年气候预测:冷热交替,你准备好了吗?
春节带娃去哪儿玩?横店南京上海千岛湖任选
每天一勺芝麻酱,心血管更健康
《鲁滨逊漂流记》思维导图笔记:让阅读更直观高效
以长安链为底座,江海链助力南通民政打造慈善应用标杆
跨界融合:人工智能与区块链如何重新定义数据安全?
维京长船:桨帆结合设计开创北大西洋航线,兼具贸易与探险功能
给琥珀排排辈儿,看看谁是年龄最大的琥珀?
郑州大学一附院专家教你早期筛查肺结节
杨宝江主任教你评估肺结节风险
CT扫描揭示右肺结节真相:低剂量高精度,精准诊断保健康
专家:区块链在金融各细分领域应用前景广阔
物联网技术开发如何与区块链结合?(物联网+区块链,打造可信智能系统)
上海国资国企数字化转型提速:首批区块链创新应用场景启动
区块链在安全领域的应用
科学解读青春期身体变化:家长如何正确引导孩子
购买纯银饰品时如何运用法律保障自己的权益
临沂疾控专家详解:学校甲流防控这样做最有效
甲流防护全攻略:从个人卫生到疫苗接种
昂拉地韦缩短症状25%,玛舒拉沙韦24小时退烧:新药治疗甲流效果对比
全球首艘氢动力邮轮诞生,维京引领航运业绿色转型
Nature最新研究:表观遗传变异可独立引发癌症