高并发秒杀下,如何避免 Redis 分布式锁的坑?

秒杀场景:

优化一:

负载均衡 分布式部署

nginx和Java的springboot gateway 网关

问题:

Java中的锁,只能锁住一个线程,对于分布式情况下,每台服务器都会有一个锁,因为锁是jvm级别的

优化二:

redis分布式锁

通过redis的SetNX实现分布式锁

如果锁住某个key,就会返回true,没锁上就返回false

问题:

用户在请求过程中,如果用户所处的服务器挂掉,那么分布式锁,无法解锁

导致其他请求来,给该key上锁,无法上锁,出现死锁

解决:

给分布式锁设置过期时间

新问题:

如果业务时间长,锁提前释放 ,又会造成超卖的问题

优化三:

1.给锁加长时间,并添加子线程每10秒确认线程是否在线,在线则将过期时间重设

2.给锁加唯一id(uuid)解决处理完释放其他线程的锁的情况

重点:以上优化可以用redis组件redisson来解决实现分布式锁

redisson原理:

问题:

如果redis使用的是 主从复制的模式,有主节点和从节点,设置锁时 只能给主节点设置

如果给主节点设置锁,这时如果主节点突然宕机了,从节点没有同步到这把锁,这是又会出现超卖问题

解决方案:

redisson有一个read lock

保证所有你提供的节点都存储完毕,才相应锁成功

相关推荐
程序员阿鹏2 小时前
为什么MySQL InnoDB选择B+树?
数据结构·数据库·b树·sql·mysql·算法·缓存
瀚高PG实验室3 小时前
使用pg_stat_statements抓取数据库TOP SQL
数据库·sql·postgresql·瀚高数据库
码哥字节4 小时前
AI一天出百本书,写不出我被Redis坑的那三天三夜
redis·ai编程工具
yanwumuxi4 小时前
【数据库系列】opensearch数据备份和恢复
数据库
anxiao_m4 小时前
2026企业AI数字孪生选型攻略,不同场景对应不同解决方案
大数据·网络·数据库
SelectDB4 小时前
从 ClickHouse 迁移到 Doris:SQL 兼容、同步与验证清单(实战笔记)
大数据·数据库·数据分析
SelectDB5 小时前
Doris 还是 ClickHouse?一张表说清 6 个关键差异(实战笔记)
大数据·数据库·数据分析
oradh5 小时前
Oracle Undo问题总结(两类Undo表空间不足和单个会话占用大量Undo的性能问题)
数据库·oracle
企业数字化笔记5 小时前
固定资产财务账与实物账怎么对账?折旧快照、差异检测与SQL核对
android·数据库·sql
DBA_G6 小时前
GBase 8a表空间多路径存储数据迁移链路适配解析
数据库·oracle