Redis:如何将一个键设置为等于另一个键的值?

时间:2012-06-05 03:32:20

标签: database redis

REDIS中是否有快速命令允许我执行以下操作

我想将键Y的值设置为等于键X的值。

如何从Redis客户端执行此操作。

我使用标准的Redis-cli客户端。

基本上我正在寻找以下的一些 -

 Y.Val() = X.Val()

4 个答案:

答案 0 :(得分:11)

您可以使用Lua脚本执行此操作:

redis.call('SET', KEYS[2], redis.call('GET', KEYS[1])); return 1;
  1. KEYS1是源键
  2. KEYS2是目标密钥
  3. 下面的示例使用SCRIPT LOAD创建脚本并使用EVALSHA通过以下参数调用它:

    1. 从脚本加载返回的SHA1
    2. a 2表示将传递的密钥数
    3. 源密钥
    4. 目标键。
    5. 输出:

      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 :(得分:5)

如果您不想加载脚本,那么下面将作为单个命令工作。

   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



另一种方法是在插入时间本身时,您可以使用MSET将值插入两个键。

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

Ofcource这不会解决已经创建密钥时的复制问题。

另请注意,redis中没有办法使用多个键引用相同的值对象。所有这些解决方法都将创建重复的值对象。因此,如果其中一个值更新,则不会反映在另一个值对象中。

答案 2 :(得分:1)

不,没有快速命令来执行此操作。您必须GET源密钥的值,然后SET新密钥的值。

来源:http://redis.io/commands#string

答案 3 :(得分:0)

从 6.2.0 开始,您有一个 COPY 命令:

https://redis.io/commands/copy