Reids 分布式锁
问题描述
1、单体单机部署的系统被演化成分布式集群系统后
2、由于分布式系统多线程、多进程并且分布在不同机器上,这将使原单机部署情况下的并发控制锁策略失效
3、单纯的Java API 并不能提供分布式锁的能力
4、为了解决这个问题就需要一种跨JVM 的互斥机制来控制共享资源的访问,这就是分布式锁要解决的问题
5、示意图(说明: 我们探讨的分布式锁是针对分布式项目/架构而言[.])
分布式锁主流实现方案
- 基于数据库实现分布式锁
- 基于缓存(Redis 等)
- 基于Zookeeper
每一种分布式锁解决方案都有各自的优缺点:
- 性能:redis 最高
- 可靠性:zookeeper 最高
- 我们讲解基于Redis 实现分布式锁
实例: Redis 实现分布式锁-基本实现
指令: setnx key value
解读:
- setnx 可以理解是上锁/加锁指令
- key 是锁的键
- value 是锁的值
- 在这个key 没有删除前, 不能执行相同key 的上锁指令.
指令: del key
解读
- 就是删除key, 可以理解成就是释放锁
指令: expire key seconds
解读
- 给锁-key, 设置过期时间
- 目的是防止死锁
指令: ttl key
解读
- 查看某个锁-key, 过期时间
指令: set key value nx ex seconds
解读
-
设置锁的同时, 指定该锁的过期时间,防止死锁
-
这个指令是原子性的,防止setnx key value / expire key seconds 两条指令, 中间执行被打断.
-
过期时间到后, 会自动删除
实例: Redis 实现分布式锁-代码实现
需求说明/图解, 编写代码, 实现如下功能
- 在SpringBoot+Redis 实现分布式锁的使用
- 获取锁, key 为lock, 示意图
第1 种情况
--如果获取到该分布式锁
--就获取key 为num 的值, 并对num+1, 再更新num 的值, 并释放锁(key 为lock)
--如果获取不到key 为num 的值, 就直接返回
第2 种情况
--如果没有获取