EVAL与WATCH/GET/MULTI/EXEC的区别

3
我已经阅读了 EVAL 的文档,其中提到 "Redis 保证脚本的执行是原子性的:在执行脚本时不会执行任何其他脚本或 Redis 命令。"
我也了解了使用 WATCH/GET/MULTI/EXEC 实现的乐观锁事务。现在我有一个关于这两种构建之间并发性差异的问题。
听起来如果我想要读取多个键、进行一些耗时的计算(比如解析几百 KB 的 JSON 并做出一些决策),然后写回结果,如果我使用 EVAL,我将阻塞对 Redis 数据库的所有请求,即使那些与我交互的键不属于这个集合。
另一方面,如果我使用 WATCH 方法,我将需要构建重试逻辑,但如果我正在监视100万个键中的100个键,则只需要担心其他客户端与这100个键交互,而不会在整个期间阻塞数据库,只会在 EXEC 调用期间阻塞吗?
请告诉我我的理解是否正确,如果我漏掉了什么,请给我任何澄清。
1个回答

4

你的理解是无可挑剔的 :)

然而,你应该考虑一点,那就是使用 EVAL 可以节省网络带宽和延迟,因为所有操作都是在服务器端完成的。我并不是建议这个理由单独就足以支持 EVAL,特别是如果你正在对数据进行大量处理,正如你的问题所暗示的那样,但你应该牢记这个考虑因素。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接