集群模式下是如何找到数据的?
上文我们已经提到了Redis的集群模式会把数据分配在不同的集群模式下的不同的主节点上,那么他是以什么规则进行分配的,以及分配完毕之后是如何快速找找到数据的呢?
Redis Cluster将所有数据划分为16384个slot(槽位),每个节点负责其中一部分槽位,槽位的信息存储与每个节点中。
当Redis Cluster的客户端来连接急求你的时候,他会得到一份集群的槽位配置信息并将其缓存在客户端本地。
这样当客户端要查找某个key时,可以根据槽位定位算法定位到目标节点。
槽位定位算法
Cluster默认会对key值使用crc16算法进行hash得到一个整数值,然后用这个整数值对16384进行取模来得到具体槽位。
也就是 HASH_SLOT = CRC16(key) mod 16384
再根据槽位值与Redis节点的对应关系就可以定位到key具体在那个Redis节点上。
情况如下:
可以发现下面的数据在插入的时候会进行重定向,说明当前这个key应该存放在另一个节点中.
所以访问任何一个节点,都可以访问到所有的数据,因为他会自动的进行重定向.
使用方法
在分配完毕集群之后,槽位就已经被分配完毕了,那么对于一些特殊的业务,我们肯定希望所有的键值对都放在某一个特定的Redis服务器上,那么这时候就可以使用Redis提供的特殊符号 {} 来进行配置。
数据key并不是与节点绑定,而是与槽位绑定。Redis会根据key的有效部分计算槽位值,分两种情况:
- key中包含“{}”,且“{}”中至少包含1个字符,“{}”中的部分是有效部分
- key中不包含“{}”,整个key都是有效部分
例如对于语句
set name lisi
那么就根据lisi进行计算,而对于下面这种
set {user}lisi
就是用user进行计算,计算方式是利用CRC16算法得到一个hash值,然后对16384取余,得到的结果就是slot值。
因此使用这种方式就能确保某些特定分组的key被分配到同一台的服务器上。