1. 背景
当我们的产品需要一款分布式缓存组件时,一般会考虑Redis集群. Redis集群是一种分布式的,高可用性的缓存组件,
大多数情况下存储一些经常使用的,变动不频繁的数据,例如用户信息, 离线计算的某类数据等. 但是,随着用户量的大量增
加, 如何快速的将海量的数据导入Redis集群变得越加紧急, 传统的逐条插入Redis集群的方式已经无法满足我们的需求,
因为这种方式的延迟会随数据的倍增而线性增加.
2. 问题描述
1) Redis集群包含多个节点,不同的key可能存放在不同的节点,如何拆分?
2) 如何批量往某个节点导入大量数据?
3) 如何保证数据导入的可靠性 ?
3. 使用pipeline支持批量操作
为了解决上述3个问题,我们需要先了解Redis集群节点分布的原理, redis集群划分为16384个slot, 这些slot交由所有的master节点负责, 每个节点负责其中一部分.
1. 键值对保存到Redis之前, 先对key进行CRC16哈希算法得到一个slot值, 然后根据查看该slot属于哪个master节点负责, 就映射到这个节点上。
2. 每个Master节点会被分配一个Slot段,对应着0-16384的一段,每段Slot不能重复也不能缺失,否则会导致对象重复存储或无法存储。
3, Master节点之间也互相监听,一旦有Master节点退出或者加入,会按照Slot为单位做数据的迁移。例如某个Master节点如果掉线了,首先会尝试从该Master节点的从节点中选举出一个新的Master节点, 如果不存在从节点,那么这个Master节点负责Slot将会平均分摊到其他的Master节点上,由于其他Master节点本身维护的Slot还会在自己身上不会被重新分配&#x