Redis学习_14_企业级解决方案_缓存穿透

文章目录

现象

系统平稳运行过程中, 应用服务器流量随时间增大,redis内存平稳,redis服务器CPU占用激增,数据库压力激增。

原因

  1. redis中出现大面积未命中。
  2. 出现非正常URL访问。
    如csdn某一篇博客的地址如下:https://blog.csdn.net/qq_33954947/article/details/107796253
    如果我们把最后的参数改一下,这个地址变成:https://blog.csdn.net/qq_33954947/article/details/107796286
    这个时候会出现不能正常访问的情况,这就是非正常URL访问。
    Redis学习_14_企业级解决方案_缓存穿透
    这种情况下,在redis中查不到对应的数据,就会直接去数据库查,从而加大数据库压力,导致数据库崩溃。
    这种情况一般是有黑客攻击服务器。

解决方法

  1. redis中缓存一个对应key的空数据(null),设置过期时间为30~60s。不过这样对redis的内存有影响。
  2. 白名单策略。
    • 预热各个数据id对应的bitmaps,用于记录存在的数据。在加载数据前,先在bitmaps最校验,对于不存在的数据直接打回。但是这样会影响性能。
    • 使用布隆过滤器。布隆过滤器和bitmaps作用类似,可以知道数据是否存在,不过这个会有点误差,但是对于黑客攻击来说,已经可以过滤掉大部分请求了。
  3. 实时监控。
    实时监控redis命中率与null数据的占比。
    • 非活动时段波动:通常检测3~5倍。超过5倍重点排查。
    • 活动时段波动:通常检测10~50倍。超过50倍重点排查。
  4. key加密。对key进行业务层传输加密,校验key不满足条件直接打回请求。