标签: 缓存
Redis 缓存设计
引入缓存能显著降低数据库压力,但设计不当会引入穿透、击穿、雪崩等经典问题。下面逐一拆解成因与对策。 三大经典问题 缓存穿透:查询不存在的数据,缓存与数据库都查不到,请求每次都打到 DB。应对:缓存空值(短过期)、布隆过滤器拦截非法 key。 缓存击穿:某个热点 key 过期瞬间,大量并发同时回源 DB。应对:互斥锁(只放一个线程重建)、逻辑过期(异步刷新)、热点 key 不过期。 缓存雪崩:大量 key 同一时刻集中失效,或 Redis 整体不可用,DB 被冲垮。应对:过期时间加随机抖动、多级缓 …
引入缓存能显著降低数据库压力,但设计不当会引入穿透、击穿、雪崩等经典问题。下面逐一拆解成因与对策。 三大经典问题 缓存穿透:查询不存在的数据,缓存与数据库都查不到,请求每次都打到 DB。应对:缓存空值(短过期)、布隆过滤器拦截非法 key。 缓存击穿:某个热点 key 过期瞬间,大量并发同时回源 DB。应对:互斥锁(只放一个线程重建)、逻辑过期(异步刷新)、热点 key 不过期。 缓存雪崩:大量 key 同一时刻集中失效,或 Redis 整体不可用,DB 被冲垮。应对:过期时间加随机抖动、多级缓 …
缓存设计的那些坑
缓存是最容易加的优化,也是最容易埋雷的优化。加的时候只要几行代码,出问题时往往是深夜的数据不一致或者数据库被打穿。 一致性:先更库还是先删缓存 这个问题的正确答案是先更新数据库,再删除缓存(Cache Aside)。但要理解它为什么仍然不完美。 先删缓存再更库的问题很直接:删完缓存到更库完成之间,另一个请求读到旧数据并把它写回缓存,之后缓存里就一直是脏数据。 先更库再删缓存也有极小概率出问题:读请求恰好在缓存失效后读到旧库值,且回写发生在删除动作之后。概率很低,但在高并发下不等于零。 …
缓存是最容易加的优化,也是最容易埋雷的优化。加的时候只要几行代码,出问题时往往是深夜的数据不一致或者数据库被打穿。 一致性:先更库还是先删缓存 这个问题的正确答案是先更新数据库,再删除缓存(Cache Aside)。但要理解它为什么仍然不完美。 先删缓存再更库的问题很直接:删完缓存到更库完成之间,另一个请求读到旧数据并把它写回缓存,之后缓存里就一直是脏数据。 先更库再删缓存也有极小概率出问题:读请求恰好在缓存失效后读到旧库值,且回写发生在删除动作之后。概率很低,但在高并发下不等于零。 …