Redis --- 如何实现分布式锁
分布式锁需要解决的问题
1、互斥性
2、安全性
3、死锁
4、容错
SETNX key value : 如果key不存在,则创建并赋值
时间复杂度O(1)
返回值: 设置成功 ,返回1 ,设置失败返回 0
get locknx
(nil) 空值 不存在的
setnx locknx test
返回 1
如果再赋值一次 setnx locknx test123
返回 0
以此有设想,我们可以通过代码层面,去设置这个key的值,如果设置成功,代表该资源没有被别的程序所占用,如果设置失败,则证明有别的程序,或者线程占用该资源
如何解决SETNX 长期有效问题
EXPIRE key seconds
为给定key设置生存时间,当key过期时(生存时间为0) 会被自动删除
expire locknx 2 (2代表2秒)
缺点:缺少原子性
从Redis 2.6.12 开始 就可以保证原子性
SET key value [EX seconds] [PX milliseconds] [NX | XX]
EX second : 设置键的过期时间为seconds秒
PX millisecond : 设置键的过期时间为millisconds 毫秒
NX :只在键不存在时,才对键进行设置操作
XX : 只在键存在时,才对键进行设置操作
SET 操作完成时,返回OK ,否则返回 nil
例如:set locktarget 12345 ex 10 nx
大量key同时过期的注意事项
集中过期,由于清除大量的key很耗时,会出现短暂的卡顿现象。
解放方案:在设置key的过期时间的时候,给每个key加上随机值