11

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

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

我该如何从 Redis Client 执行此操作。

我使用标准的 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. a 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),您就可以重复使用它。

于 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



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

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

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

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

于 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 回答