数据库与缓存11 分钟阅读更新于 2026-07-30

Redis 热点数据和冷数据:为什么只有热数据才值得缓存

缓存热点数据和冷数据的内容,讲清热数据、冷数据、缓存命中率、内存成本、TTL 和缓存分层思路。

相关工具

缓存不是越多越好

很多系统刚开始接 Redis 时,容易有一个冲动:既然 Redis 快,那就把能缓存的数据都塞进去。商品详情、用户信息、配置、列表、统计结果、历史记录,统统放一份。短期看,接口好像都绕过了数据库;过一段时间,内存涨了,命中率没上来,淘汰开始抖动,排查反而更难。

相关基础内容 对冷热数据说得很简单:热数据指访问次数较多的数据;冷数据就是访问很少或者从不访问的数据;只有热数据,缓存才有价值。这三句话很短,但足够把缓存设计的方向摆正。

Redis 的价值不在于替 MySQL 保存第二份完整数据,而在于把高频访问挡在内存层。被频繁读取的数据,放进 Redis 能减少数据库压力、降低延迟;很少访问的数据长期占着 Redis,只是在消耗内存,还可能把真正该留在缓存里的热数据挤出去。

Redis 热点数据和冷数据图解,展示用户请求经过应用服务访问 Redis 和 MySQL,并按访问频次、命中率、内存成本、更新频率和可重建性区分热点数据、温数据和冷数据
热点数据、温数据和冷数据的缓存分层

热数据访问次数多、命中率高,适合放进 Redis;冷数据访问很少,通常不值得长期占用缓存,未命中时回源 MySQL 更合理。

热数据的判断标准是访问次数

文中说热数据指访问次数较多的数据。这个定义很朴素,也最实用。缓存要解决的是重复访问成本,同一份数据短时间内被很多请求读到,缓存才有意义。比如首页推荐位、热门文章、商品详情、活动配置、用户登录态,这些数据如果每次都查数据库,数据库压力会很明显。

判断热不热,不能只凭感觉。一个接口重要,不代表它的数据都是热的;一张表很大,也不代表每条记录都值得缓存。真正要看访问频次、访问集中度和命中率。很多业务里的访问分布并不平均,少量数据承担大量请求,大量数据几乎没人访问。

这就是缓存能生效的前提。如果请求集中在少量热点 key 上,Redis 可以用有限内存挡住大量流量。如果请求非常分散,每次访问都是不同 key,缓存命中率就上不去。命中率低时,Redis 只是多了一次查询路径,并没有减少回源。

冷数据不该长期占用内存

文中说冷数据是访问很少或者从不访问的数据。冷数据的问题不是它没有价值,而是它不适合长期占用 Redis。Redis 的内存比磁盘贵,容量也更敏感。把很少访问的数据放进 Redis,相当于用昂贵资源保存低频内容。

冷数据长期占着缓存,会带来几个后果。第一,内存被浪费,热数据可用空间变小。第二,淘汰策略更容易触发,真正高频的数据可能被挤掉。第三,缓存内容越来越杂,排查命中率和内存占用时很难判断哪些 key 应该保留。

对冷数据来说,未命中回源 MySQL 通常更合理。它本来就很少被访问,偶尔查一次数据库的成本可以接受。如果担心第一次查询太慢,可以用短 TTL 或按需缓存,而不是让它长时间躺在 Redis 里。

命中率比缓存数量更重要

缓存效果不能只看写进 Redis 的 key 有多少。真正要看的指标是命中率。命中率高,说明大量请求在 Redis 层被处理,数据库压力下降;命中率低,说明多数请求仍然要回源,Redis 只是多走了一层。

有些系统缓存数量很多,但命中率并不好。原因通常是缓存了大量冷数据,或者 TTL 设计不合理,数据还没来得及被重复访问就过期了。也可能是 key 设计太细,每个用户、每个条件、每个分页都生成不同缓存,访问无法集中。

好的缓存策略会让有限内存服务更多请求。它不追求“缓存覆盖所有数据”,而是追求“把最常访问的数据留住”。这和 文中的结论完全一致:只有热数据,缓存才有价值。

热数据也要设置合理 TTL

热数据适合缓存,不等于永远不过期。TTL 要看数据更新频率、业务容忍度和重建成本。更新频繁的数据,TTL 太长会导致用户看到旧数据;更新很少的数据,TTL 可以长一点,减少重复回源。

比如网站导航、活动配置、热门榜单、商品详情,它们都可能是热数据,但 TTL 不会一样。活动配置变更少,可以缓存久一点;热门榜单变化快,可能需要短 TTL 或定时刷新;商品库存这种强一致要求更高的数据,即使访问频繁,也不能随便长时间缓存。

