首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >快收藏!一个技巧从此不再搞混缓存穿透和缓存击穿

快收藏!一个技巧从此不再搞混缓存穿透和缓存击穿

作者头像
磊哥
发布于 2025-03-01 14:04:26
发布于 2025-03-01 14:04:26
1730
举报
文章被收录于专栏:王磊的博客王磊的博客

Redis 中有两个定义:一个缓存击穿、一个缓存穿透,因为二者的名字比较像,因此很容易就搞混了。但本文会给你提供一个记忆的小技巧,帮你彻底区分二者的定义。

在讲这个技巧之前,我们先来了解一下二者的区别。

1.定义与区别

  • 缓存穿透(Cache Penetration):缓存穿透是指查询的数据既不在缓存中,也不在数据库中,但用户仍然频繁请求该数据,导致请求直接穿透到数据库,增加数据库压力。
  • 核心问题:请求的数据根本不存在,但请求量很大,导致数据库被无效查询。
  • 缓存击穿(Cache Breakdown):缓存击穿是指 热点数据的缓存失效,大量并发请求同时查询该数据,导致请求直接冲击数据库,增加数据库压力。
  • 核心问题:缓存中的数据失效,但数据库中有对应的数据,请求量集中导致数据库压力骤增。

2.常见场景

  • 缓存穿透
    • 用户请求不存在的 ID(如负数 ID 或非法字符)。
    • 恶意攻击者故意请求不存在的数据。
    • 示例:请求用户 ID 为 -1 或不存在的用户信息。
  • 缓存击穿
    • 热点数据(如热门商品信息、热门新闻)的缓存过期。
    • 大量用户同时请求该热点数据。
    • 示例:促销活动中的热门商品信息突然失效。

3. 解决方案

3.1 缓存穿透的解决方案

  1. 布隆过滤器(Bloom Filter):在缓存层前加一层布隆过滤器,预存所有合法 Key 的哈希值。请求到达时,先检查布隆过滤器:
    • 如果不存在,直接拦截请求,返回空。
    • 如果存在,再查询缓存或数据库。
    • 优点:内存占用少,能有效拦截不存在的请求。
    • 缺点:可能存在误判,需要合理设置参数。
  2. 缓存空值(Cache Null):对查询结果为空的 Key,缓存一个 Null 值,避免重复穿透。
    • 优点:实现简单,能有效减少数据库压力。
    • 缺点:可能会占用额外的缓存空间。
  3. 参数校验:在查询缓存之前,先对请求的参数进行合法性检查,如过滤非法字符、判断参数范围等,对于明显错误的参数,直接拦截返回。

3.2 缓存击穿的解决方案

  1. 互斥锁(Mutex Lock):当缓存失效时,通过分布式锁让一个线程重建缓存,其他线程等待锁释放后重试。
    • 优点:能有效避免多个线程同时查询数据库。
    • 缺点:实现复杂,可能会影响性能。
  2. 永不过期(Logical Expiration):对热点 Key 设置物理永不过期,通过后台异步线程定期更新缓存,保证数据新鲜度。
    • 优点:避免缓存失效导致的数据库压力。
    • 缺点:需要额外的逻辑来管理缓存更新。
  3. 熔断降级:在缓存失效期间,启用降级策略(如返回默认值或静态页面),保护数据库。
    • 优点:能有效缓解数据库压力。
    • 缺点:用户体验可能受影响。

4.对比

问题

定义

常见场景

解决方案

缓存穿透

请求的数据既不在缓存中,也不在数据库中,但请求量很大,导致数据库压力增大

非法请求、恶意攻击

布隆过滤器、缓存空值、参数校验

缓存击穿

热点数据的缓存失效,大量并发请求直接冲击数据库

热点数据失效、高并发场景

互斥锁、永不过期、熔断降级

通过理解它们的定义、场景和解决方案,你可以更清晰地区分缓存穿透和缓存击穿,并在实际开发中选择合适的解决方法。

5.记忆秘诀

  • 缓存击穿:核心是热点数据失效 -> 解决方案是重建热点数据
  • 缓存穿透:核心是 Redis 和 MySQL 都没有数据 -> 解决方案是拦截无效请求

因此,我们可以认为:

  • 缓存击穿 -> 正常的数据失效引发的问题
  • 缓存穿透 -> 非正常的数据访问引发的问题

就像警察叔叔审讯犯人一样,我们可以用“击穿犯罪嫌疑人的心里防线”,但不能用“穿透犯罪嫌疑的心里防线”,所以,击穿是“正义之词”,而穿透是“非正义之词”,例如,你这点小心思,我还看不“透”,“透”这个词通常是用来描述不好的事情的,因此我们可以使用这个技巧来彻底区分缓存击穿和缓存穿透了,如下图所示:

