List 如何在redis中加入两个列表

List 如何在redis中加入两个列表,list,redis,List,Redis,简介 我试图做一些听起来很简单的事情,但到目前为止我还没有找到答案。我在redis 2.6.4独立服务器(无群集)中有2个列表: 问题 我需要将这些列表连接起来,生成如下内容: list3 = list1 + list2 list3 = [4, 5, 6, 1, 2, 3] <- I need to preserve order, list1 and then list 2 list4 = list2 + list1 list4 = [1, 2, 3, 4, 5, 6] list3

简介

我试图做一些听起来很简单的事情,但到目前为止我还没有找到答案。我在redis 2.6.4独立服务器(无群集)中有2个列表:

问题

我需要将这些列表连接起来,生成如下内容:

list3 = list1 + list2

list3 = [4, 5, 6, 1, 2, 3] <- I need to preserve order, list1 and then list 2

list4 = list2 + list1

list4 = [1, 2, 3, 4, 5, 6]
list3=list1+list2

list3=[4,5,6,1,2,3]安全地执行此操作的最简单方法是使用LUA脚本,这样可以保证生成的列表不会丢失任何元素(并且可以轻松地保留顺序)


如果LUA不是一个选项,那么您需要在客户端执行此操作,并使用监视这些键进行更改(请参阅redis中的事务和监视命令)

以下是使用LUA的redis命令:

eval "for i,l in ipairs(ARGV) do for i,v in ipairs(redis.call('lrange',l,0,-1)) do redis.call('rpush',KEYS[1],v) end end" 1 list3 list1 list2
  • 作为一个额外的好处,您可以指定任意数量的列表添加到您的主列表中,只需在末尾添加更多的列表键

我理解,但即使使用LUA,唯一的选择就是循环遍历其中一个列表中的所有项目,并将其复制到另一个列表中?LUA是这里的一个选项是的,最终它将是一个O(N)操作,您需要连接的列表有多大?我有几个列表的总大小为1600-1800万个项目,其余的列表的总大小为100-300万个项目。每个列表只包含ID,不包含整个对象,但问题几乎相同,我找不到一个O(1)操作来加入列表。对于组合大小,我指的是我试图加入的两个列表的大小之和。那么你就有问题了。另一种选择是不复制数据,而只是跟踪concats(例如_list1=[1,2,3];list1=[''list1',];当您想在list3中concat list1和list2时,您需要将list3创建为[''u list1',''.'''''.'')。您的客户端需要足够聪明来处理这个间接过程,并且能够遍历不同的列表
eval "for i,l in ipairs(ARGV) do for i,v in ipairs(redis.call('lrange',l,0,-1)) do redis.call('rpush',KEYS[1],v) end end" 1 list3 list1 list2