目录
1、什么是缓存穿透
就是大量的访问数据的请求的key不存在redis中,导致这些请求直接打到数据库上,根本没经过缓存这一层。比方说:有人制造了缓存中不存在的key发送了大量的请求,导致大量的请求落到了数据库上面,可能会造成数据库崩溃。
2、缓存穿透解决方法
2.1、参数校验
最基本的操作,不合法的参数请求直接返回给数据库。比如查询的数据库 id 不能小于 0、传入的邮箱格式不对的时候直接返回错误消息给客户端等等。
2.2、缓存无效key
如果缓存和数据库中都查不到某个key就将key写到一个redis并设置过期时间。这种方法可以解决key变化不频繁的情况。
2.3、布隆过滤器
布隆过滤器就是我们将所有可能存在的请求,放到布隆过滤器中。当用户发送请求时先判断请求的值是否存在于布隆过滤器中。不存在的话就给前端返回参数错误告诉前端,存在的话才能继续走下面的逻辑。
但是,需要注意的是布隆过滤器可能会存在误判的情况。总结来说就是:
布隆过滤器说某个元素存在,小概率会误判。布隆过滤器说某个元素不在,那么这个元素一定不在。
布隆过滤器原理:
当一个元素加入到布隆过滤器的时候,会进行这些操作:
1、使用布隆过滤器中的哈希函数对元素值进行计算,得到hash值(有几个hash函数就得到几个hash值)
2、根据得到的hash值,在位数组中把对用的下标设为1。
当我们需要判断一个元素是否存在于布隆过滤器的时候,会进行这些操作:
1、对给定的元素再次进行相同的hash运算。
得到值后判断位数组中的每个元素是否都是1,如果都是1,说明这个值在布隆过滤器中,如果存在一个值不为1,说明不在布隆过滤器中。
然后,一定会出现这样一种情况:
不同的字符串可能哈希出来的位置相同。
(可以适当增加位数组大小或者调整我们的哈希函数来降低概率)
3、缓存雪崩
缓存或者热点缓存在同一时间大面积失效,后面的请求都落到了数据库上,造成数据库短时间内承受了大量的请求。
举个例子:
有一个秒杀活动,在12点开始,我们在缓存中放了一批商品,设置缓存过期时间为12点。那么秒杀开始的时候,缓存就失效了,所有的请求直接落到了数据库上。
4、缓存雪崩解决策略
4.1、对于redis服务不可用的情况
-
采用redis集群,避免单机出现问题整个缓存服务都没办法使用
-
限流,避免同时处理大量的请求
4.2、对于热点缓存失效问题
-
设置不同的失效时间,比如随机设置缓存失效时间,这样就不会造成大面积热点缓存同时失效。
-
设置缓存用不失效