Prince_ZaZa
Go big or go home

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

如果我们的用户数量足够多,且在某个时间段内突然都向我们的应用服务器发送请求,此时我们的应用服务器压力就会变大,然后他会不停地去查Redis的缓存数据,然后发现,诶!怎么没数据,即redis的命中率降低。此时应用服务器就会疯狂地访问我们的数据库请求数据,我们的数据库顶不住了就很容易奔溃。这个过程我们就把他叫做缓存穿透。

总结一下缓存穿透就是 ① 应用服务器压力变大 **②但是redis命中率很低 **③导致一直查询数据库的过程。

导致缓存穿透的情况有以下两种:
1、redis查不到需要的缓存数据
2、大量非正常的url访问

解决方法
1、对空值缓存:如果一个查询返回的数据为空(不管数据是否不存在),我们仍然把这个空结果(null)进行缓存,设置空结果的过期时间会很短,最长不超过5分钟。

2、设置可访问的名单(白名单):
使用bitmaps类型定义一个可以访问的名单,名单id作为bitmaps的偏移量,每次访问和bitmap里面的id进行比较,如果访问id不在bitmap中,进行拦截,不允许访问。

3、采用布隆过滤器:这个概率是1970年由布隆提出的,实际上是一个很长的二进制向量(位图)和一系列随机映射函数(哈希函数)。

4、实时监控:当发现Redis的命中率开始急剧降低,需要排查访问对象和访问的数据,和运维人员配合,设置黑名单限制服务。

posted on 2022-05-17 17:47  Prince_ZaZa  阅读(201)  评论(0)    收藏  举报