Codis MGET实现原理
Closed this issue · 4 comments
rhaonan commented
在Spring2.0之后,默认使用Lettuce客户端。Lettuce自己实现了mget功能,主要思路是将key根据slot进行分组,将在同一个slot的命令一起发送到对应的节点,再将所有请求的返回值合并作为最终结果。所以如果使用Lettuce客户端,即便是redis cluster也能支持mget功能。
但是经过测试发现,jedis+codis相比lettuce+redis的mget压测QPS和latency都好很多?
请教下codis对mget有做什么优化么,我理解的和lettuce的实现方式差不多
spinlock-pony commented
其实没有什么特殊的技巧,就是根据 slot 做了 shard 之后,还要利用 pipeline 优化性能。
rhaonan commented
其实没有什么特殊的技巧,就是根据 slot 做了 shard 之后,还要利用 pipeline 优化性能。
看了下lettuce的源码,它按找slot分组,循环最少访问不同slot的mget,最后聚集排序结果。
codis应该不是这样吧,codis是不是会按集群分片分组(而不是slot),每个分片只访问一次拿到mget的结果最后排序?
rhaonan commented
其实没有什么特殊的技巧,就是根据 slot 做了 shard 之后,还要利用 pipeline 优化性能。
试了下,原来redis-cluster同一个分片不同slot也是不支持mget的。那codis是怎么做的,为什么mget性能这么好呢,是计算key的slow所属的shard,把同一个shard的key用一个pipeline发送一组get命令过去,最后聚集不同shard的结果么?
niuxinghua commented
楼主怎么解决的?