【问题标题】:Redis gem watch and unwatch confusionRedis gem watch 和 unwatch 的困惑
【发布时间】:2021-02-17 21:59:32
【问题描述】:

根据 redis-rb ruby​​ gem 文档;

redis.watch("key") do
 if redis.get("key") == "some value"
  redis.multi do |multi|
   multi.set("key", "other value")
   multi.incr("counter")
  end
 else
  redis.unwatch
 end
end

我对此有两个问题;

  1. 为什么需要 unwatch 行?我的想法是,如果 key == "some value",则将 "key" 设置为其他值,如果在调用 EXEC 时 "key" 没有改变,则增加计数器。在我看来, else 语句在这种情况下永远不会被执行。如果您在没有 else/unwatch 的情况下运行此代码,则返回 nil。
  2. 如果 redis.watch "key" 输入时没有块 (redis.watch "key");为什么我无法取消监视特定键?我得到(错误数量的参数(给定 1,预期为 0))??

这是 ruby​​ gem 的链接https://github.com/redis/redis-rb

【问题讨论】:

    标签: ruby-on-rails ruby redis


    【解决方案1】:

    我不是 Ruby 或 Redis 专家。

    尽管通过阅读此处https://redis.io/topics/transactions 的有关事务的 Redis 文档,我们了解到受监视的密钥以两种方式不受监视:使用 EXEC 之后。 (然后交易完成)或通过 UNWATCH。

    所以确实有理由使用 UNWATCH。如果未调用多块,则也不调用 EXEC。然后密钥永远不会被刷新。

    另外我认为包含redis.unwatch 的条件位确实可以被调用。正如redis.get("key") == "some value" 似乎纯粹是任意的,基本上是一种代码设计。 例如,它很可能是redis.get("key") > "some value"

    (此外,根据文档,似乎将一个块传递给 watch 并不会自动 UNWATCH 密钥,因为该块是可选的)

    对于您的第二个问题,您是正确的,您似乎无法取消关注特定键。虽然redis.unwatch 似乎工作正常。

    这似乎不是 Ruby 设计。监视键仅在处理原子事务时有用,当事务成功或中止时,将监视的键留在我们身后是没有意义的。

    我在 Redis 文档 https://redis.io/topics/transactions 中没有看到任何使用 UNWATCH 的示例,但在事务块之后刷新每个键感觉很自然。

    【讨论】:

    • 我不确定我的第一个问题是否清楚;我用“key”=“some value”运行代码,当存在“else unwatch”时,代码返回“key”=“other value”,当不存在“else unwatch”时(尽管没有被执行)代码返回零。 github.com/redis/redis-rb
    • 这很奇怪,因为我得到redis.get 'key' 在这两种情况下都返回"other value"。要么elseredis.unwatch要么不。
    • 确实很奇怪。我刚刚测试了它,它似乎工作正常。可能是昨晚打错字或环境有什么奇怪的地方。我会更多地研究它,但可能会奖励你解决方案。非常感谢您的意见!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 2018-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多