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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值