8

いくつかの値を持つRedisリストがあります

LRANGE LIST 0 -1
> 1
> 2
> 3

RPUSHそして、これらの値を別のリストに入れたいと思います。これはどのように行うことができますか?とで試してみましたが、結果がMULTIありEXECません。

4

5 に答える 5

10

サーバー側のLuaスクリプトは、この種の操作を実装するためにWATCH / MULTI/EXECブロックよりも便利です。

これは、パラメーターとして2つのリスト(ソースと宛先)を取り、ソースリストの範囲を定義する2つの整数を持つスクリプトの例です。次に、対応するアイテムを宛先リストにプッシュします。

> 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

SUNIONSTORE new_set old_set

https://redis.io/commands/sunionstore

于 2019-12-20T10:23:56.157 に答える
-1

コマンドを複数回LPUSH使用して、それらを1つのリストから別のリストに移動できます。RPOPLPUSH

RPOPLPUSH old_list new_list
RPOPLPUSH old_list new_list
RPOPLPUSH old_list new_list

もちろん、これをクライアントプログラムまたはスクリプトで実行することもできますが、リストのすべてのメンバーを別のリストに移動する方法はありません。

于 2020-01-29T10:39:58.113 に答える