redis 的 eval 怎么保证处理在多个集群上的 key 原子操作呢? 我这说法对吗?

2015-04-27 15:58:34 +08:00
 alphaqiu
redis 的 eval 怎么保证处理在多个集群上的key 原子操作呢? 我这说法对吗?
比如key1在master1上,key2在master2上
一段脚本正好在eval上执行,操作key1 和 key2,能保证原子操作吗?
11023 次点击
所在节点    Redis
5 条回复
canesten
2015-04-27 16:53:07 +08:00
参照redis官方文档的个人猜测:
首先redis官方建议你把lua脚本里所有要写的key用参数的方式传递进去
而不是hard code
redis会在执行前分析要涉及到key
然后按照类似于multi/exec的语义去执行脚本
在执行eval期间
redis是不响应其他指令的
如果你非得hard code写死
那只能说你的脚本是不兼容集群的

PS:还没用过3.0
不过看文档来说原理应该是这样的
luin
2015-04-27 17:01:39 +08:00
脚本中的所有键必须在 cluster 中的同一个节点中。要想让 script 能在 cluster 下正常工作,必须要把会用到的键名明确指出。这样节点在收到 eval 命令后就能分析出所要操作的键是不是都在一个节点里了,如果是则正常处理,不是就返回 CROSSSLOT 错误。如果不明确指出,比如你的例子,eval 命令发到了 master1 上,那么读 key2 时就会报错了。
canesten
2015-04-27 17:45:16 +08:00
如楼上所说
lua脚本里涉及的所有的key的hash tag必须都是相同的
alphaqiu
2015-04-28 08:26:30 +08:00
@canesten @luin 也就是说,在多节点集群下执行脚本无法保证操作多key的原子性。因为多key如果不在同一个节点中的话,就会出现CROSSSLOT的错误。对吧。
luin
2015-04-28 09:28:52 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/186712

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX