【Redis】集群数据hash分片算法

文章目录

  • 集群模式下是如何找到数据的?
  • 槽位定位算法
  • 使用方法

集群模式下是如何找到数据的?

上文我们已经提到了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被分配到同一台的服务器上。

你可能感兴趣的:(redis,redis)