Redis-问题-缓存穿透

1,表现

  1,应用服务器压力变大了

  2,缓存命中率低

  3,一直查询数据库

 2,造成原因

  1)redis 查询不到数据库

  2) 大量非正常url访问  ( 比如遭到攻击 )

 

3,解决方案

  一个一定不存在缓存及查询不到的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从缓存查不到数据则不写入缓存,

  这将导致这个不存在的数据每次请求到要到储存层去查询,失去了缓存的意义。

    (1),对空值缓存,如果一个查询返回的数据为空( 不管数据是否真的存在),我们仍然要对这个空结果进行缓存,设置空结果的过期时间会很短,

      最长不超过5分钟

    (2)设置可访问的名单(白名单):

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

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

      将所有可能存在的数据哈希到一个足够大的bitmaps里面,一个一定不存在的数据会被 bitmaps 拦截掉,从而避免了对底层储存系统的查询压力。

    (4)进行实时监控:当发现redis 的命中率急剧下降,需要排查访问的对象和访问的数据,和运维人员配合,可以设置黑名单限制服务。

 

 

  

posted @ 2022-02-23 15:39  danny522  阅读(35)  评论(0)    收藏  举报