编辑
2025-08-03
redis
00
请注意,本文编写于 169 天前,最后修改于 43 天前,其中某些信息可能已经过时。

目录

什么是缓存穿透
解决方案
1.缓存空数据
2.布隆过滤器
作用
原理
缺点
参数
3.接口层校验

什么是缓存穿透

查询一个不存在的数据时,数据库(比如mysql)查询不到数据也不直接写入缓存,导致每次请求都会查询数据库,如果有人恶意查询空数据可能会导致数据库宕机

解决方案

1.缓存空数据

不存在的数据也放入缓存中,这样的缺点是,当有大量空数据时,会占用很多额外内存

2.布隆过滤器

作用

布隆过滤器可以告诉我们 “某样东西一定不存在或者可能存在”,也就是说布隆过滤器说这个数不存在则一定不存在,布隆过滤器说这个数存在可能不存在。当数据一定不存在时就可以直接返回。

原理

将一个数进行 kk 次哈希运算,可以得到 kk 个位置,在长为 nn的布尔数组里面把这 kk个位置标为 true。查询时,只需要判断这 kk 个位置是否均为 true即可。

缺点

由于底层使用是哈希,哈希冲突会导致误判,这时可以自行设置参数来调整误判的概率。

参数

布隆过滤器提供了两个参数,分别是预计加入元素的大小 nn ,运行的错误率 ff。布隆过滤器中有算法根据这两个参数会计算出二进制数组的大小 ll,以及无偏 hash函数的个数 kk。 它们之间的关系比较简单:

错误率越低,位数组越长,控件占用较大

错误率越低,无偏 hash函数越多,计算耗时较长 。布隆过滤器提供了两个参数,分别是预计加入元素的大小 nn,运行的错误率 ff。布隆过滤器中有算法根据这两个参数会计算出二进制数组的大小 ll ,以及无偏 hash函数的个数 kk。 它们之间的关系比较简单:

错误率越低,位数组越长,空间占用越大

错误率越低,无偏hash函数越多,计算耗时越长

3.接口层校验

在业务入口(比如网关,Controller层)对参数进行校验,如果参数明显非法(比如出现负数,或者太大),直接拦截即可

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay