redis学习笔记之十:插槽及分片

本文深入探讨Redis集群中的插槽机制,解释如何通过CRC16算法将键映射到16384个插槽,以及在插槽迁移过程中如何确保数据一致性,避免键的临时丢失。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 的参数。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值