2020-07-12 21:29:05
Redis缓存雪崩、击穿、穿透及常见缓存模式的核心要点如下:
一、缓存雪崩加锁排队:利用Redis的SETNX实现互斥锁,仅允许一个线程加载数据并更新缓存,其他线程等待或重试。
数据预热:系统启动时预先加载热点数据到缓存,或通过定时任务提前更新缓存。
双层缓存策略:设置短期失效的原始缓存(C1)和长期失效的拷贝缓存(C2),C1失效时访问C2。
定时更新:对非实时性要求高的数据,通过定时任务更新缓存。
分散过期时间:为不同key设置随机过期时间,避免集中失效。
互斥锁:第一个请求获取锁后查询数据库并更新缓存,其他请求等待锁释放后直接读取缓存。
缓存空值:将查询结果为空的数据缓存(如null),设置短过期时间(如5分钟)。
布隆过滤器:在缓存前加一层布隆过滤器,拦截不存在的key,避免查询数据库。
Cache Aside(旁路缓存)
流程:
读:先查缓存,未命中则查数据库,并写入缓存。
写:先更新数据库,再使缓存失效。
问题:
并发写可能导致脏数据(如读请求写入旧数据后被写请求失效覆盖)。
极端场景下仍可能脏数据(如读请求写缓存前被写请求失效)。
Read/Write Through(读写穿透)
流程:应用直接操作缓存,由缓存服务同步更新数据库。
特点:
脏数据概率低,但强依赖缓存稳定性。
适合读多写少场景。
Write Behind(异步写入)
流程:应用直接操作缓存,由缓存服务异步批量更新数据库。
特点:
性能高,但数据一致性差,可能丢失数据。
实现复杂,需处理异常恢复逻辑。
总结: