redis中的缓存雪崩、穿透

Posted on 2024-04-15 23:16  生之不止,思之不息  阅读(28)  评论(0编辑  收藏  举报

Redis 在作为缓存系统时,可能会面临几种常见的问题,其中包括缓存雪崩和缓存穿透。这些问题都可能导致系统性能下降甚至服务不可用。了解它们的原因及解决方案对于设计高可靠性系统至关重要。

缓存雪崩

定义:缓存雪崩是指在同一时间大量的缓存项过期,导致大量请求直接打到数据库上,从而引起数据库负载急剧上升甚至崩溃。

例子:假设一个在线商城系统使用 Redis 缓存商品的价格信息,所有商品的缓存设置了相同的过期时间,比如 24 小时。如果这些商品的缓存几乎同时到期,那么突然有大量的用户访问这些商品,所有的请求都会直接查询数据库来获取价格,这可能导致数据库负载过高,甚至服务崩溃。

解决方案

  • 不同的过期时间:为缓存项设置随机的过期时间,确保不会在同一时刻大量缓存过期。
  • 使用持久层的备份:在 Redis 失效时,可以使用其他形式的备份,如备用缓存,以减少对数据库的压力。
  • 提高数据库容错性:优化数据库性能,如增加读写分离、数据库集群等。
  • 使用限流和熔断机制:在系统设计时引入限流和熔断机制,保证在高负载时不会导致整个系统崩溃。

缓存穿透

定义:缓存穿透是指查询不存在的数据,由于缓存不命中,每次请求都会穿过缓存直接查询数据库,如果有大量此类查询,会对数据库造成不必要的压力。

例子:继续上面的在线商城例子,如果攻击者故意查询不存在的商品ID,这些请求会因为在 Redis 中找不到对应的缓存而直接访问数据库。如果查询量很大,会导致数据库负载过大。

解决方案

  • 缓存空对象:对于查询结果为空的情况,也将其作为特定的空对象存入缓存,并设置较短的过期时间。这样可以防止对同一不存在的数据频繁查询数据库。
  • 布隆过滤器:使用布隆过滤器预先判断请求的数据是否可能存在于数据库中。布隆过滤器可以非常高效地检查一个元素是否在一个集合中,虽然有一定的误判率,但适合用于拦截绝大部分无效请求。
  • 接口安全校验:加强对入口请求的校验,比如请求频率限制、用户身份验证等,防止恶意请求到达后端服务。

通过理解和采取措施应对这些缓存相关的问题,可以显著增强使用 Redis 的应用的稳定性和可靠性。

Copyright © 2025 生之不止,思之不息
Powered by .NET 9.0 on Kubernetes