redis中有两个列表,其中包含 l1 和 l2 键。 l2 保证不为空。我想弹出(读取和删除) l1 的第一个元素,如果它不为空,否则返回 l2 中的随机元素而不删除它。
有没有办法在不需要任何客户端技术,框架,逻辑或额外往返的情况下实现此行为?
答案 0 :(得分:2)
lpop在l1上如果没有返回任何元素,那么lpop在l2上 - 你把这些放在lua脚本中,所以你没有任何额外的往返:
local redis_list_member = redis.call('lpop', KEYS[1])
if not redis_list_member then
redis_list_member = redis.call('lpop', KEYS[2])
end
return redis_list_member
使用eval,您可以将脚本传递给redis,并将2个列表作为参数
答案 1 :(得分:2)
Liviu的答案很好,所以这基本上是相同的脚本,但是对于通过KEYS
表提供的任意数量的列表:
for _, k in pairs(KEYS) do
local m = redis.call('LPOP', k)
if m then
return m
end
end