缓存穿透处理(缓存穿透是什么意思)
导语:了解缓存穿透
什么是缓存穿透
缓存穿透又称缓存击穿,是指某一个key被多次请求都没有命中,这个时候就会直接请求数据库,从而导致数据库并发的执行大量无意义的查询操作,对数据库造成一定的压力。
比如下面这个例子:当redis存的key为mysql的自增主键时,用户恶意请求主键id为 -1 的查询操作,redis中没有命中,然后就会去mysql中查询,同时mysql中也没有对应数据则只能返回空给用户,然后这个用户通过这个脚本不断的去发这个恶意请求,这个请求直接穿过redis打到数据库上,这就是缓存穿透,当然这也只是一个例子便于理解。
简单点来说就是请求一个缓存中和数据库中都不存在的数据
解决方案,避免缓存穿透
1. 如果请求穿过redis直接到数据库中,无论数据库查询出什么结果,就算是空的也都缓存到redis中去,这样它下次发同一个请求的时候就不会穿透redis直接查询数据库了。2. 从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击3. 对参数的合法性进行检验,在判断这个参数不合法的时候直接return掉。4. 使用布隆过滤器(一般情况下不会采用)。5. 在本地缓存一个set集合,存储对应数据为空的key的集合,在请求前做拦截,此种方式牵涉到数据变更还要校验set集合的问题,一般适用于数据更新比较少的场景。6. 对缓存失效的Key加分布式锁,当一个Key在本地缓存以及Redis缓存中未查询到数据,此时对Key加分布式锁访问数据库,如果取到数据就反写到缓存中,避免大量请求进入数据库。如果取不到数据则缓存一个空对象,这样可以保证数据库不会被大量请求直接挂掉,从而引起缓存颠簸,更甚者缓存雪崩。
免责声明:本站部份内容由优秀作者和原创用户编辑投稿,本站仅提供存储服务,不拥有所有权,不承担法律责任。若涉嫌侵权/违法的,请反馈,一经查实立刻删除内容。本文内容由快快网络小余创作整理编辑!