Redis经典问题

56 阅读3分钟

1.缓存穿透

  1.1.概述

  缓存穿透是指,请求一个不存在的数据,缓存和数据库中都没有这个数据,这种请求会穿透缓存直接到数据库进行查询。它通常发生在一些恶意用户可能故意发起不存在的请求,试图让系统陷入这种情况,以耗尽数据库连接资源或者造成性能问题。

  1.2.解决办法

  • 缓存 空值 或特殊值: 当查询数据库得到的数据不存在,此时我们仍然去缓存数据,缓存一个空值或一个特殊值的数据,避免每次都会查询数据库,避免缓存穿透。
  • 使用布隆过滤器: 先把缓存中的数据的key存入到布隆过滤器中,查询缓存前,先判断当前key在布隆过滤器中是否存在。一定存在直接返回,有可能存在,再查询缓存,没有,再查询数据库。

2.缓存击穿

  2.1.概念

  缓存击穿发生在访问热点数据,大量请求访问同一个热点数据,当热点数据失效后同时去请求数据库,瞬间耗尽数据库资源,导致数据库无法使用

  2.2.解决办法

  • 使用锁: 单体架构下(单进程内)可以使用同步锁控制查询数据库的代码,只允许有一个线程去查询数据库,查询得到数据库存入缓存。
  • 热点数据不过期: 可以由后台程序提前将热点数据加入缓存,缓存过期时间不过期,由后台程序做好缓存同步。
  • 缓存预热: 分为提前预热、定时预热。提前预热就是提前写入缓存。定时预热是使用定时程序去更新缓存。
  • 热点数据查询降级处理: 对热点数据查询定义单独的接口,当缓存中不存在时走降级方法避免查询数据库。

3.缓存雪崩问题

  3.1 概念

  缓存雪崩是缓存中大量key失效后当高并发到来时导致大量请求到数据库,瞬间耗尽数据库资源,导致数据库无法使用。

  比如对某信息设置缓存过期时间为30分钟,在大量请求同时查询该类信息时,此时就会有大量的同类信息存在相同的过期时间,一旦失效将同时失效,造成雪崩问题。

  3.2 解决方案

  • 使用锁进行控制: 思路同缓存击穿。
  • 对同一类型信息的key设置不同的过期时间: 通常对一类信息的key设置的过期时间是相同的,这里可以在原有固定时间的基础上加上一个随机时间使它们的过期时间都不相同。
  • 缓存定时预热: 不用等到请求到来再去查询数据库存入缓存,可以提前将数据存入缓存。使用缓存预热机制通常有专门的后台程序去将数据库的数据同步到缓存。