核心策略:使用Redis作为缓存层时,采用"写穿透"或"写回"模式结合缓存失效机制,确保数据一致性。访问流程:先查缓存,miss时查数据库并回写缓存;更新时先更新数据库再删除缓存(Cache Aside模式)。穿孔预防:设置合理的TTL,避免热点key使用分布式锁。性能优化:批量操作用Pipeline,序列化用高效格式如Protocol Buffers。监控:用INFO命令追踪命中率,低于80%及时调整。
缓存穿透解决方案
缓存穿透是指查询一个根本不存在的数据,导致请求每次都打到数据库,造成压力。解决方案:1. 对空结果也缓存(设置短TTL,如30秒)。2. 使用布隆过滤器(Bloom Filter)快速判断key是否存在。3. 接口层增加校验参数合法性。
缓存雪崩防护
缓存雪崩是大量key同时失效,导致流量瞬间冲击数据库。预防措施:1. 设置不同key随机TTL(如基础TTL+随机0-300秒)。2. 多级缓存(本地缓存+Redis)。3. 限流熔断,使用Hystrix或Sentinel。4. 预热缓存,在启动时加载热点数据。
缓存热点key管理
热点key单点压力大,解决方案:1. 热点key本地缓存(如Caffeine或Guava)。2. 双层缓存:本地+Redis。3. 使用Redis Cluster分片。4. 定时任务分散加载热点数据,避免集中失效。
数据一致性保障
强一致性难实现,选最终一致性:1. Update DB then Delete Cache(双删策略:删一次,延迟500ms删第二次)。2. Canal订阅binlog异步更新缓存。3. 分布式事务用TCC或Saga模式。读时:Cache Aside,优先读缓存。
Redis访问优化实践
1. Pipeline批量命令减少RTT。2. 避免大key,用Hash拆分。3. 监控QPS、内存使用,设置maxmemory-policy allkeys-lru。4. 连接池配置:maxTotal 100,maxIdle 20。5. 序列化:Kryo优于Java默认。
常见故障排除
延迟高:检查慢查询用SLOWLOG,网络瓶颈用ping。内存不足:eviction生效,优化数据结构。主从延迟:半异步复制,调整repl-backlog-size。集群问题:检查slot迁移,用cluster nodes查看状态。
FAQ
Q: 缓存穿透怎么快速解决?
A: 缓存空值并用布隆过滤器拦截不存在key。
Q: 如何防止缓存雪崩?
A: 给key加随机TTL,多级缓存+限流。
Q: 数据不一致怎么处理?
A: 先更新DB再删缓存,双删或binlog同步。
Q: Redis延迟高怎么办?
A: 用Pipeline,拆大key,查慢日志优化。