CodisLabs/codis

Codis MGET实现原理

Closed this issue · 4 comments

在Spring2.0之后,默认使用Lettuce客户端。Lettuce自己实现了mget功能,主要思路是将key根据slot进行分组,将在同一个slot的命令一起发送到对应的节点,再将所有请求的返回值合并作为最终结果。所以如果使用Lettuce客户端,即便是redis cluster也能支持mget功能。

但是经过测试发现,jedis+codis相比lettuce+redis的mget压测QPS和latency都好很多?
请教下codis对mget有做什么优化么,我理解的和lettuce的实现方式差不多

其实没有什么特殊的技巧,就是根据 slot 做了 shard 之后,还要利用 pipeline 优化性能。

其实没有什么特殊的技巧,就是根据 slot 做了 shard 之后,还要利用 pipeline 优化性能。

看了下lettuce的源码,它按找slot分组,循环最少访问不同slot的mget,最后聚集排序结果。
codis应该不是这样吧,codis是不是会按集群分片分组(而不是slot),每个分片只访问一次拿到mget的结果最后排序?

其实没有什么特殊的技巧,就是根据 slot 做了 shard 之后,还要利用 pipeline 优化性能。

试了下,原来redis-cluster同一个分片不同slot也是不支持mget的。那codis是怎么做的,为什么mget性能这么好呢,是计算key的slow所属的shard,把同一个shard的key用一个pipeline发送一组get命令过去,最后聚集不同shard的结果么?

楼主怎么解决的?