Skip to main content

如何解决热Key问题?

作者:程序员马丁

在线博客:https://open8gu.com

note

大话面试,技术同学面试必备的八股文小册,以精彩回答应对深度问题,助力你在面试中拿个offer。

回答话术

1. 读写分离

当热 Key 来自于读请求时,可以考虑通过读写分离,并且增加更多的从节点来降低对单个实例的读请求压力。

这种方案的缺点在于,不是所有的业务都适合读写分离,并且集群架构的复杂度提升也会带来额外的运维压力。

2. 热 Key 备份

我们可以将热 Key 复制到多个 Redis 实例,并在请求时随机选择一个备份实例来分散请求压力。

比如,假如现有热 Key "foo",我们将其复制到三个分片中,分别叫做 foo_1、foo_2 与 foo_3,当请求 "foo" 时,我们为其随机添加一个后缀,从而实现分散请求压力的效果:

// 生成1到3的随机数
int randomValue = new Random().nextInt(3) + 1;
// 将随机数作为后缀拼接到key上
String updatedKey = key + "-" + randomValue;
// 将key作为Redis中的键,随机值作为值存入Redis
redisTemplate.opsForValue().get(updatedKey);

这种策略可以减轻对单个 Redis 实例的负载,但是在涉及到增删改操作时,需要考虑数据一致性问题。

3. 二级缓存

对于一些热 Key,我们可以考虑使用一些本地缓存工具(比如 Guava 或 Ehcache) 直接将其缓存到 JVM 内存中,从根本上避免对 Redis 造成压力。

不过,这种方案下缓存会占用额外的运行时内存,因此需要有选择进行缓存,以避免占用过多内存资源。并且当与 Redis 缓存共用时,也要考虑数据一致性问题。

问题详解

什么是热 Key 以及如何发现缓存中的热 Key,详情查看文章:✅ 如何发现缓存中热 Key?