一、依赖命令
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,感兴趣的朋友可以去了解一下。