Ruby on rails Redis gem手表和unwatch混乱

Ruby on rails Redis gem手表和unwatch混乱,ruby-on-rails,ruby,redis,Ruby On Rails,Ruby,Redis,根据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.unwa

根据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
关于这一点,我有两个问题

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

  • 这里有一个指向ruby gem的链接

    我既不是ruby专家,也不是Redis专家

    虽然通过阅读Redis关于事务的文档,我们了解到监视的键在两种方式下是不可访问的:或者在使用EXEC之后。(然后事务完成)或通过UNWATCH

    因此,确实有理由使用UNWATCH。如果未调用multi块,则也不会调用EXEC。那么钥匙就永远不会被冲掉

    另外,我认为包含redis.unwatch的conditional位确实可以被调用。正如redis.get(“key”)=“some value”看起来完全是任意的,基本上是一种代码设计。 例如,它很可能是redis.get(“key”)>“some value”

    (另外,似乎将块传递给被监视对象并不会根据文档自动取消对键的锁定,因为该块是可选的)

    对于你的第二个问题,你是正确的,你不能取消一个特定的关键似乎。尽管redis.unwatch似乎工作正常

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


    我在Redis文档中没有看到任何使用UNWATCH的例子,但在事务块之后刷新每个键感觉很自然。

    我不是Ruby或Redis专家

    虽然通过阅读Redis关于事务的文档,我们了解到监视的键在两种方式下是不可访问的:或者在使用EXEC之后。(然后事务完成)或通过UNWATCH

    因此,确实有理由使用UNWATCH。如果未调用multi块,则也不会调用EXEC。那么钥匙就永远不会被冲掉

    另外,我认为包含redis.unwatch的conditional位确实可以被调用。正如redis.get(“key”)=“some value”看起来完全是任意的,基本上是一种代码设计。 例如,它很可能是redis.get(“key”)>“some value”

    (另外,似乎将块传递给被监视对象并不会根据文档自动取消对键的锁定,因为该块是可选的)

    对于你的第二个问题,你是正确的,你不能取消一个特定的关键似乎。尽管redis.unwatch似乎工作正常

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


    我在Redis文档中没有看到任何使用UNWATCH的例子,但在事务块之后刷新每个键感觉很自然。

    我不确定我的第一个问题是否清楚;我使用“key”=“some value”运行代码,当存在“else unwatch”时,代码返回“key”=“other value”,当不存在“else unwatch”时(尽管未执行),代码返回nil。这很奇怪,因为在这两种情况下,我都得到了
    redis.get'key'
    来返回
    “other value”
    。要么使用
    else
    redis.unwatch
    要么不使用。真奇怪。我刚刚测试过,它似乎很好用。可能是昨晚的打字错误,或者是环境有点奇怪。我将进一步研究,但很可能会奖励您解决方案。非常感谢您的投入!我不确定我的第一个问题是否清楚;我使用“key”=“some value”运行代码,当存在“else unwatch”时,代码返回“key”=“other value”,当不存在“else unwatch”时(尽管未执行),代码返回nil。这很奇怪,因为在这两种情况下,我都得到了
    redis.get'key'
    来返回
    “other value”
    。要么使用
    else
    redis.unwatch
    要么不使用。真奇怪。我刚刚测试过,它似乎很好用。可能是昨晚的打字错误,或者是环境有点奇怪。我将进一步研究,但很可能会奖励您解决方案。非常感谢您的投入!