Redis 缓存设计与实战
Redis 是一款高性能的内存键值数据库,常被用作缓存、消息队列、分布式锁等场景。本文从缓存的三大经典问题出发,讨论如何设计健壮的缓存方案。
一、常用数据结构
String:缓存对象、计数器Hash:存储结构化对象,适合购物车List:消息队列、时间线Set:去重、共同关注ZSet:排行榜、延迟队列
二、缓存三大问题
1. 缓存穿透
查询一个数据库中也不存在的数据,导致每次请求都打到 DB。解决方案:缓存空值、布隆过滤器、接口校验。
2. 缓存击穿
热点 key 突然失效,大量请求同时访问数据库。解决方案:互斥锁、逻辑过期、热点 key 永不过期。
3. 缓存雪崩
大量 key 同时过期,数据库压力骤增。解决方案:过期时间加随机值、多级缓存、熔断降级。
三、二级缓存方案
在本地缓存(Caffeine)+ 分布式缓存(Redis)组合下,既能降低 Redis 压力,又能保证多实例间的一致性。
- 读:先查 Caffeine,再查 Redis,最后查 DB;命中后回填。
- 写:更新 DB,然后删除 Redis,再通知本地缓存失效。
- 设置合理的本地缓存 TTL,避免脏读。
缓存合理使用能极大提升性能,但一致性、容量、高可用都需要仔细设计。