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

gee*_*ter 8 database redis

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

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

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

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

基本上我正在寻找以下相当于 -

 Y.Val() = X.Val()
Run Code Online (Sandbox Code Playgroud)

Nic*_*las 11

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

redis.call('SET', KEYS[2], redis.call('GET', KEYS[1])); return 1;
Run Code Online (Sandbox Code Playgroud)
  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"
Run Code Online (Sandbox Code Playgroud)

与简单地执行GET然后是SET相比,它确实看起来很多东西,但是一旦你加载了脚本(并记住了SHA1),你就可以重复使用它.


Kan*_*mar 6

如果您不希望脚本加载,则下面的命令将作为单个命令工作。

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

请注意,key1值应已设置,否则将出现以下错误

Lua redis()命令参数必须是字符串或整数

所以检查如下

127.0.0.1:6379> GET key1
(nil)
127.0.0.1:6379> SET key1 hello
OK
Run Code Online (Sandbox Code Playgroud)

现在它将起作用。

如果要将地图复制到另一个新地图密钥

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



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

redis> MSET key1 "Hello" key2 "Hello"
"OK"
redis> GET key1
"Hello"
redis> GET key2
"Hello"
Run Code Online (Sandbox Code Playgroud)

当然,当密钥已经创建时,这将不能解决复制问题。

另请注意,在Redis中,引用同一值对象的键最多不能超过一个。所有这些变通办法将创建重复的值对象。因此,如果其中一个值被更新将不会反映在另一个值对象中。


小智 6

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

https://redis.io/commands/copy