8

我有一个包含一些值的 Redis 列表

LRANGE LIST 0 -1
> 1
> 2
> 3

我想把RPUSH这些值放到另一个列表中。如何才能做到这一点?我试过用MULTIand来做EXEC,但没有结果。

4

5 回答 5

10

服务器端 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"
于 2013-02-21T09:26:35.370 回答
4

如果要将密钥移动到新密钥,可以使用 RENAME 命令,只会更改密钥名称RENAME COMMAND

于 2013-02-21T09:53:10.683 回答
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

于 2020-11-02T08:18:40.537 回答
0

联合商店

SUNIONSTORE new_set old_set

https://redis.io/commands/sunionstore

于 2019-12-20T10:23:56.157 回答
-1

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

RPOPLPUSH old_list new_list
RPOPLPUSH old_list new_list
RPOPLPUSH old_list new_list

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

于 2020-01-29T10:39:58.113 回答