什么是 Redis 缓存穿透?

本文目录

如题

评论区 (3)

要理解redis缓存穿透,我们要先理解使用redis的工作流程,流程如下。

1.判断是否存在缓存,如存在直接返回数据 2.不存在缓存,去查询数据库。 3.数据不为空存入缓存。 4.用户访问后默认访问缓存。

在这个过程中,我们就会发现一个问题,第三步,数据不为空存入缓存,如果数据为空(被删除)的话就不会存入缓存,也就会一直循环去查询数据,导致缓存失效,增加数据库压力。

正确做法是:查询数据不为空,也存入缓存,但是缓存过期时间可以设置的快一点(比如60秒就过期)

#1 楼

缓存的正常

20

  • 先从缓存中取数据,如果能取到,则直接返回数据给用户。这样不用访问数据库,减轻数据库的压力。
  • 如果缓存中没有数据,就会访问数据库。

Bug情况

20
如果有人恶意攻击,那就很轻松的穿透你的缓存,将所有的压力都给数据库。

缓存穿透的问题,肯定是大并发情况下。依此为前提,我们分析缓存穿透的原因如下:

  • 恶意攻击,猜测你的key命名方式,然后估计使用一个你缓存中不会有的key进行访问。
  • 第一次数据访问,这时缓存中还没有数据,则并发场景下,所有的请求都会压到数据库。
  • 数据库的数据也是空,这样即使访问了数据库,也是获取不到数据,那么缓存中肯定也没有对应的数据。这样也会导致穿透。

解决缓存穿透

20

  • 1.再web服务器启动时,提前将有可能被频繁并发访问的数据写入缓存。—这样就规避大量的请求在第3步出现排队阻塞。
  • 2.规范key的命名,并且统一缓存查询和写入的入口。这样,在入口处,对key的规范进行检测。–这样保存恶意的key被拦截。
  • 3.Synchronized双重检测机制,这时我们就需要使用同步(Synchronized)机制,在同步代码块前查询一下缓存是否存在对应的key,然后同步代码块里面再次查询缓存里是否有要查询的key。 这样“双重检测”的目的,还是避免并发场景下导致的没有意义的数据库的访问(也是一种严格避免穿透的方案)。
    这一步会导致排队,但是第一步中我们说过,为了避免大量的排队,可以提前将可以预知的大量请求提前写入缓存。
  • 4.不管数据库中是否有数据,都在缓存中保存对应的key,值为空就行。–这样是为了避免数据库中没有这个数据,导致的平凡穿透缓存对数据库进行访问。
  • 5.第4步中的空值如果太多,也会导致内存耗尽。导致不必要的内存消耗。这样就要定期的清理空值的key。避免内存被恶意占满。导致正常的功能不能缓存数据。
#2 楼

学习了,不错

#3 楼
支持 markdown,图片截图粘贴拖拽都可以自动上传。
炮定坚

炮定坚 · 初学者

查看更多

最新视频课程

钻级赞助商