redis:原子LPOP和SADD可能吗?

Tim*_*ite 7 queue list set redis

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

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

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

redis> MULTI
OK
redis> LPOP workqueue
"foobar"
redis> SADD inprog "foobar"
redis> EXEC
Run Code Online (Sandbox Code Playgroud)

Sri*_*nan 5

为什么你希望你的"进行中"集合成为一个集合?您可以简单地使用列表作为进行中的项目.

命令RPOPLPUSH "Right Pop,Left Push"完全是针对此用例而制作的.

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

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

  • 因为一组似乎更合适的数据结构.由于我可能有多个工作进程添加到"进行中"结构,我认为从"进行中"列表中完成/删除项目将更加困难和效率更低(即,动态索引作为项目被推送/弹出).但我刚刚注意到列表的LREM命令,这将起作用,因为我的所有项目都是唯一的.但是,删除项目的效率仍然较低:在这种情况下,SREM为O(1),LREM为O(n),其中n是列表的长度. (3认同)