Redis的set命令是原子操作吗?

18

我试图使用Redis的set命令来实现一个最简单的分布式锁组件,但是我在官方文档中找不到有关原子性的确切依据,那么Redis的SET key value [EX seconds] [PX milliseconds] [NX|XX]命令是否是原子操作呢?

1个回答

40

是的,核心是单线程的,因此在 SET 完成之前,没有什么 会运行;这使得 SET {key} {value} EX {expiry} NX 成为简单锁定的理想选择。


一个 SET 会阻塞同一数据库中的其他键的 所有 操作吗? - Matthew
@Matthew 所有操作都会简要地阻塞(不是很准确的词),所有其他操作;核心是单线程的,但速度非常快。 - Marc Gravell
我担心控制Redis操作的代码!哈哈,为什么“block” 不是正确的词? - Matthew
2
@Matthew 因为我不是指通常数据库意义上的“阻塞”(block),即一项操作对特定数据进行某种锁定(页面锁定、行锁定等);这里没有锁定——只有一个单线程,这意味着它只能处理一个事务;这就是为什么需要原子操作的操作应该使用lua(EVAL/EVALSHA)或MULTI/EXEC批处理,或者(最好的选择)内置的原子操作;在这个问题的情况下,SETEXNX执行几个不同的操作(检查存在性、设置值、设置过期时间),所有这些操作都在一个原子操作中完成。 - Marc Gravell
明白了。虽然我认为“阻塞”在这里是一个合适的术语。 - Matthew
以上仅适用于单个主实例。请参考此文档以获取不同语言中的一些实现库。https://redis.io/topics/distlock - Jack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接