缓存穿透是指缓存和数据库中都没有的数据,导致所有的请求都落到数据库上,造成数据库短时间内承受大量请求而崩掉。
解决方案
1.
采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的
bitmap
中,一个一定不存在的数据会被这个
bitmap
拦截掉,从而避免了对底层存储系统的查询压力附加 对于空间的利用到达了一种极致,那就是Bitmap
和布隆过滤器
(Bloom Filter)
。 Bitmap: 典型的就是哈希表缺点是,
Bitmap
对于每个元素只能记录
1bit
信息,如果还想完成额外的功能,恐怕只能靠牺牲更多的空间、时间来完成了。
布隆过滤器(推荐)
就是引入了
k(k>1)k(k>1)
个相互独立的哈希函数,保证在给定的空间、误判率下,完成元素判重的过程。 它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。 Bloom-Filter算法的核心思想就是利用多个不同的
Hash
函数来解决
“
冲突
”
。 Hash存在一个冲突(碰撞)的问题,用同一个
Hash
得到的两个
URL
的值有可能相同。为了减少冲突,我们可以多引入几个
Hash
,如果通过其中的一个
Hash
值我们得出某元素不 在集合中,那么该元素肯定不在集合中。只有在所有的Hash 函数告诉我们该元素在集合中时,才能确定该元素存在于集合中。这便是 Bloom-Filter的基本思想。 Bloom-Filter一般用于在大数据量的集合中判定某元素是否存在。
2.
接口层增加校验,如用户鉴权校验,
id
做基础校验,
id<=0
的直接拦截;
3.
从缓存取不到的数据,在数据库中也没有取到,这时也可以将
keyvalue对写为
key-null
,缓存有效时间可以设置短点,如
30
秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个
id
暴力攻击