n 什么是插槽
插槽是Redis对Key进行分片的单元。在Redis的集群实现中,内置了数据自动分片机
制,集群内部会将所有的key映射到16384个插槽中,集群中的每个数据库实例负责其中部
分的插槽的读写。
n 键与插槽的关系
Redis会将key的有效部分,使用CRC16算法计算出散列值,然后对16384取余数,从
而把key分配到插槽中。键名的有效部分规则是:
1:如果键名包含{},那么有效部分就是{}中的值
2:否则就是取整个键名
n 移动已分配的插槽
这个稍微麻烦点,尤其是有了数据过后,假设要迁移123号插槽从A到B,大致步骤如下:
1:在B上执行cluster setslot 123 importing A
2:在A上执行cluster setslot 123 migrating B
3:在A上执行cluster getkeysinslot 123 要返回的数量
4:对上一步获取的每个键执行migrate命令,将其从A迁移到B
5:在集群中每个服务器上执行cluster setslot 123 node B
避免在移动已分配插槽过程中,键的临时丢失
上面迁移方案中的前两步就是用来避免在移动已分配插槽过程中,键的临
时丢失问题的,大致思路如下:
1:当前两步执行完成后,如果客户端向A请求插槽123中的键时,如果键还未被转
移,A将处理请求
2:如果键已经转移,则返回,把新的地址告诉客户端,客户端将发起新的请求以获
取数据
n 获取插槽对应的节点
当客户端向某个数据库发起请求时,如果键不在这个数据库里面,将会返
回一个move重定向的请求,里面包含新的地址,客户端收到这个信息后,需要重
新发起请求到新的地址去获取数据。
当然,大部分的Redis客户端都会自动去重定向,也就是这个过程对开发人
员是透明的。
redis-cli也支持自动重定向,只需要在启动时加入 -c 的参数。
避免在移动已分配插槽过程中,键的临时丢失
上面迁移方案中的前两步就是用来避免在移动已分配插槽过程中,键的临
时丢失问题的,大致思路如下:
1:当前两步执行完成后,如果客户端向A请求插槽123中的键时,如果键还未被转
移,A将处理请求
2:如果键已经转移,则返回,把新的地址告诉客户端,客户端将发起新的请求以获
取数据
n 获取插槽对应的节点
当客户端向某个数据库发起请求时,如果键不在这个数据库里面,将会返
回一个move重定向的请求,里面包含新的地址,客户端收到这个信息后,需要重
新发起请求到新的地址去获取数据。
当然,大部分的Redis客户端都会自动去重定向,也就是这个过程对开发人
员是透明的。
redis-cli也支持自动重定向,只需要在启动时加入 -c 的参数。