小结

缓存击穿和缓存穿透是 Redis 中两个常见的高频面试问题,但又很容易搞混二者的定义,我们通过学习本文的内容,相信可以彻底的区分二者的定义。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-02-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Redis之缓存穿透,雪崩,击穿解读
当我们请求去查询一条记录,先到redis中查询后到mysql查询都发现找不到该条记录,但是请求每次都会打到数据库上面去,导致后台数据库压力暴增,这些请求像“穿透”了缓存一样直接打在数据库上,这种现象就叫做缓存穿透。这种现象我们称为缓存穿透,这个redis变成了一个摆设。
一个风轻云淡
2023/10/15
3970
Redis系列 | 缓存穿透、击穿、雪崩、预热、更新、降级
Redis是高性能的分布式内存数据库,对于内存数据库经常会出现下面几种情况,也经常会出现在Redis面试题中:缓存穿透、缓存击穿、缓存雪崩、缓存预热、缓存更新、缓存降级。本篇分别介绍这些概念以及对应的解决方案。
王知无-import_bigdata
2020/07/22
12.4K0
Redis系列 | 缓存穿透、击穿、雪崩、预热、更新、降级
【玩转Redis面试第4讲】Redis缓存雪崩、缓存穿透、缓存击穿对比看这一篇就够了
缓存穿透是指用户请求的数据在缓存中不存在即没有命中,同时在数据库中也不存在,导致用户每次请求该数据都要去数据库中查询一遍,然后返回空。
爱笑的架构师
2020/09/24
8750
【玩转Redis面试第4讲】Redis缓存雪崩、缓存穿透、缓存击穿对比看这一篇就够了
Redis缓存穿透、缓存击穿和缓存雪崩
缓存穿透的概念很简单,用户想要查询一个数据,发现redis内存数据库没有,也就是缓存没有命中,于是向持久层数据库查询。发现也没有,于是本次查询失败。当用户很多的时候,缓存都没有命中,于是都去请求了持久层数据库。这会给持久层数据库造成很大的压力,这时候就相当于出现了缓存穿透。
后端码匠
2021/01/14
1.6K0
Redis-缓存穿透、缓存击穿和缓存雪崩
缓存穿透(查不到):查询一个数据时Redis内存数据库没有,缓存未命中,于是向持久层数据库查询发现也不存在,查询失败。当多次缓存未命中时,都去请求持久层数据库造成压力,若用此进行攻击可能压垮数据库。
唔仄lo咚锵
2020/09/15
8170
Redis详解(十二)------ 缓存穿透、缓存击穿、缓存雪崩
本篇博客我们来介绍Redis使用过程中需要注意的三种问题:缓存穿透、缓存击穿、缓存雪崩。
IT可乐
2020/06/02
53.2K1
解决缓存穿透、缓存雪崩和缓存击穿
短链接平台是一种在线服务,它将长的网址(URL)转换为更短的链接。这些短链接更便于分享,特别是在字符数有限的环境中,比如社交媒体平台。使用短链接平台不仅可以节省空间,还可以提供额外的功能,如点击统计、自定义短链接、以及访问控制等。 短链接的典型格式是由平台的域名加上一串字符组成,这串字符代表了原始的长链接。当用户点击这个短链接时,短链接平台会自动将用户重定向到原始的长链接所指向的网页。这个过程对用户来说是透明的,他们可能根本意识不到链接已经被转换和重定向了。 短链接平台的一些常见应用包括但不限于:
用户10136162
2024/02/03
3120
解决缓存穿透、缓存雪崩和缓存击穿
Redis缓存:缓存穿透、缓存击穿、缓存雪崩
持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第6天,点击查看活动详情
鳄鱼儿
2024/05/22
5010
Redis缓存:缓存穿透、缓存击穿、缓存雪崩
Redis-缓存雪崩、缓存击穿、缓存穿透
Redis作为目前使用最广泛的缓存,相信大家都不陌生。但是使用缓存并没有这么简单,还要考虑缓存雪崩,缓存击穿,缓存穿透的问题,什么是缓存雪崩,击穿,穿透呢,出现这些问题又怎么解决呢,接下来学习一下吧。
java技术爱好者
2021/02/05
1.4K0
Redis-缓存雪崩、缓存击穿、缓存穿透
Redis 缓存穿透 + 缓存雪崩 + 缓存击穿的原因和解决方案「建议收藏」
在生产环境中,会因为很多的原因造成访问请求绕过了缓存,都需要访问数据库持久层,虽然对Redsi缓存服务器不会造成影响,但是数据库的负载就会增大,使缓存的作用降低
全栈程序员站长
2022/07/02
8160
Redis 缓存穿透 + 缓存雪崩 + 缓存击穿的原因和解决方案「建议收藏」
缓存穿透、缓存击穿和缓存雪崩
什么是缓存穿透呢?它是指当用户在查询一条数据的时候,而此时数据库和缓存却没有关于这条数据的任何记录,而这条数据在缓存中没找到就会向数据库请求获取数据。它拿不到数据时,是会一直查询数据库,这样会对数据库的访问造成很大的压力。
JAVA日知录
2020/11/05
1.6K0
缓存穿透、缓存击穿和缓存雪崩
搞懂 Redis 缓存穿透、击穿、雪崩
如何有效的理解并且区分 Reids 穿透、击穿和雪崩之间的区别,一直以来都挺困扰我的。特别是穿透和击穿,过一段时间就稀里糊涂的分不清了。
用户4464623
2020/09/10
5490
搞懂 Redis 缓存穿透、击穿、雪崩
什么是redis的缓存穿透,缓存击穿和缓存雪崩?
是指查询一个不存在的数据,mysql查询不到数据,也不会直接写入缓存,每次请求都要去查数据库。可能导致数据库挂掉,这种情况大概率是遭到了攻击。
reload
2024/04/17
1.4K0
什么是redis的缓存穿透,缓存击穿和缓存雪崩?
【Redis实战】面试热点:缓存穿透、缓存击穿、缓存雪崩的区别和解决方案
  先读cache,如果数据命中则返回;如果数据未命中则读db;将db中读取出来的数据入缓存。
