gpt4 book ai didi

ruby-on-rails - Redis gem watch 和 unwatch 的困惑

转载 作者:行者123 更新时间:2023-12-03 06:44:24 25 4
gpt4 key购买 nike

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

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

    最佳答案

    我不是 Ruby 也不是 Redis 专家。
    虽然通过阅读有关事务的 Redis 文档 https://redis.io/topics/transactions我们了解到,被监视的 key 在两种情况下不被监视:或者在使用 EXEC 之后。 (然后交易完成)或通过 UNWATCH。
    所以确实有理由使用 UNWATCH。如果未调用多 block ,则也不调用 EXEC。然后 key 永远不会被刷新。
    我也认为包含 redis.unwatch 的条件位确实可以被调用。如redis.get("key") == "some value"似乎纯粹是任意的,基本上是代码设计。
    很可能是redis.get("key") > "some value"例如。
    (此外,似乎将一个 block 传递给 watch 不会根据文档自动取消监视 key ,因为该 block 是可选的)
    对于您的第二个问题,您是正确的,您似乎无法取消关注特定键。虽然 redis.unwatch似乎工作正常。
    这似乎不是 Ruby 设计。监视 key 仅对处理原子事务有用,当事务成功或中止时,将监视的 key 留在我们身后是没有意义的。
    我在 Redis 文档 https://redis.io/topics/transactions 中没有看到任何使用 UNWATCH 的示例但是在事务 block 之后刷新每个键感觉很自然。

    关于ruby-on-rails - Redis gem watch 和 unwatch 的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64693091/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com