MOVED重定向

槽命中:直接返回

算出key的slot值
1 | >127.0.0.1> 6379 cluster keyslot hello |
返回结果:
1 | (integer) 866 |
槽不命中:moved异常
算出key的slot值
1 | >127.0.0.1> 6379 cluster keyslot php |
返回结果:
1 | (integer) 9244 |

看一个小例子:
1 | redis-cli -c -p 7000 //集群模式 |

ASK重定向

在集群缩容扩容的时候,要对槽进行迁移,槽迁移过程中要遍历进行migrate,迁移时间比较长,
此时在此过程中访问一个key,但是key已经迁移到目标节点,就需要一个新的方案来解决这个问题,redis cluster 对这个问题已经有解决方案
我们来看它的一个实现演示:
moved & ask
- 两者都是客户端重定向
- moved:槽已确定迁移
- ask:槽还在迁移中
smart客户端
基本原理
追求性能:
- 从集群中选一个可运行的节点,使用cluster slots 初始化槽和节点映射
- 将cluster slots结果映射到本地,为每个节点创建redisPool
- 执行命令
基本流程:
关于redis cluster 客户端使用可参考
redis-go-cluster
批量操作优化
批量操作怎么实现?meget meset必须在一个槽
串行mget

串行IO

并行IO

hash_tag

四种方案优缺点对比
| 方案 | 优点 | 缺点 | 网络IO |
| 串行mget | 编程简单,少量keys满足需求 | 大量keys请求延迟严重 | O(keys) |
| 串行IO | 编程简单,少量节点满足需求 | 大量node延迟严重 | O(nodes) |
| 并行IO | 利用并行特性,延迟取决于最慢的节点 | 编程复杂,超市定位问题难 | O(max(node)) |
| hash_tag | 性能最高 | 读写增加tag维护成本,tag分布易出现数据倾斜 | O(1)) |