程序员云帆哥
2022/05/12
3750
【Redis实战】面试热点:缓存穿透、缓存击穿、缓存雪崩的区别和解决方案
来说说缓存穿透、缓存击穿、缓存雪崩都是什么?怎么解决?
看到题目就知道了,这又是我在面试中遇到的,最近面试,把我的博文质量感觉都提上来了。面一次试感觉够我总结一周的,但还是每次都能遇到知识盲点,那以后就当面试总结是个扫盲的过程吧。
纪莫
2020/09/18
6600
缓存穿透、雪崩、击穿三者如何解决
在客户端与数据库之间加上一个Redis缓存,先从Redis中查询,如果没有查到,再去MySQL中查询,同时查询完毕之后,将查询到的数据也存入Redis,这样当下一个用户来进行查询的时候,就可以直接从Redis中获取到数据
用户11097514
2024/05/31
2350
缓存穿透、雪崩、击穿三者如何解决
Redis 面试常见问题:缓存雪崩、缓存击穿以及缓存穿透
缓存雪崩是指大量的请求无法在缓存中处理,从而将请求转移到数据库中,导致数据压力倍增。一个Redis实例可以支持万级别的并发请求,而单个数据库只能支持千级别的并发请求。两者处理请求并发能力相差十倍,数据库会由于压力过大而导致雪崩。这里雪崩一般是由两个原因组成,很多文章只写缓存同时过期的情况。
用户10384376
2023/02/25
1.1K0
Redis 面试常见问题:缓存雪崩、缓存击穿以及缓存穿透
Redis 缓存击穿(失效)、缓存穿透、缓存雪崩怎么解决?
原始数据存储在 DB 中(如 MySQL、Hbase 等),但 DB 的读写性能低、延迟高。
码哥字节
2022/04/08
1.7K0
Redis 缓存击穿(失效)、缓存穿透、缓存雪崩怎么解决?
Redis缓存击穿、雪崩、穿透
缓存穿透 简单地就是用户请求透过redis直接进入到mysql当中进行查询,通常是一个不存在的key,在数据库查询为null。每次请求落在数据库、并且高并发。数据库扛不住会挂掉。 当用户的请求进入到Redis当中的时候,Redis当中并没有用户查询的键。 Redis会告诉用户没有查询到此Key,随后请求会被直接转发到后台MySQL当中 MySQL当中自然也不会存在此键值对,所以当大量的请求落在MySQL当中则会导致数据库宕机 解决缓存穿透的方案 可以将查到的null设成该key的缓存对象。 当然,也可
Yuou
2022/09/26
2780
【Redis 系列】redis 学习十二,redis 缓存穿透,缓存击穿,缓存
虽然我们在使用 redis 缓存的时候非常的爽,它大大的提高了我们应用程序的性能和效率,尤其是数据查询方面,咱们不用直接去持久化的数据库中查询数据,而是到内存中查询数据即可
阿兵云原生
2023/02/16
1.5K0
推荐阅读
相关推荐
Redis之缓存穿透,雪崩,击穿解读
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档