Redis有SETNX命令。
我阅读了文档。但是,它没有明确说明它是否是原子的。
我读过它不建议用于分布式锁。但是,我的情况稍微简单一些。所有我需要确保谁先来(第一个调用者)设置值,第二个调用者收到错误(SETNX将返回0)。
所以,问题是,它真的是原子的吗?
答案 0 :(得分:4)
是的,SETNX
是原子的,无论有多少来电者都会按照您的要求行事。
单个Redis命令基本上都是原子的,因为Redis是单线程的。因此,文档并不打算为每个命令指定。 (也许最直接的引用来自FAQ的第一行:“Redis是键值DB中不同的演化路径,其中值可以包含更复杂的数据类型,并在这些数据类型上定义原子操作。 “)
在设置和释放锁定时,您不再需要处理单个命令,因此这就是为什么还有其他注意事项。但是SETNX
命令本身就是原子的。
答案 1 :(得分:0)
如果需要执行原子操作,可以使用MULTI
和EXEC
将命令分组到事务中,此时所有命令都是原子的。
您可以在他们的网站上阅读更多内容:https://redis.io/topics/transactions
请务必阅读整篇文档,因为有一些关于失败的重要说明。
重要的是要注意即使命令失败,队列中的所有其他命令也会被处理 - Redis将不停止处理命令。