SETNX是真正的原子?

时间:2018-02-10 01:45:49

标签: redis

Redis有SETNX命令。

我阅读了文档。但是,它没有明确说明它是否是原子的。

我读过它不建议用于分布式锁。但是,我的情况稍微简单一些。所有我需要确保谁先来(第一个调用者)设置值,第二个调用者收到错误(SETNX将返回0)。

所以,问题是,它真的是原子的吗?

2 个答案:

答案 0 :(得分:4)

是的,SETNX是原子的,无论有多少来电者都会按照您的要求行事。

单个Redis命令基本上都是原子的,因为Redis是单线程的。因此,文档并不打算为每个命令指定。 (也许最直接的引用来自FAQ的第一行:“Redis是键值DB中不同的演化路径,其中值可以包含更复杂的数据类型,并在这些数据类型上定义原子操作。 “)

在设置和释放锁定时,您不再需要处理单个命令,因此这就是为什么还有其他注意事项。但是SETNX命令本身就是原子的。

答案 1 :(得分:0)

如果需要执行原子操作,可以使用MULTIEXEC将命令分组到事务中,此时所有命令都是原子的。
您可以在他们的网站上阅读更多内容:https://redis.io/topics/transactions

请务必阅读整篇文档,因为有一些关于失败的重要说明。

  

重要的是要注意即使命令失败,队列中的所有其他命令也会被处理 - Redis将停止处理命令。