Skip to main content

热点缓存数据如何预热?

作者:程序员马丁

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

note

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

回答话术

缓存预热是在系统启动或者运行过程中,提前将部分数据加载到缓存中,以确保在实际请求到来时,缓存已经包含了部分常用数据,从而提升系统的响应速度。

image.png

一般来说都是在活动或者需要调用对应缓存前,通过定时任务从数据源中加载到缓存。预热数据会根据业务实际情况,来判断是否需要设置过期时间,建议缓存预热的数据设置永不过期,避免内存淘汰或者过期造成击穿或雪崩等场景。

如果缓存过期时间设置不好,可能会存在缓存击穿或雪崩问题,参考:

其次,可以在预热过程中记录日志或者使用监控工具来监视预热的效果,确保热点数据已经被成功加载到缓存中。

问题详解

在执行预热时,可以将需要预热的数据放入消息队列中,然后通过消费者线程从消息队列中获取数据,并执行相应的数据读取流程最终存储到 Redis 中。该行为可以利用消息队列的分布式特性,预热任务可以分散到多个消费者线程中进行处理,从而显著提高预热效率和系统的并发处理能力

1. 项目启动时缓存预热有什么问题?

如果咱们要预热 Redis 中的数据,但是项目可能会启动多个节点,那么就会涉及到加载多次缓存,进而造成资源浪费。这种情况下可以使用分布式锁等工具,来保证缓存预热仅加载一次,但这会加重代码复杂度。

如果项目中使用了 XXL-Job 等分布式定时任务框架,可以直接使用定时任务解决缓存预热。反之,可以使用分布式锁以及其它方式进行项目启动时预热。

2. 如何确认缓存预热数据?

需要预热的数据一般都有一个特点,那就是已知这些数据会被大量访问。

大部分情况下,苹果 15 不显眼,但是如果参加了活动,比如某直播间 1 块钱抢购苹果 15、某商品大降价或者抢购茅台酒等,像这种已知会很火的数据,不用想直接加缓存。

还有一种就是类似于直播带货里的商品橱窗,就算商品价格没有什么优势,但是人数上来后,大家可能感兴趣在那点点点。

后者只是简单举个例子,但是在业务当中很有可能会发生类似觉得不热的 Key 访问很多,程序员对此可能无法很好评估,我们可以参考京东 HotKey 框架动态发现:✅ 如何发现缓存中热 Key?

需要注意的是,缓存预热虽然是一种常见的优化方法,但并非适用于所有情境。在某些情况下,预热可能会占用过多的 Redis 内存资源,从而对其他业务操作产生影响。因此,在实施缓存预热时,必须根据具体情况进行合理的权衡和配置。