Document

分布式锁学习二(redis实现)

Redis为单进程单线程模式,采用队列模式将并发访问变成串行访问,且多客户端对Redis的连接并不存在竞争关系Redis中可以使用SETNX命令实现分布式锁。

将 key 的值设为 value ,当且仅当 key 不存在。若给定的 key 已经存在,则 SETNX 不做任何动作。

SETNX key value //如果key不存在,则创建并赋值
EXPIRE key seconds //设置key的生存时间,当key过期(生存时间为0),会自动删除
DEL key //解锁,使用该命令就能释放锁

存在风险:SETNX和EXPIRE 为两个指令,不能保证原子性,如果设置了SETNX后程序崩溃,EXPIRE未成功执行则会出现资源锁死的情况。

二、针对该问题,redis 在2.6.12版本过后增加新的解决方案

set key value [expiration EX seconds|PX milliseconds] [NX|XX]

EX seconds:将键的过期时间设置为 seconds 秒。 SET key value EX seconds 等同于 SETEX key seconds value
PX millisecounds:将键的过期时间设置为 milliseconds 毫秒。 SET key value PX milliseconds 等同于 PSETEX key milliseconds value
NX:只在键不存在的时候,才对键进行设置操作。 SET key value NX 等同于 SETNX key value
XX:只在键已经存在的时候,才对键进行设置操作
三、示例

set lock-key value3 EX 100 NX

当 "lock-key" 不存在时进行设置,同时设置超时时间为100s(将SETNX和EXPIRE合二为一)
SET操作成功后,返回的是OK,失败返回NIL

posted @ 2021-03-05 17:01  马宝云  阅读(72)  评论(0编辑  收藏  举报