我有一个带有一些值的Redis列表
LRANGE LIST 0 -1
> 1
> 2
> 3
我想将RPUSH
这些值放入另一个列表中。如何才能做到这一点?我尝试使用MULTI
和EXEC
,但没有结果。
答案 0 :(得分:6)
服务器端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"
答案 1 :(得分:3)
如果要将密钥移动到新密钥,可以使用RENAME命令,只会更改密钥名称RENAME COMMAND
答案 2 :(得分:0)
答案 3 :(得分:0)
您可以将它们从一个列表移动到另一个列表,然后使用LPUSH
命令多次RPOPLPUSH
将它们移动:
RPOPLPUSH old_list new_list
RPOPLPUSH old_list new_list
RPOPLPUSH old_list new_list
当然,您可能想在客户端程序或脚本中执行此操作,我无法找到将列表的所有成员移动到另一个列表的方法。
答案 4 :(得分:0)
这种方法
> 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