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

时间:2014-03-06 18:03:52

标签: php redis

我通过PHPRedis与Redis进行交互(实际上是围绕PHPRedis构建的更高级别的包装器)。我想更新一个密钥并在数据库中重置它,但是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 个答案:

答案 0 :(得分:4)

只需使用两个命令:一个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在一次操作中为给定密钥及其到期日期设置值。所以它会变成:

SETEX myKey 3600 value
SET myKey:ttl 3600

将TTL修复为3600

然后

ttlvalue = GET mykey:ttl
SETEX myKey ttlvalue newValue

更新值并重置其TTL

答案 1 :(得分:1)

您可以在代码中的某个位置定义一个常量的初始TTL值,并在每次设置密钥时使用它。

然后使用SETEX将值设置为密钥的到期时间:

define('TTL', 120); // 2 minutes
redis->setex($key, TTL, $new_value);

Redis中的等效命令如下:

> SETEX mykey 120 "myvalue"

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

答案 2 :(得分: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

希望能回答你的问题。