EVAL与WATCH / GET / MULTI / EXEC

时间:2014-06-26 16:18:03

标签: redis

我已阅读有关EVAL的文档,其中指出“Redis保证脚本以原子方式执行:在执行脚本时不会执行其他脚本或Redis命令。”

我还读过关于使用WATCH / GET / MULTI / EXEC本质上是一个乐观锁定的事务。我现在有一个问题,关于这两种结构之间的并发性差异。

听起来好像我想读取一些键,做一个冗长的计算(比如解析几百KB的json,然后做出一些决定),然后回写结果,如果我使用EVAL我将阻止对redis数据库的所有请求,甚至那些与不与我将要交互的集合的一部分进行交互的密钥。

另一方面,如果我使用WATCH方法,我将需要构建重试逻辑,但如果我正在观看100个百万中的100个密钥,我只需要担心其他客户端与这100个密钥交互,我赢了实际上只是在EXEC调用期间阻塞整个数据库的数据库?

如果这种理解是正确的,请告诉我,或者如果我在这里遗漏了某些内容,请给我任何澄清。

1 个答案:

答案 0 :(得分:4)

你的理解是完美无缺的:)

然而,您应该考虑的一点是,EVALing可以节省网络带宽和延迟,因为一切都在服务器端完成。我并不是说这一点本身应该有利于它,特别是如果你正在对数据进行大量处理,如你所提出的那样,但你应该牢记这一点。