在Redis中,如何更新一个键并重置原始的TTL?

7
我正在使用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。这是否可能?

3个回答

8

只需使用两个命令:一个 SET 命令更新值,然后再使用一个 EXPIRE 命令来更新 TTL 。

更新:要检索原始的 TTL ,您必须将其存储在单独的键中。据我所知,您可以获取当前的 TTL ,但无法获取其初始值。

因此,在伪代码中它应该像这样(REDIS 命令大写):

SET myKey value
EXPIRE myKey 3600
SET myKey:ttl 3600

将TTL固定为3600秒

然后

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

更新2:

Agis的建议使用SETEX可以改善我的回复,它可以在一次操作中为给定的键设置一个值和它的过期日期。所以代码变成了:

SETEX myKey 3600 value
SET myKey:ttl 3600

将TTL固定为3600秒

然后

ttlvalue = GET mykey:ttl
SETEX myKey ttlvalue newValue

更新该值并重置其TTL


没错 - 但我需要获取插入键时设置的原始TTL,以便将其重置为原始值。 - asolberg
我第一次阅读时并没有理解这个。我更新了我的答案。 - Pascal Le Merrer
@asolberg:我改进了答案。 - Pascal Le Merrer

4
你可以在代码中定义初始TTL值的常量,并在每次设置键时使用它。然后使用 SETEX 来同时设置键的值和过期时间:
define('TTL', 120); // 2 minutes
redis->setex($key, TTL, $new_value);

Redis中相应的命令如下:
> SETEX mykey 120 "myvalue"

如果您想以毫秒为单位设置时间而不是秒,请使用PSETEX

0

从您的标签中我看到 php 因此您的代码可能是:

    $id = 3453451244;
    $int = 1;
    if ($redis->get("active:$id") === false) {
    $redis->set("active:$id", $int);
    $redis->expire("active:$id", 86400);
  } else {
    $_timePassed = $redis->ttl("active:$id");
    $redis->set("active:$id", $redis->get("active:$botid") + 1);
    $redis->expire("active:$id", $_timePassed);
  }

说明: 首先为我设置键和其过期时间,我将其设置为一天,您可以使用以下代码:

function seconds2human($ss) {
$s = $ss%60;
$m = floor(($ss%3600)/60);
$h = floor(($ss%86400)/3600);
$d = floor(($ss%2592000)/86400);
$M = floor($ss/2592000);

return "$M months, $d days, $h hours, $m minutes, $s seconds";
}

将秒转换为 $M 个月,$d 天,$h 小时,$m 分钟,$s 秒

第二点: 您必须将 ttl 保存在一个变量中..($_timePassed) 并使用 set&expire 来设置您的新值...

如果您想重置为原始时间,只需更改 ($_timePassed) 变量为您的原始时间(以秒为单位)

$_timePassed = 86400; // 1 day

我在 PHP 中使用这个 Redis 库: https://github.com/phpredis/phpredis#expire-settimeout-pexpire

希望这回答了你的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接