openresty 连接redis cluster

利用openresty 连接redis cluster的pipeline和script的尝试结果:
一、redis-cli 执行script load,此sha1只能在当前结点执行,并未同步到其他节点。
注:相同脚本代码,在不同节点执行sha1是一致的)

二、可以利用hashtag来人为分slot,如:{test}1,{test}2

三、lua-resty-redis-cluster的pipeline的实现原理:得到所有key,计算key对应的节点信息(ip、port等集群信息在连接时已缓存),相同节点的keys执行一次,返回结果缓存,再执行下一结点的keys。
注:不同节点的key是不能保证原子性的;管道本身就是不保证数据原子性的(未验证)

四、redis事务,语法异常则可以实现原子性(如命令不存在或参数错误),运行时异常则所有命令全部被执行(如get了hash类型key)

五、在redis集群环境下,jedis和lua-resty-redis-cluster执行原理:
1.首次请求时,先cluster slots获取集群上所有的slot信息和对应的master和slave的节点信息后,进行本地缓存16384个slot的信息。
2.接收到指令后,计算参数中的key值所对应的slot(利用crc16计算),根据计算出的slot值匹配缓存中已缓存的slots的节点信息。
3.利用已知的节点信息用单机客户端连接方式直连,发送指定。
4.如果返回“MOVED”则表示slot已不在本结点,需要客户端跳转到指定节点重新取值,从步骤1重新开始;如果返回“ASK”则表示当前slot正在迁移中,直连到指定节点上获取,当此时集群信息并没有改变,迁移结束后才会刷新;
5.取得key对应的值

以上不区分存取,但不存在key的信息,需要特殊处理。如scrpit load,需要在每个节点上都执行一次,evalsha才能执行。

集群客户端都是在原单机客户端的基础上进行封装的,也就是集群客户端只是计算了slot和缓存了集群slots信息,底层还是单机方式连接。

如管道,则是把所有指令先缓存起来,后按节点分次提交执行,缓存每次返回的结果,最终把整体结果返回。


引用

猜你喜欢

转载自langmnm.iteye.com/blog/2367432