黑马点评项目实战(二)——缓存穿透与缓存雪崩

缓存穿透

缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。例如,一个不怀好意的黑客同时间内大量请求不存在的数据,这些请求都会打到数据库上,导致数据库 崩溃。

常见的解决方案有两种:缓存空对象和布隆过滤。

其他解决方案:增强id的复杂度,避免被猜测id规律;做好数据的基础格式校验;加强用户权限校验;做好热点参数的限流。

缓存空对象

  • 优点:实现简单,维护方便
  • 缺点:
    • 额外的内存消耗(解决:设置TTL)
    • 可能造成短期的不一致

image-20250215152644339

布隆过滤

  • Redis中布隆过滤器底层为一个大型位数组(二进制数组)+多个无偏hash函数

  • 优点:内存占用较少,没有多余key

  • 缺点:

    • 实现复杂
    • 存在误判可能(可能有数据不存在但放行的情况)

image-20250215152737924

业务实现(使用缓存空对象)

image-20250215153518530

缓存雪崩

缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。

image-20250215161713293

解决方案:

  1. 给不同的Key的TTL添加随机值,用以预防同一时段大量的缓存key同时失效

  2. 利用Redis集群提高服务的可用性

  3. 给缓存业务添加降级限流策略

  4. 给业务添加多级缓存