いくつかの値を持つRedisリストがあります
LRANGE LIST 0 -1
> 1
> 2
> 3
RPUSH
そして、これらの値を別のリストに入れたいと思います。これはどのように行うことができますか?とで試してみましたが、結果がMULTI
ありEXEC
ません。
いくつかの値を持つRedisリストがあります
LRANGE LIST 0 -1
> 1
> 2
> 3
RPUSH
そして、これらの値を別のリストに入れたいと思います。これはどのように行うことができますか?とで試してみましたが、結果がMULTI
ありEXEC
ません。
サーバー側の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"
キーを新しいキーに移動する場合は、RENAMEコマンドを使用できます。これは、キー名を変更するだけですRENAME COMMAND
このアプローチ
> 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
コマンドを複数回LPUSH
使用して、それらを1つのリストから別のリストに移動できます。RPOPLPUSH
RPOPLPUSH old_list new_list
RPOPLPUSH old_list new_list
RPOPLPUSH old_list new_list
もちろん、これをクライアントプログラムまたはスクリプトで実行することもできますが、リストのすべてのメンバーを別のリストに移動する方法はありません。