【问题标题】:In Redis how would you update a key and reset the original TTL?在 Redis 中,您将如何更新密钥并重置原始 TTL?
【发布时间】:2014-04-09 13:24:27
【问题描述】:

我通过 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 的原始键。这可能吗?

【问题讨论】:

    标签: php redis


    【解决方案1】:

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

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

    所以它在伪代码中看起来像这样(REDIS 命令大写):

    SET myKey value
    EXPIRE myKey 3600
    SET myKey:ttl 3600
    

    将 TTL 固定为 3600s

    然后

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

    更新 2:

    使用 Agis 建议使用 SETEX 可能会改进我的回答,它在一次操作中为给定键设置一个值及其到期日期。所以它会变成:

    SETEX myKey 3600 value
    SET myKey:ttl 3600
    

    将 TTL 固定为 3600s

    然后

    ttlvalue = GET mykey:ttl
    SETEX myKey ttlvalue newValue
    

    更新值并重置其 TTL

    【讨论】:

    • 正确 - 但我需要获取插入密钥时设置的原始 TTL,以便我可以将其重置为原始值。
    • 初读时我不明白这一点。我更新了我的答案。
    • @asolberg:我改进了答案
    【解决方案2】:

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

    然后使用SETEX同时设置值和key的过期时间:

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

    Redis 中的等效命令如下:

    > SETEX mykey 120 "myvalue"
    

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

    【讨论】:

      【解决方案3】:

      我看到你的标签 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

      希望能回答您的问题。

      【讨论】:

        猜你喜欢
        • 2022-11-13
        • 1970-01-01
        • 2013-10-19
        • 1970-01-01
        • 2016-09-02
        • 1970-01-01
        • 2018-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多