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加上随机值

猜你喜欢

转载自blog.csdn.net/xinbumi/article/details/89741346