7

无论如何从列表中自动弹出一个项目并将其添加到集合中?

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

我希望它是原子的,以便从列表中弹出的任何内容都将始终在集合中。我只是不知道如何使用 MULTI/EXEC 来做到这一点,即:

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

2 回答 2

5

为什么您希望您的“进行中”收藏成为一个集合?您可以简单地将列表用于进行中的项目。

命令RPOPLPUSH “Right Pop, Left Push” 正是针对这个用例制作的。

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

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

于 2012-08-27T07:52:46.437 回答
1

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

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

于 2012-08-27T00:38:19.377 回答