这个场景相信大家都遇到过,其实我这里不想写具体代码逻辑,我主要说要实现这个策略,我们用到redis两个核心方法,即setNx和getSet。
注:redis的命令都是原子操作
1、SETNX
SETNX key value
可用版本: >= 1.0.0
时间复杂度: O(1)
只在键 key
不存在的情况下, 将键 key
的值设置为 value
。
若键 key
已经存在, 则 SETNX
命令不做任何动作。
SETNX
是『SET if Not eXists』(如果不存在,则 SET)的简写。
返回值
命令在设置成功时返回 1
, 设置失败时返回 0
。
代买事例
redis> EXISTS lockkey # lockkey不存在
(integer) 0
redis> SETNX lockkey "programmer" # lockkey 设置成功
(integer) 1
redis> SETNX lockkey "code-farmer" # 尝试覆盖 lockkey,失败
(integer) 0
redis> GET lockkey # 没有被覆盖
"programmer"
2、GETSET
GETSET key value
可用版本: >= 1.0.0
时间复杂度: O(1)
将键 key
的值设为 value
, 并返回键 key
在被设置之前的旧值。
返回值
返回给定键 key
的旧值。
如果键 key
没有旧值, 也即是说, 键 key
在被设置之前并不存在, 那么命令返回 nil
。
当键 key
存在但不是字符串类型时, 命令返回一个错误。
代码示例
redis> GETSET db mongodb # 没有旧值,返回 nil
(nil)
redis> GET db
"mongodb"
redis> GETSET db redis # 返回旧值 mongodb
"mongodb"
redis> GET db
"redis"
网友评论