TTL 的作用不是随手写一个过期时间,而是让缓存和业务变化节奏对齐。热数据值得缓存,但仍然要有失效机制。没有 TTL 或失效机制的缓存,迟早会变成另一份难以维护的数据副本。

温数据可以按业务价值决定

实际系统里不只有热和冷两类。很多数据处在中间:访问不算特别高,但也不是完全没人看。比如某些用户资料、非首页商品、普通文章、历史订单摘要。它们可以叫温数据。

温数据是否缓存,要看业务价值。查询成本高、用户体验敏感、短时间内可能被重复访问的数据,可以给一个适中的 TTL。查询成本低、访问分散、重建容易的数据,可以不缓存,或者只在特定场景下短暂缓存。

这层判断需要结合真实数据。不要因为某个接口偶尔慢,就把所有返回都缓存起来。先看慢在哪里,是数据库查询慢,还是网络、序列化、下游接口慢;再看是否有重复访问。如果没有重复访问,缓存很难解决根本问题。

冷数据会挤占热数据

Redis 内存有限时,冷数据的危害会更明显。它不是安静地待在那里而已,它会占用 key 空间、占用 value 内存、参与过期检查和淘汰。当内存接近上限,Redis 根据淘汰策略清理数据时,缓存层就会开始抖动。

如果大量冷数据长期存在,真正的热数据可能因为空间不足被淘汰。热数据一旦被淘汰,请求会回源数据库,数据库压力上升;回源后又写回 Redis,进一步加剧写入和淘汰。表面上看 Redis 还在工作,实际缓存效率已经下降。

所以缓存治理里,清理冷数据不是洁癖,而是保护热数据。把内存留给高频访问,Redis 才能发挥价值。冷数据回源数据库,通常比让它挤占缓存更划算。

怎么识别热数据

识别热数据,最直接的方法是看访问统计。可以按 key、接口、业务对象统计一段时间内的访问次数、命中次数、未命中次数和回源次数。访问频次高、命中率高、回源成本高的数据,是优先缓存对象。

还要看访问集中度。比如某个商品详情接口整体访问量很大,但访问可能分散到几十万件商品上;也可能集中在少数爆款商品上。前者缓存收益有限,后者很适合重点缓存。只看接口 QPS,不看 key 分布,容易误判。

最后看数据是否可重建。可重建的数据更适合缓存,丢了可以从 MySQL 或其他系统恢复。不可重建或强一致的数据,即使访问频繁,也不能只靠 Redis 保存。缓存设计不能只看热度,还要看数据安全边界。

常见错误是把缓存当仓库

第一种错误是全量预热。系统启动后把一整张表都塞进 Redis,理由是“反正可能会访问”。结果大部分数据很少被读,内存先被占满,真正热点还没出现就已经背上包袱。

第二种错误是永久缓存。某些数据刚上线时很热,过一段时间热度下降,却一直不清理。新闻、活动、榜单、促销内容都可能有明显时效性。热数据会变冷,缓存策略也要跟着变化。

第三种错误是只加缓存不看指标。没有命中率、内存使用、淘汰次数、回源量这些指标,就不知道缓存到底有没有用。Redis 不是加上就会自动优化系统,它需要持续观察和调整。

面试可以这样回答

如果被问缓存中的热点数据和冷数据是什么,可以按 相关的口径回答:热数据是访问次数较多的数据,冷数据是访问很少或者从不访问的数据。只有热数据,缓存才有价值。

然后解释原因:缓存的价值来自重复访问命中。热数据放进 Redis,可以减少数据库访问、降低延迟;冷数据访问少,长期占用 Redis 只会浪费内存,还可能挤掉真正的热数据,导致命中率下降。

最后补上工程判断:识别热数据要看访问频次、命中率、key 分布、回源成本和数据是否可重建。热数据适合设置合理 TTL 并监控命中率;冷数据可以不缓存、短 TTL 或按需加载,让数据库承担低频访问。

常见问题

什么是热数据?

热数据就是访问次数较多的数据。它被频繁读取,放进 Redis 后更容易提高命中率、减少数据库压力。

什么是冷数据?

冷数据是访问很少或者从不访问的数据。它不适合长期占用 Redis,通常未命中时回源数据库更合理。

为什么只有热数据缓存才有价值?

因为缓存价值来自重复命中。热数据能被大量请求复用,冷数据命中率低,长期缓存只会浪费内存并挤占热数据空间。

怎么判断一份数据是否值得缓存?

看访问频次、命中率、key 分布、回源成本、更新频率和可重建性。高频、集中、回源成本高且可重建的数据更值得缓存。

MySQL 与 Redis

继续阅读

返回专题