【问题标题】:How can I set the expire time in Redis' ruby client when using mapped_mset?使用 mapped_mset 时如何在 Redis 的 ruby​​ 客户端中设置过期时间?
【发布时间】:2023-04-02 17:47:01
【问题描述】:

我正在尝试使用

redis.mapped_mset({ "f1" => "v1", "f2" => "v2" })

将多个密钥设置为Redis,我不能同时设置过期时间。 设置过期时间的唯一方法是:

set(key, value, options = {})

expire(key, seconds)

我必须打很多次电话,这不是我想看到的。 有没有其他方法可以解决这个问题?

【问题讨论】:

    标签: ruby-on-rails ruby redis


    【解决方案1】:

    Redis 本身does not support 带有过期参数的多重设置。 Redis#mapped_set 是调用mset 的句法糖,mset 本身是事务性调用后续set 多次的句法糖。

    因此,您唯一需要做的就是将对 set(... ex:...) 的后续调用包装到带有 Redis#multi 的事务中。

    【讨论】:

    • 感谢您的回答!
    • 但我不在乎这些set操作是否在同一个事务中,这是否意味着我可以不使用Redis#multi单独调用它们?
    • 您请求了一个等价的 mapped_mset 并过期。 mapped_mset 是一个事务性原子操作。如果您不希望它是原子的,请在没有 multi 的情况下调用它。
    • 我完全明白你的意思。我还要确认一件事,如果一个哈希参数包含 N 个键,redis 客户端会向服务器发送 N 个set 请求,对吧?
    • 我已经链接了从哪里获得答案的两个来源。不,由于 Redis 支持 mset 命令,ruby 包装器将向 Redis 发送 1 个 MSET 请求,Redis 将在内部作为事务集执行。
    【解决方案2】:

    您可以编写包装器方法来设置列表并添加过期时间。使用redis.multi 将其包装到事务模块中。

    def set_list(list, expire_in = 10)
      redis.multi do
        list.each{ |k, v| redis.set(k,v, ex: expire_in)}
      end
    end
    

    【讨论】:

      猜你喜欢
      • 2020-05-12
      • 1970-01-01
      • 2018-11-23
      • 2019-05-24
      • 2017-01-11
      • 1970-01-01
      • 2016-05-15
      • 2020-03-22
      • 2015-11-29
      相关资源
      最近更新 更多