redis:原子LPOP和SADD可能吗?

时间:2012-08-27 00:26:01

标签: list queue redis set

无论如何以原子方式弹出列表中的项目并将其添加到集合中?

我的案例场景是我有一个独特项目的“工作队列”列表,我想在“进行中”集合中跟踪正在处理的内容。如果我的工作进程在处理项目时崩溃,这也可以允许“进行中”设置中的项目重新排队。

我更喜欢它是原子的,所以从列表中弹出的任何东西都会在集合中。我无法弄清楚如何使用MULTI / EXEC执行此操作,即:

redis> MULTI
OK
redis> LPOP workqueue
"foobar"
redis> SADD inprog "foobar"
redis> EXEC

2 个答案:

答案 0 :(得分:5)

为什么你希望你的“进行中”集合成为一个集合?您只需使用列表作为进行中的项目。

命令RPOPLPUSH“Right Pop,Left Push”完全针对此用例。

  

以原子方式返回并删除列表的最后一个元素(尾部)   存储在源头,并将元素推到第一个元素(头部)   存储在目的地的列表

如果您确实要为正在进行的项目使用Set,则必须使用lua脚本并使用eval进行调用。

答案 1 :(得分:1)

似乎MULTI / EXEC不起作用,因为第二个命令取决于第一个命令的返回值,但是在调用EXEC之前,这两个命令都不会执行。如果您使用的是Redis 2.6(目前在RC中),则可以通过eval使用lua脚本。

总的来说,我不认为原子性在这里是一个很大的问题。在这种情况下,没有真正的竞争条件。唯一可能发生的坏事是,如果服务器在从队列中弹出项目并将其添加到集合之间的时间内崩溃,这似乎不太可能。