我通过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。这可能吗?
答案 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
希望能回答你的问题。