缓存雪崩/击穿/穿透

发布时间 2023-11-16 16:25:22作者: kiper

缓存雪崩

大量缓存同时过期,就叫缓存雪崩。

  • 缓存中有大量数据同时过期,导致大量请求缓存缺失

  • redis实例宕机

措施

  • 设置过期时间时,随机小范围打散

  • 服务降级
    缓存命令率下降到警告值或者数据库负载突然增大时,很可能发生了缓存雪崩。
    可以通过服务降级措施,来保证核心接口能正常查询数据库。也可以通过熔断措施,避免下游接口由于缓存雪崩链式导致当前服务异常。

  • 限流指标减少

redis实例恢复前,整个系统负载上线已降低,可以通过限制网关请求量来保护数据库实例不受影响。

  • 事前预防

redis服务考虑可用性,构建高可靠集群。

缓存击穿

某热点key过期,大量请求打到数据库。

措施

  • 针对特别频繁的热点数据,不建议设置过期时间

缓存穿透

访问的数据不在redis缓存及数据库中,导致每次请求都达到数据库上。

措施

  • 设置缺省空值,比如数据库中不存在,可以设置为空字符串或者0等

  • 使用布隆过滤器进行拦截判断
    布隆过滤器由一个初值都为0的bit数组和N个哈希函数组成,可以用来快速判断某个数据是否存在。
    当想标记某个数据存在时(例如,数据已被写入数据库),布隆过滤器会通过三个操作完成标记:

    1. 使用N个哈希函数,分别计算这个数据的哈希值,得到N个哈希值。
    2. 把这N个哈希值对 bit数组的长度取模,得到每个哈希值在数组中的对应位置。
    3. 对应位置的bit位置1。
  • Nginx拦截部分不合法的请求参数,减少恶意请求