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博客