什么是缓存穿透
请看图,当我们用户访问我们的服务器的时候,服务器一般会先访问我们的redis,查看我们的缓存是否有需要的数据,如果没有我们再去访问数据库。

如果我们的用户数量足够多,且在某个时间段内突然都向我们的应用服务器发送请求,此时我们的应用服务器压力就会变大,然后他会不停地去查Redis的缓存数据,然后发现,诶!怎么没数据,即redis的命中率降低。此时应用服务器就会疯狂地访问我们的数据库请求数据,我们的数据库顶不住了就很容易奔溃。这个过程我们就把他叫做缓存穿透。
总结一下缓存穿透就是 ① 应用服务器压力变大 **②但是redis命中率很低 **③导致一直查询数据库的过程。
导致缓存穿透的情况有以下两种:
1、redis查不到需要的缓存数据
2、大量非正常的url访问
解决方法
1、对空值缓存:如果一个查询返回的数据为空(不管数据是否不存在),我们仍然把这个空结果(null)进行缓存,设置空结果的过期时间会很短,最长不超过5分钟。
2、设置可访问的名单(白名单):
使用bitmaps类型定义一个可以访问的名单,名单id作为bitmaps的偏移量,每次访问和bitmap里面的id进行比较,如果访问id不在bitmap中,进行拦截,不允许访问。
3、采用布隆过滤器:这个概率是1970年由布隆提出的,实际上是一个很长的二进制向量(位图)和一系列随机映射函数(哈希函数)。
4、实时监控:当发现Redis的命中率开始急剧降低,需要排查访问对象和访问的数据,和运维人员配合,设置黑名单限制服务。
浙公网安备 33010602011771号