【问题标题】:Redis : How to set one key equal to the value of another key?Redis:如何设置一个键等于另一个键的值?
【发布时间】:2012-06-09 02:39:54
【问题描述】:

REDIS 中是否有任何快速命令可以让我执行以下操作

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

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

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

基本上我正在寻找以下等价物-

 Y.Val() = X.Val()

【问题讨论】:

  • 此问题的答案仅限于复制 STRING 类型的键。但是,从 Redis 2.6 开始,更通用的解决方案是使用 DUMPRESTORE 命令来完成这项工作。详情请查看this

标签: database redis


【解决方案1】:

您可以使用 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 然后 s SET 相比,它确实看起来有很多东西,但是一旦您加载了脚本(并记住了 SHA1),您就可以重复使用它。

【讨论】:

    【解决方案2】:

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

       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"
    

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

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

    【讨论】:

      【解决方案3】:

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

      https://redis.io/commands/copy

      【讨论】:

      • 欢迎来到 SO。 SO 不接受仅链接的答案。请将此作为评论重新发布。
      【解决方案4】:

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

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

      【讨论】:

      • 当值像“hello world”这样简单时,就很容易使用get/set。但是当值在cli中复制粘贴比较复杂时,最好使用上面的lua解决方案。
      猜你喜欢
      • 2010-11-17
      • 1970-01-01
      • 2014-05-08
      • 1970-01-01
      • 2013-02-25
      • 2022-10-14
      • 2014-08-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多