redis实现简易分布式锁

一、依赖命令

SET key value [EX seconds] [PX milliseconds] [NX|XX]

注:这是redis后面版本扩展了set指令(可以替代setnx、setex等),也就是简单的将set key value扩展了几个参数,并且保证原子操作

二、解释

key:字面意思

value:字面意思

EX/PX:用于支持设置key的过期时间,这两个参数表示单位,EX:表示秒,PX:表示毫秒

NX/XX:限制set行为:

             NX:表示当key不存在时才会成功设置新值,并且返回ok,否则失败

             XX:表示当key存在时才会成功设置新值,并且返回ok,否则失败

三、使用

redis会保证此操作为原子操作,赋值和设置超时要么都成功,要么都失败。所以可以依赖此特性,实现分布式锁。

例子:set lock_key lock_value NX EX 20

上述例子的功能为:尝试获取lock_key锁,并将值设置为lock_value(用作分布式锁时,可以将value设置成竞争锁的id,具体看需求),并且20秒后自动释放

四、总结

单单依赖该命令实现的分布式锁有很大的局限性,比如加锁只能在一个节点,可能会出现主从切换丢失锁的情况:在master锁定成功之后,同步到slave之前发生了主从切换。这个时候可以使用Redlock,感兴趣的朋友可以去了解一下。

附:redis简易手册

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章