在这篇文章中,边肖和大家分享了redis缓存穿透的解决方案和相关实例,所以有需要的朋友可以借鉴一下。
缓存技术可以用来减轻数据库的压力,提高访问效率。目前,缓存在企业项目中越来越受到重视。但是缓存并不意味着只是随便加入项目。这是将缓存集成到项目中的第一步。但是缓存导致的穿透问题,然后是雪跳问题,都是我们迫切需要解决的问题。本文将我平时项目的解决方案分享给大家,供大家参考。
一、缓存穿透的原理
高速缓存的正常使用如图所示:
如图所示,缓存的使用过程:
1.先从缓存中获取数据,如果可以获取,直接将数据返回给用户。这样就不需要访问数据库,从而减轻了数据库的压力。
2.如果缓存中没有数据,将访问数据库。
里面会有一个BUG,如图:
如图所示,缓存就像是数据库的防火墙,将频繁请求的数据放入缓存,从而减轻数据库的压力。但是如果有人恶意攻击,就会很容易穿透你的缓存,把所有的压力都给数据库。比如上图中,你缓存中的键都是正整数,而我只是用负数作为键来访问你的缓存,这样会导致缓存的穿透,直接给数据库造成压力。
二、导致缓存穿透的原因
缓存穿透的问题肯定是在大并发的情况下。基于这一前提,我们对缓存渗透的原因分析如下:
1.恶意攻击,猜测你的密钥是如何命名的,然后估计使用一个不会在你缓存中的密钥进行访问。
2.对于第一次数据访问,当缓存中没有数据时,在并发场景中,所有请求都将被压入数据库。
3.数据库中的数据也是空的,所以即使访问数据库也无法获取数据,所以缓存中肯定没有对应的数据。这也会导致渗透。
三、解决缓存穿透
缓存穿透是逐步避免穿透的原因,如图:
如上图所示,求解步骤如下:
1.web服务器启动时,提前将可能频繁并发访问的数据写入缓存。—这避免了大量请求在步骤3中排队。
2.规范key的命名,统一缓存查询和写入的条目。这样,在入口处,钥匙的规格就得到检验。以这种方式保存的恶意密钥被拦截。
3.同步双检测机制。这时候我们就需要在同步代码块之前使用Synchronized机制查询缓存中是否有对应的键,然后在同步代码块时再查询缓存中是否有要查询的键。这种“双重检测”的目的是为了避免并发场景导致的无意义的数据库访问(也是一种严格避免渗透的方案)。
这一步会导致排队,但是我们在第一步说过,为了避免大量排队,可以提前将大量可预测的请求写入缓存。
4.不管数据库中有没有数据,都在缓存中保存对应的键,只要值为空。这是为了避免由于数据库中缺少这些数据而通过缓存访问数据库。
5.如果第四步的空值太多,也会导致内存耗尽。导致不必要的内存消耗。这样,定期清理空钥匙就很有必要了。避免恶意的内存填充。因此,普通函数无法缓存数据。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。