V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
alphaqiu
V2EX  ›  Redis

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

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

    PS:还没用过3.0
    不过看文档来说原理应该是这样的
    luin
        2
    luin  
       2015-04-27 17:01:39 +08:00   ❤️ 1
    脚本中的所有键必须在 cluster 中的同一个节点中。要想让 script 能在 cluster 下正常工作,必须要把会用到的键名明确指出。这样节点在收到 eval 命令后就能分析出所要操作的键是不是都在一个节点里了,如果是则正常处理,不是就返回 CROSSSLOT 错误。如果不明确指出,比如你的例子,eval 命令发到了 master1 上,那么读 key2 时就会报错了。
    canesten
        3
    canesten  
       2015-04-27 17:45:16 +08:00
    如楼上所说
    lua脚本里涉及的所有的key的hash tag必须都是相同的
    alphaqiu
        4
    alphaqiu  
    OP
       2015-04-28 08:26:30 +08:00
    @canesten @luin 也就是说,在多节点集群下执行脚本无法保证操作多key的原子性。因为多key如果不在同一个节点中的话,就会出现CROSSSLOT的错误。对吧。
    luin
        5
    luin  
       2015-04-28 09:28:52 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2681 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 06:25 · PVG 14:25 · LAX 22:25 · JFK 01:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.