小编典典

从Redis集或列表中取出多个项目的有效方法是什么,以保证收到的数量

redis

我有列表(如果那是唯一的方法,它可以是一个集合)。我连接了许多客户端,该列表将一次被外部填充。

我需要一种有效的方法来将列表中的 N个 项目作为一个批次批量处理。我不在乎它以哪个客户端结尾,只是被推入列表的前 N个
项目最终以一个客户端结尾,而下一个 N 可能以另一个客户端(或相同端点)结尾。

我真的不确定如何使用列表来实现这一点,我可以阻止流行音乐,但一次只能阻止一个。我真的更希望从列表中订购。

我当时想我可以使用集,让所有客户都使用SCARD来打Redis。当他们检测到计数为=>时,将为N进行SPOP。这应该使我至少有一个客户端被N填充,并且每个收到少于N的客户端都将它们返回到集合中。

我要重复SCARD的事实让我感到非常难过,并且使事情变得不可靠。

还有更多支持这种流程的东西,或者更干净的算法(理想情况下有列表)?


阅读 392

收藏
2020-06-20

共1个答案

小编典典

您可以将逻辑包装到Lua脚本中,以确保客户端获得N顺序项目。

local key = KEYS[1]
local N = tonumber(ARGV[1])

local size = redis.call("llen", key)

if size < N then return {} end    -- ensure that there're at least N items

local res = {}
for i = 1, N do                   -- get N items in a transaction
    res[i] = redis.call("lpop", key);
end

return res
2020-06-20