缓存穿透和缓存击穿
2025-4-20
| 2025-4-20
Words 548Read Time 2 min
type
status
date
slug
summary
tags
category
icon
password
缓存穿透的意思是客户端请求的数据在缓存和数据库中都不存在,如果有人恶意的去查询数据,每次都到达数据库,那么可能会把数据库搞垮。

解决方案

缓存空对象:将这个id对应的空对象缓存到redis中,并且设置到期时间,可以是5分钟。这样既不会造成大量的垃圾,也不会每次到达数据库。当真有一个对应的id有数据的时候再去缓存把对应id的null值替换掉即可。

布隆过滤器

客户端访问先访问布隆过滤器,布隆过滤器判断数据是否存在,如果存在再往下走,不存在直接放回。布隆过滤器里存的是数据的二进制数据,占用空间小。缺点是实现复杂;存在误判的可能,如果布隆过滤器说数据不存在,那是真不存在,如果说存在,那也不一定存在。
综合下来还是直接缓存空对象,并且设置ttl值更加方便。

缓存雪崩

同一时间段有大量的key失效或者redis宕机了,导致大量请求到达数据库,带来巨大压力。
notion image

缓存击穿

缓存击穿也叫做热点key的问题,也是一个被高并发访问的key失效了,无数请求访问会给数据库带来巨大冲击。

解决方案:

互斥锁

只有拿到锁的线程,才能去重建数据到缓存中,没有拿到锁的就等到。
notion image

逻辑过期

直接在value设置一个expire过期时间。这是一个逻辑过期,并不是真正的过期,所以不会造成一直等代,
但同时也会有一把锁,拿到锁的重开一个线程去更新缓存,本线程返回旧数据。其他线程没有拿到锁的就直接返回旧数据。
notion image

优缺点

notion image
美团自动抢券缓存更新策略
Loading...