《redis并发与运维》
由于n个key是比较均匀的分布在Redis Cluster的各个节点上,因此无法使用mget命令一次性获取,所以通常来讲要获取n个key的值,最简单的方法就是逐次执行n个get命令,这种操作的时间复杂度较高,它的操作时间 = n次网络时间 + n次命令时间,网络次数是n。很显然这种方案不是最优的,但是实现起来比较简单。
Redis Cluster使用CRC16算法计算出散列值,再取对16383的余数就可以算出slot值,同时我们可以使用Smart客户端保存slot和节点的对应关系,有了这两个数据就可以将属于同一个节点的key进行归档,得到每个节点的key子列表,之后对每个节点执行mget或Pipeline操作,它的操作时间 = node次网络时间 + n次命令时间,网络次数是node的个数,很明显这种方案比第一种要好很多,但是如果节点数太多,还是有一定的性能问题。
此方案是将方案2中的最后一步改为多线程执行,网络次数虽然还是节点个数,但由于使用多线程网络时间变为O(1),这种方案会增加编程的复杂度。它的操作时间为:
max_slow(node网络时间) + n次命令时间
Redis Cluster提供了hash_tag功能,可以将多个key强制分配到一个节点上,它的操作时间 = 1次网络时间 + n次命令时间。
批量操作方案对比