缓存穿透问题:
特点: 查询太多新的没有的数据,多次请求mysql导致崩溃
缓存击穿问题:
特点: 多次请求热点key, 热点key正好过期,这个时候会大量请求直接访问数据库,导致崩溃
缓存雪崩问题:
特点: 同一时间内,导致大量key过期,同时请求数据库;
分布式锁问题:
问题描述: 单纯的Java API并不能提供分布式锁的能力,只能实现在同一机器上实现锁
分布式锁主流的实现方案:
- 基于数据库实现分布式锁
- 基于缓存(Redis等)
- 基于Zookeeper
每一种分布式锁解决方案都有各自的优缺点:
- 性能:redis最高
- 可靠性:zookeeper最高
这里,我们就基于redis实现分布式锁。
实现:
注意:
问题1: 只设置一个锁,如果出现故障的情况, 会导致全部堵塞
解决 : 设置过期时间
问题2: 设置完锁之后,出现故障, 导致没有设置过期时间?
解决: 使用 set lock “OK” NX EX 30 命令实现 原子性操作
参数解释:
EX : 设置过期时间为秒数
PX: 设置过期时间为毫秒
NX: 当key不存在时,对其操作
XX: 当key存在时,对其操作
问题3: 当去删除锁的时候,过期时间正好到, 会释放掉刚刚抢到锁的机器的锁的问题?
解决: 将lock的值设置 为一个随机生成的uuid,如果uuid与之前相同, 进行删除, 如果不同不进行删除
问题4:
解决: 添加原子性操作, 使用lua脚本