Redis实现分布式锁
分布式锁要解决的几个问题:
- 互斥性,同一时刻只能有一台服务器能访问资源
- 安全性,锁只能被持有该锁的客户端删除或者释放
- 容错,在服务器宕机的时候,锁仍能得到释放或者其他服务器可以进行加锁
- 避免死锁
方案1
-
首先使用setnx命令,即当没有key存在的时候,才会创建value。
当执行成功的时候会返回1
当执行失败的时候会返回0
使用expire命令,指定key的过期时间
setnx key value
expire key second
问题:
因为操作不是原子性的,如果在进行setnx的时候,刚好服务器宕机,没有来得及进行expire,那么该key将一直无法释放。
方案2
直接使用redis的原子命令:
set key value [EX seconds] [PX milliseconds] [NX|XX]
- EX: key在多少秒之后过期
- PX:key在多少毫秒之后过期
- NX: 当key不存在的时候,才创建key,效果等同于setnx
- XX:当key存在的时候,覆盖key
问题:
当同一时刻有大量的key过期的时候,删除key是需要时间的,可能导致redis出现暂时的卡顿现象,要如何解决?
答:在设置key过期时间的时候加上一个随机值