redis:从非空列表中弹出,否则返回其他列表的随机元素

时间:2015-08-03 20:04:11

标签: redis

redis中有两个列表,其中包含 l1 l2 键。 l2 保证不为空。我想弹出(读取和删除) l1 的第一个元素,如果它不为空,否则返回 l2 中的随机元素而不删除它。

有没有办法在不需要任何客户端技术,框架,逻辑或额外往返的情况下实现此行为?

2 个答案:

答案 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