Вопрос по database – Redis: Как установить один ключ равным значению другого ключа?

5

Есть ли быстрая команда в REDIS, которая позволяет мне сделать следующее

Я хочу установить Значение ключа Y равным значению Ключа X

Как мне сделать это из Redis Client.

Я использую стандартный клиент Redis-cli.

В основном я ищу какой-то эквивалент следующего -

 Y.Val() = X.Val()
Ответы на этот вопрос ограничены дублированием ключа типа STRING. Однако, начиная с Redis 2.6, более общим решением является использованиеDUMP а такжеRESTORE Команды, чтобы сделать работу. Проверьтеthis для деталей. for_stack

Ваш Ответ

3   ответа
11

Вы можете сделать это с помощью скрипта Lua:

redis.call('SET', KEYS[2], redis.call('GET', KEYS[1])); return 1;
  1. KEYS1 is the source key
  2. KEYS2 is the target key

Пример ниже используетНАГРУЗКА НА СКРИПТ создать сценарий и вызывает его с помощьюEVALSHA передавая следующие аргументы:

  1. The SHA1 returned from the script load
  2. a 2 for the number of keys that will be passed
  3. The source key
  4. The target key.

Выход:

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), вы сможете использовать его повторно.

1

Нет, быстрой команды для этого нет. Ты долженGET значение исходного ключа, а затемSET значение нового ключа.

Источник:http://redis.io/commands#string

Когда значение просто, как "Привет, мир" тогда легко использовать get / set. Но когда значения сложны для копирования и вставки в cli, лучше использовать вышеуказанное решение lua.
4

Если вы не хотите загружать скрипт, то ниже будет работать как одна команда.

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

Обратите внимание, что значение key1 должно быть уже установлено, иначе вы получите ошибку ниже

Lua redis() command arguments must be strings or integers

Так что проверьте, как показано ниже и установите

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



Еще один способ - при вставке самого времени вы можете вставить значение в два ключа, используя MSET.

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

Конечно, это не решит проблему копирования, когда ключ уже создан.

Также обратите внимание, что в redis нет никакого способа, чтобы более чем один ключ ссылался на один и тот же объект значения. Все эти обходные пути создадут дубликаты объектов-значений. Поэтому, если одно из значений будет обновлено, оно не будет отражено в другом объекте значения.

Похожие вопросы