11

REDISに次のことを実行できるクイックコマンドはありますか?

キーYの値をキーXの値と等しく設定したい。

Redisクライアントからこれを行うにはどうすればよいですか。

標準のRedis-cliクライアントを使用しています。

基本的に私は次のものに相当するものを探しています-

 Y.Val() = X.Val()
4

4 に答える 4

14

これはLuaスクリプトで実行できます。

redis.call('SET', KEYS[2], redis.call('GET', KEYS[1])); return 1;
  1. KEYS1はソースキーです
  2. KEYS2はターゲットキーです

以下の例では、SCRIPT LOADを使用してスクリプトを作成し、EVALSHAを使用してスクリプトを呼び出し、次の引数を渡します。

  1. スクリプトロードから返されたSHA1
  2. 渡されるキーの数は2
  3. ソースキー
  4. ターゲットキー。

出力:

redis 127.0.0.1:6379> set src.key XXX
OK
redis 127.0.0.1:6379> get src.key
"XXX"
redis 127.0.0.1:6379> SCRIPT LOAD "redis.call('SET', KEYS[2], redis.call('GET', KEYS[1])); return 1;"
"1119c244463dce1ac3a19cdd4fda744e15e02cab"
redis 127.0.0.1:6379> EVALSHA 1119c244463dce1ac3a19cdd4fda744e15e02cab 2 src.key target.key
(integer) 1
redis 127.0.0.1:6379> get target.key
"XXX"

単にGETを実行してからSETを実行する場合と比較すると、多くの作業が行われているように見えますが、スクリプトをロード(およびSHA1を記憶)すると、スクリプトを繰り返し再利用できます。

于 2012-06-06T13:45:50.247 に答える
11

スクリプトをロードしたくない場合は、以下が単一のコマンドとして機能します。

   127.0.0.1:6379> eval "return redis.call('SET', KEYS[2], redis.call('GET', KEYS[1]))" 2 key1 key2
   OK

key1値はすでに設定されている必要があることに注意してください。設定されていない場合、以下のエラーが発生します

Lua redis()コマンドの引数は文字列または整数である必要があります

だから、以下のようにチェックして設定してください

127.0.0.1:6379> GET key1
(nil)
127.0.0.1:6379> SET key1 hello
OK

今それは動作します。

マップを別の新しいマップキーにコピーする場合

eval "return redis.call('HMSET', KEYS[2], unpack(redis.call('HGETALL', KEYS[1])))" 2 existingMapKey newMapKey



もう1つの方法は、時間自体を挿入するときに、MSETを使用して2つのキーに値を挿入できることです。

redis> MSET key1 "Hello" key2 "Hello"
"OK"
redis> GET key1
"Hello"
redis> GET key2
"Hello"

多くの場合、これでは、キーがすでに作成されている場合のコピーの問題は解決されません。

また、複数のキーが同じ値オブジェクトを参照していることを再確認する方法がないことにも注意してください。これらすべての回避策は、重複する値オブジェクトを作成します。したがって、値の1つが更新されても、別の値オブジェクトには反映されません。

于 2017-10-11T07:32:41.397 に答える
3

6.2.0以降、COPYコマンドがあります。

https://redis.io/commands/copy

于 2021-04-06T12:30:26.280 に答える
1

いいえ、これを行うための簡単なコマンドはありません。GETソースキーSETの値、次に新しいキーの値を指定する必要があります。

ソース: http: //redis.io/commands#string

于 2012-06-05T03:38:49.567 に答える