2026-03-19 15:51:57
Redis 缓存异常处理
在使用 Redis 作为数据库缓存时,可能会遇到缓存雪崩、缓存击穿、缓存穿透等问题。这些问题可能导致系统性能下降甚至崩溃。以下是针对这些问题的详细分析和解决方案:
缓存雪崩问题描述:缓存雪崩是指大量缓存数据在同一时间失效,导致大量请求直接访问数据库,造成数据库压力激增,甚至崩溃。
原因:
缓存中大量 key 同时过期:
例如,设置了相同的过期时间,导致大量 key 同时失效。
Redis 实例挂掉:
Redis 服务不可用,所有请求直接落到数据库。
解决方案:
避免大量 key 同时过期:
在设置过期时间时,可以加入随机性,使 key 的过期时间分散。
例如,使用 EXPIRE key random_time,其中 random_time 是一个基础时间加上随机偏移量。
Redis 主从集群:
使用 Redis 主从复制,主节点挂掉时,从节点可以快速提升为主节点,继续提供服务。
服务熔断或请求限流:
服务熔断:当 Redis 不可用时,暂时停止对数据库的请求,避免数据库崩溃。
请求限流:限制请求的流量,随机丢弃部分请求,保护数据库。
问题描述:缓存击穿是指某个热点 key 在缓存中失效时,大量请求直接访问数据库。
原因:
解决方案:
热点 key 不设置过期时间:
对于热点数据,可以不设置过期时间,避免缓存失效。
互斥锁:
在缓存失效时,使用互斥锁确保只有一个请求去访问数据库,其他请求等待或返回旧数据。
问题描述:缓存穿透是指请求的数据既不在缓存中,也不在数据库中,导致每次请求都直接访问数据库。
原因:
解决方案:
缓存空值或缺省值:
对于不存在的 key,可以在缓存中设置一个空值或缺省值,并设置较短的过期时间。
布隆过滤器:
使用布隆过滤器预先判断 key 是否存在。
布隆过滤器通过哈希函数将 key 映射到位数组中,如果所有对应位都为 1,则认为 key 可能存在。
布隆过滤器的缺陷是可能存在误判(假阳性),但不会漏判(假阴性)。
参数校验:
在业务层面对请求参数进行校验,过滤掉无效请求。
问题描述:当修改数据时,需要同时修改数据库和缓存,可能导致数据不一致。
原因:
解决方案:
先更新数据库,再删除缓存:
这是最常用的方法,先更新数据库,再删除缓存,确保下次请求时从数据库加载最新数据。
延迟双删:
在删除缓存后,延迟一段时间再次删除缓存,确保并发请求不会读取到旧数据。
使用消息队列:
在更新数据库后,通过消息队列通知其他服务删除缓存,确保一致性。
通过以上方法,可以有效应对 Redis 缓存中的常见问题,提高系统的稳定性和性能。