文
章
目
录
章
目
录
Redis缓存问题的发生原因以及解决方式通常可以分为三种情况:
1. 缓存穿透(Cache Penetration)
原因
客户端查询不存在的数据,导致请求直接到存储层,增加负载甚至导致宕机。可能是由于业务误删除缓存或恶意攻击而导致。
解决方式
a. 缓存空对象:当存储层未命中后,仍将空值存入缓存层,客户端再次访问时直接返回空值。
b. 布隆过滤器:在访问缓存之前使用布隆过滤器拦截请求,如果数据不存在则直接返回空值。
2. 缓存击穿(Cache Breakdown)
原因
热点数据缓存失效瞬间,大量请求直达存储层,导致服务崩溃。
解决方式
a. 不设置过期时间:对热点数据不设置过期时间,实现“物理”上的永不过期。
b. 逻辑过期时间:为每个数据设置逻辑过期时间,当数据逻辑过期时,使用单独的线程重建缓存。
c. 互斥锁:对数据访问加互斥锁,一个线程访问数据时,其他线程等待,访问后重建缓存,其他线程可以直接从缓存中取值。
3. 缓存雪崩(Cache Avalanche)
原因
缓存中大量数据同时过期或Redis节点故障,导致所有请求直达存储层,可能导致数据库宕机。
解决方式
a. 随机过期时间:在设置过期时间时附加一个随机数,避免大量键同时过期。
b. 降级和熔断:发生雪崩时,若访问的不是核心数据,可以直接返回预定义信息/空值/错误信息,或者对于缓存接口的请求直接返回,不访问Redis。
c. 高可用的Redis服务:部署多个Redis实例,使用哨兵或集群模式,即使某个节点宕机,服务仍然保持可用。
这些解决方式可以根据具体情况选择和组合,以确保缓存系统的可靠性和性能。