当前位置: 首页 > news >正文

(Redis)Redis 分布式锁及改进策略详解

一、为什么需要分布式锁

在单机应用中,synchronizedReentrantLock 足以解决并发问题。但在 分布式系统 中,多台服务器之间共享同一个资源时,如果没有锁,很可能出现 超卖、重复扣减、数据不一致 等问题。
因此,分布式锁应运而生,Redis 因其高性能与丰富指令,成为分布式锁的常用实现工具。


二、Redis 实现分布式锁的基本原理

Redis 分布式锁主要基于 SET key value NX EX time 命令实现,核心思路:

  1. 加锁

    • 使用 SETNX 保证 key 不存在时才能成功设置。

    • 使用 EX 设置过期时间,避免死锁。

    • value 通常设置为随机值,用于标识锁的持有者。

  2. 解锁

    • 判断当前锁的 value 是否是自己设置的随机值。

    • 只有持有者才能释放锁。

    • 使用 Lua 脚本保证“查询 value + 删除 key”的原子性。

这样可以保证:

  • 互斥性:同一时刻只有一个客户端获取锁。

  • 避免死锁:即使客户端异常宕机,锁也会自动过期释放。

  • 可重入/安全解锁:通过 value 标识持有者,防止误删别人的锁。


三、可能存在的问题

  1. 锁过期导致并发

    • 如果业务逻辑执行时间 > 锁过期时间,可能导致锁自动释放,其他客户端拿到锁,出现数据不一致。

  2. 主从复制延迟问题

    • 在 Redis 主从架构下,如果主节点写入成功但未同步到从节点,主节点宕机后从节点被提升为主,会导致锁丢失。

  3. 不可重入性

    • 同一个线程多次加锁会失败,需要额外机制实现可重入。


四、改进策略

1. 合理设置过期时间

  • 根据业务逻辑耗时设置合理的锁过期时间。

  • 可结合 锁续期机制:在后台定时任务中为锁自动续期(如 Redisson 的 WatchDog)。

2. 使用 Lua 脚本保证原子性

  • 解锁必须使用 Lua 脚本,保证“判断 value + 删除 key”操作的原子性。

3. Redlock 算法(Redis 官方提出)

  • 通过 多个 Redis 实例 获取锁,必须在大多数节点上成功才算加锁成功。

  • 提高了分布式锁的可靠性,避免因单点故障导致锁失效。

4. 引入 Redisson 框架

  • Redisson 封装了分布式锁,支持可重入锁、公平锁、读写锁、自动续期等功能。

  • 在实际业务中更推荐使用,而不是自己手写。


五、典型应用场景

  1. 电商秒杀:防止超卖。

  2. 库存扣减:保证同一商品库存不会被多次扣减。

  3. 订单防重:防止重复提交订单。

http://www.xdnf.cn/news/1426267.html

相关文章:

  • Spring 控制器参数注解
  • VBA开发者的福音:让代码效率暴涨300%的终极数据结构选择指南
  • 基于单片机智能空调/温度控制系统
  • 力扣404 代码随想录Day15 第三题
  • GitHub每日最火火火项目(9.1)
  • Java类和对象(下)
  • 二维元胞自动机:从生命游戏到自复制系统的计算宇宙
  • pprint:美观打印数据结构
  • 基于单片机十六路抢答器系统Proteus仿真(含全部资料)
  • Qt::Q_INIT_RESOURCE用法
  • 前端性能优化实战:如何高效管理和加载图片、字体、脚本资源
  • 在 Qt 中:QString 好,还是 std::string 好?
  • 零售行业的 AI 革命:从用户画像到智能供应链,如何让 “精准营销” 不再是口号?
  • 响应式编程框架Reactor【9】
  • 2.充分条件与必要条件
  • 基本问题解决--舵机
  • 手把手教你搭建 UDP 多人聊天室(附完整源码)
  • 10.《基础知识探秘:DHCP地址分配员》
  • 打工人日报#20250901
  • nCode 后处理常见问题汇总
  • C++精选面试题集合(100份大厂面经提取的200+道真题)
  • 实现自己的AI视频监控系统-第三章-信息的推送与共享2
  • 【自记录】Ubuntu20.04下Python自编译
  • docker-nacos-v3
  • 在飞牛构建私有化协作环境GodoOS:集成文档、即时通讯、白板与思维导图!
  • 用只能以关键字指定和只能按位置传入的参数来设计清晰的接口(Effective Python 第25条)
  • Web知识的总结
  • Linux并发与竞争实验
  • Linux 下 MySQL 数据库定时备份脚本与 Crontab 配置
  • RK3588部署yolov8目标检测