setnx,setex

其他网址

​分布式锁​

setex

这个命令类似于以下两个命令:

SET key value
EXPIRE key seconds # 设置生存时间

不同之处是,​​SETEX​​ 是一个原子性(atomic)操作,关联值和设置生存时间两个动作会在同一时间内完成,该命令在 Redis 用作缓存时,非常实用。

setnx

简介

    将 key 的值设为 value ,当且仅当 key 不存在。若给定的 key 已经存在,则 SETNX 不做任何动作。SETNX 是『SET if Not eXists』(如果不存在,则 SET)的简写。

setnx容易产生死锁问题

原因

        setnx不能一条命令里设置超时时间,如果要设置超时时间,需要:setnx key value; expire key seconds,这样就不是原子性的了。如果第一条命令执行成功,第二条命令执行失败(比如:第一条执行成功后,Redis挂了),那就会导致key一直存在,导致死锁。

解决方法 

法1:​使用SET key value [EX seconds] [PX milliseconds] [NX|XX],一条命令同时设置nx与超时时间。

法2:​将setnx key value; expire key seconds写到lua脚本里,保证原子性。