最近看了一下docker搭建redis集群的知识,我来自己回答一下这个问题吧。 ## 哈希槽原理 首先redis cluster会创建[0,16383]哈希槽,供多个集群分片使用。 当set Key Value保存数据时,redis会使用**★【CRC16算法】★** ,计算key的hash值。 具体公式 : **_槽位 = CRC16.crc16(key) % 16384_** > _(具体算法可参考jar包【io.lettuce:lettuce-core】中的**SlotHash.getSlot("Key")** > 方法,只需要项目依赖jar包【spring-boot-starter-data-redis】,就可以引入lettuce的核心组件)_ ## 后缀拼接序号方案(行不通) 所以直接在将key拼接数字后缀,形成key-1,key-2,key-3,最终形成的hash并不能保证分别落在不同的分区哈希槽上,来降低热点数据key在单个节点的负载。参考如下代码: import io.lettuce.core.cluster.SlotHash; public class TestHashSlot { public static void main(String[] args) { /* redis集群中3个主节点的槽位 分片1:[0,5460] 分片2:[5461,10922] 分片3:[10923,16383] */ String mykey = "Key-Test"; System.out.println(SlotHash.getSlot(mykey+"01"));// 6582 插入到分片2 System.out.println(SlotHash.getSlot(mykey+"02"));// 10709 插入到分片2 System.out.println(SlotHash.getSlot(mykey+"03"));// 14836 插入到分片3 } } 综上,通过key拼接数字后缀并不能在redis集群模式下,实现副本key在多个节点上的平均分布。 ## 其他解决方案: ### 【方案1】引入额外的redis服务单独存储热点数据 此时: * 第一部分:redis使用集群模式,通过分配哈希槽,来实现海量key的分布式存储 * 第二部分:redis建立多个独立的主从,每个主从中,都具有相同的热点数据副本,插入时全部插入,读取时随机读取一个。  ### 【方案2】本地缓存法(即二级缓存) 直接使用本地缓存,比如ehcache,当读取高频热点数据时,直接内存中读取。可以设置较短的过期时间,只要数据一直高频访问,就不会过期。在高频读取场景下,节省了reids的网络io成本,更推荐