Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在Redis中,如何更新密钥并重置原始TTL?_Php_Redis - Fatal编程技术网

Php 在Redis中,如何更新密钥并重置原始TTL?

Php 在Redis中,如何更新密钥并重置原始TTL?,php,redis,Php,Redis,我通过PHPRedis(实际上是围绕PHPRedis构建的更高级别的包装器)与Redis进行交互。我想更新一个密钥并在数据库中重置它,但是TTL应该在程序的当前点重置为原始值。我的类不知道原始TTL是什么 假设最初的TTL是12小时。我想这样做: redis->get($key) $original_ttl = // figure it out $new_value = something redis->set($key, $new_value, $original_ttl) 然后

我通过PHPRedis(实际上是围绕PHPRedis构建的更高级别的包装器)与Redis进行交互。我想更新一个密钥并在数据库中重置它,但是TTL应该在程序的当前点重置为原始值。我的类不知道原始TTL是什么

假设最初的TTL是12小时。我想这样做:

redis->get($key)
$original_ttl = // figure it out
$new_value = something
redis->set($key, $new_value, $original_ttl)

然后,我们以原始键引用一个新值和另一个12小时ttl结束。这可能吗?

只需使用两个命令:一个用于更新值的SET,然后一个用于更新TTL

更新:要检索原始TTL,必须将其存储在单独的密钥中。据我所知,你可以得到当前的TTL,但不能得到它的初始值

所以在伪代码中看起来是这样的(REDIS命令用大写字母表示):

将TTL修复为3600s

然后

SET myKey newValue
ttlvalue = GET mykey:ttl
EXPIRE myKey ttlvalue
ttlvalue = GET mykey:ttl
SETEX myKey ttlvalue newValue
更新2:

使用Agis建议使用SETEX可以改进我的回答,SETEX在一次操作中为给定的密钥设置一个值及其过期日期。因此,它将成为:

SETEX myKey 3600 value
SET myKey:ttl 3600
将TTL修复为3600s

然后

SET myKey newValue
ttlvalue = GET mykey:ttl
EXPIRE myKey ttlvalue
ttlvalue = GET mykey:ttl
SETEX myKey ttlvalue newValue

要更新该值并重置其TTL,您可以在代码中的某个常量中定义初始TTL值,并在每次设置键时使用它

然后使用设置密钥的值和过期时间:

define('TTL', 120); // 2 minutes
redis->setex($key, TTL, $new_value);
Redis中的等效命令如下所示:

> SETEX mykey 120 "myvalue"

如果要以毫秒而不是秒为单位设置时间,请使用。

正确-但我需要获取插入密钥时设置的原始TTL,以便将其重置为原始值。我在第一次阅读时不理解这一点。我更新了我的答案。@asolberg:我改进了答案