【问题标题】:Redis Multi-Set With a TTL带有 TTL 的 Redis 多集
【发布时间】:2013-05-07 15:48:54
【问题描述】:

在redis中有一个SETEX命令可以让我设置一个过期的key,有没有这个命令的多设置版本也有一个TTL?

MSETMSETNX 命令都没有这样的选项。

【问题讨论】:

  • 我的意思是..人们会想知道这在 2018 年怎么还不存在。
  • 又过了一年,想知道 2019 年 :(
  • 2020 年也是如此......
  • 2021 赛喜...
  • 2021(几乎)三月也打招呼。

标签: redis key-value-store ttl


【解决方案1】:

我也在找这种手术。我没有找到任何东西,所以我用 MULTI/EXEC 做了:

MULTI
expire key1
expire key2
expire key3
EXEC

【讨论】:

  • 我最终也是这样做的。
  • 可能很慢,如何在java上执行
【解决方案2】:

有一个 issue 可以追溯到 2012 年。对于想知道为什么不实施它的人。

很遗憾,我们不会添加更多可以在多个键上运行的命令,因为它们本来就很难分发。相反,为您想要过期的每个密钥显式调用 EXPIRE 更容易分发(如果需要,您可以将每个命令路由到不同的服务器)。如果您想以原子方式 EXPIRE 密钥,您可以将多个调用包装在一个 MULTI/EXEC 块中。


顺便说一句,如果不需要transaction,请尝试使用pipeline 而不是MULTI/EXEC 来代替better performance

流水线不仅仅是一种减少与往返时间相关的延迟成本的方法,它实际上还大大提高了您在给定 Redis 服务器中每秒可以执行的操作数量。

【讨论】:

    【解决方案3】:
    EVAL "<multi_ttl_script>" N key1 key2 ... value1 ttl1 value2 ttl2 ...
    

    【讨论】:

      【解决方案4】:

      很遗憾,我们无法使用 mset 设置过期时间,这是为使用 nodejs 和 redis lib 的用户提供的解决方案:

      // expires the key at next mid-night
      let now = moment()
      let endOfDay = moment().endOf('day')
      let timeToLiveInSeconds = endOfDay.diff(now, 'seconds')
      
      redisClient.expire(keyName, timeToLiveInSeconds)
      

      希望对你有帮助

      【讨论】:

      • 这是一个关于 Redis 的问题,而不是关于 Node.js 的问题。我认为几乎所有登陆此页面的人都知道 EXPIRE 命令存在:redis.io/commands/expire
      猜你喜欢
      • 2018-03-03
      • 2021-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-13
      相关资源
      最近更新 更多