如何在Redis中从一个列表复制值到另一个列表?

8

我有一个Redis列表,其中包含一些值

LRANGE LIST 0 -1
> 1
> 2
> 3

我想将这些值RPUSH到另一个列表中。如何实现?我尝试使用MULTIEXEC,但没有结果。

5个回答

11

使用服务器端的Lua脚本比使用WATCH/MULTI/EXEC块来实现这种操作更加方便。

以下是一个示例脚本,它以两个列表(源和目标)作为参数,并使用两个整数定义源列表中的范围,然后将相应的项目推送到目标列表中。

> rpush foo 1 2 3 4
(integer) 4
> rpush bar x
(integer) 1
> eval "local res = redis.call( 'lrange', KEYS[1], ARGV[1], ARGV[2] ); return redis.call( 'rpush', KEYS[2], unpack(res) ); "  2  foo bar 0 -1
(integer) 5
> lrange bar 0 -1
1) "x"
2) "1"
3) "2"
4) "3"
5) "4"

这是一个很好的回答。然而,RENAME 正是我正在寻找的。无论如何,我会将此收藏夹保存下来,因为我相信我将来会用到它。 - amb
正如我所预料的那样,我已经使用这个答案在Redis中进行了一些脚本编写。谢谢Didier! - amb
非常有帮助!谢谢! - zhuguowei

4

如果您想将键移动到新键中,可以使用RENAME命令,它只会更改键的名称。RENAME命令


谢谢。在这种情况下,重命名已经足够了。 - amb

2

这种方法

> eval "local res = redis.call( 'lrange', KEYS[1], ARGV[1], ARGV[2] ); return redis.call( 'rpush', KEYS[2], unpack(res) ); "  2  foo bar 0 -1

当列表过长时,可能会产生“拆包结果太多”的错误。

以下是一个可解决该问题的脚本。

-- @desc:   copies a list with POP and PUSH
-- @usage:  redis-cli --eval copy_list_with_popnpush.lua <source> <dest>

local s = KEYS[1]
local d = KEYS[2]
local l = redis.call("LLEN", s)
local i = tonumber(l)

while i > 0 do
  local v = redis.call("RPOPLPUSH", s, s)
  redis.call("LPUSH", d, v)
  i = i - 1
end

return l

一些其他很棒的脚本 https://gist.github.com/itamarhaber/d30b3c40a72a07f23c70


0

这对列表不起作用,只对集合有效。很遗憾。 - ice1080

-1

您可以将它们从一个列表移动到另一个列表,并使用RPOPLPUSH命令多次进行LPUSH

RPOPLPUSH old_list new_list
RPOPLPUSH old_list new_list
RPOPLPUSH old_list new_list

当然,您可能希望在客户端程序或脚本中执行此操作,但我找不到将列表的所有成员移动到另一个列表的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接