redis学习笔记(19)分布式锁
1、概述
随着业务发展的需要,原单体单机部署的系统被演化成分布式集群系统后,由于分布式系统多线程的特点以及分布在不同机器上,这将使原单机部署情况下的并发控制锁策略失效,单纯的 Java API 并不能提供分布式锁的能力。为了解决这个问题就需要一种跨 JVM 的互斥机制来控制共享资源的访问,这就是分布式锁要解决的问题!
2、分布式锁主流的实现方案
- 基于数据库实现分布式锁
- 基于缓存(Redis 等)
- 基于 Zookeeper
- 根据实现方式,分布式锁还可以分为类 CAS 自旋式分布式锁以及 event 事件类型分布式锁:
- 类 CAS 自旋式分布式锁:询问的方式,类似 java 并发编程中的线程获询问的方式尝试加锁,如 mysql、redis。
- 另外一类是 event 事件通知进程后续锁的变化,轮询向外的过程,如 zookeeper、etcd。
- 每一种分布式锁解决方案都有各自的优缺点:
- 性能:redis 最高
- 可靠性:zookeeper 最高
3、使用 redis 实现分布式锁
- 使用setnx上锁,使用del释放锁;
- 为了避免锁一直不释放,使用expire给锁设置一个过期时间,自动释放;
- 使用set key value nx ex 10可以同时上锁和设置过期时间;
- 使用uuid防止误删锁,造成没锁的情况,具体步骤如下:
1)使用set key value uuid nx ex 10命令给锁生成uuid;
2)释放锁的时候,判断当前的uuid和要释放的uuid是否一样。
4、LUA保证删除的原子性
参考:(29条消息) redis 14 分布式锁(UUID防误删、LUA脚本保证删除的原子性、锁的实现原则)_但行益事莫问前程的博客-CSDN博客
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· 单线程的Redis速度为什么快?
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码