通过类比的方式理解缓存雪崩、缓存击穿和缓存穿透
缓存是一种常见的技术,用于加速数据访问和减轻数据库负载。然而,在高并发场景中,缓存的使用也可能引发一些问题,特别是缓存雪崩、缓存击穿和缓存穿透。了解并处理这些问题是保障系统稳定性的重要环节。本文将详细介绍这些概念,并通过名称帮助大家区分它们。
一、缓存雪崩
缓存雪崩是指当大量缓存数据在同一时间失效后,海量请求直接涌向数据库,导致数据库负载剧增甚至崩溃的现象。这种情况往往是由于缓存设置了统一的过期时间,或者缓存失效策略不当所引起。
类比:
想象一个热门餐厅在应对就餐高峰时,为了确保顾客能够顺畅就餐,餐厅设计了一整套措施,分别对应缓存雪崩的各种解决方案:
均匀设置过期时间:这家餐厅专门做预制菜中所有菜品都有过期时间,商家还懒,只有发现菜品快没了的时候才补充,为了保证不至于大批量顾客无法吃饭,那就应该做出不同过期时间的菜品。
互斥锁:大家很爱吃预制菜,于是餐厅出现了人满为患的情况,这时,餐厅引入了前台,有没有座位问前台就好,没有必要进去找一圈发现没有座位
后台更新缓存:餐厅太火爆了,大家希望菜品可以及时提供 于是设有专门的厨房小组,他们持续关注各道菜的存量,定时在后厨预先烹制出新鲜菜品放到保温柜中。即使某道菜快“过期”或刚卖完,顾客仍能迅速从保温柜取到热菜,不用等临时上菜。这类似于后台自动更新缓存,让数据始终保持“热度”,避免因短暂失效导致服务中断。
设置永不过期:餐厅发现还是不够赚钱,什么过不过期,又吃不死,直接为顾客上架所有过期食品,终于 顾客们得到了满足。(狗头)
通过这个餐厅的场景,我们可以联想到:制作不同过期时间的菜品(均匀设置过期时间)、向前台询问是否有作为(互斥锁)、后厨持续预热备菜(后台更新缓存)、永不过期(设置永不过期)。这种综合管理方式有效防止了因同时“断货”而引发的服务雪崩,确保餐厅始终运转顺畅。
二、缓存击穿
定义: 缓存击穿是指某些热点数据(即被频繁访问的数据)在缓存中失效,而在失效的瞬间有大量并发请求访问该数据,导致这些请求直接打到数据库。
触发场景: 典型场景是某些热点数据的缓存突然失效,而在失效的瞬间正好有大量请求需要访问这部分数据,结果所有请求都绕过了缓存直接访问数据库,给数据库造成极大压力。
应对策略:
- 设置热点数据永不过期: 对于某些重要且经常被访问的数据,可以设置为永不过期,避免缓存失效带来的击穿问题。
- 缓存预热: 在缓存快到期时提前更新缓存,避免失效瞬间产生大量请求打到数据库。
- 加锁机制: 对于同一时间的并发请求,可以通过锁机制确保只有一个请求去数据库查询,其他请求等待缓存更新完成后再获取数据。
类比 同样可以类比上面的餐厅示例
三、缓存穿透
定义: 缓存穿透是指缓存和数据库中都不存在的数据,由于没有命中缓存,导致每次请求都直接查询数据库。即每次请求都会“穿透”缓存,访问底层数据库。
触发场景: 当恶意用户或程序反复请求数据库中不存在的数据时,缓存中没有该数据的缓存记录,导致每次请求都绕过缓存直接打到数据库,给数据库造成不必要的压力。
** 类比** :有些坏比,看不惯
应对策略:
- 缓存空值: 对于查询数据库中不存在的数据,可以将空结果也进行缓存,避免同样的无效查询不断打到数据库。
- 布隆过滤器: 使用布隆过滤器这种高效的概率数据结构来判断请求的数据是否存在。不存在的数据直接过滤掉,从而避免打到缓存和数据库。
- 严格校验参数: 针对恶意请求,可以通过加强输入参数校验,确保无效请求不进入缓存和数据库。
类比:
给一个空值/默认值 :有一天,华强来到了餐厅,他想故意找茬,总是点一些不存在的菜品,于是老板每次只要见到华强来餐厅上去就是一个电炮(给一个默认值)再也不敢来了
操作失误导致的数据删除:最终食品安全部门发现该餐厅总是出售过期食品,没收了所有的菜品和违法所得,餐厅得到了应有的惩罚。.....
(也是一个美好的结局)

浙公网安备 33010602011771号