Ruby on rails Redis gem手表和unwatch混乱
根据redis rb ruby gem文档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.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
关于这一点,我有两个问题
这里有一个指向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
要么不使用。真奇怪。我刚刚测试过,它似乎很好用。可能是昨晚的打字错误,或者是环境有点奇怪。我将进一步研究,但很可能会奖励您解决方案。非常感谢您的投入!