分享吉隆坡服务器 Redis 缓存策略实战,通过优化把缓存命中率提升到 95%。
Redis 缓存是提升性能的关键。本文分享吉隆坡服务器 Redis 缓存策略实战。
缓存的作用 1) 减少数据库压力 2) 降低响应延迟 3) 提升并发能力 4) 降低数据库成本 5) 保护数据库免受过载
缓存策略 1) Cache Aside:应用先查缓存,没有查数据库再写缓存 2) Read Through:缓存未命中时由缓存组件加载 3) Write Through:写时同时写缓存和数据库 4) Write Behind:先写缓存,异步写数据库 5) Refresh Ahead:缓存过期前刷新
Cache Aside 实现 ```python def get_data(key): data = redis.get(key) if data is None: data = db.query(key) redis.setex(key, 300, data) return data ```
缓存 key 设计 1) 命名规范:业务:对象:ID,如 user:123 2) 合理 TTL:根据数据更新频率 3) 避免大 Key:单个 value 不超过 10KB 4) 命名空间:按业务分组 5) 过期时间:避免同时过期
数据结构选择 1) String:简单 key-value,计数器 2) Hash:对象属性,如用户信息 3) List:消息队列,最新列表 4) Set:去重,标签 5) ZSet:排行榜,排序 6) 选对结构,性能和内存都优化
缓存更新策略 1) 删除缓存:更新数据库后删除缓存(推荐) 2) 更新缓存:更新数据库后更新缓存 3) 延迟双删:先删缓存,更新数据库,再删缓存 4) 消息队列:通过消息异步删除缓存 5) 推荐:更新数据库 + 删除缓存
缓存穿透 问题:查询不存在的数据,每次都打到数据库。 解决方案: 1) 缓存空值:查不到也缓存(短 TTL) 2) 布隆过滤器:不存在的直接过滤 3) 参数校验:非法参数直接返回
缓存击穿 问题:热点 key 过期瞬间,大量请求打到数据库。 解决方案: 1) 互斥锁:只一个请求查数据库 2) 永不过期:热点数据不设 TTL,后台刷新 3) 提前刷新:TTL 快到时后台刷新
缓存雪崩 问题:大量 key 同时过期,数据库压力骤增。 解决方案: 1) 过期时间加随机值 2) 多级缓存:本地缓存 + Redis 3) 限流降级:数据库过载时限流 4) 缓存预热:提前加载热点数据
缓存一致性 1) 强一致性:用分布式锁,写时删缓存 2) 最终一致性:消息队列异步删除 3) 延迟双删:减少不一致窗口 4) 定时校验:定期对比缓存和数据库 5) 业务容忍:允许短暂不一致的场景
内存优化 1) maxmemory-policy:allkeys-lru 或 volatile-lru 2) 合理 TTL:及时释放内存 3) 数据结构优化:用 Hash 存对象,省内存 4) 压缩:大 value 压缩 5) 分片:数据量大时分片
监控指标 1) 命中率:keyspace_hits / (hits + misses) > 90% 2) 内存使用率:< 80% 3) 连接数:< maxclients 4) 慢查询:slowlog 5) 大 Key:定期扫描
效果对比 | 指标 | 优化前 | 优化后 | | --- | --- | --- | | 缓存命中率 | 60% | 95% | | 数据库 QPS | 5000 | 800 | | 响应时间 | 200ms | 30ms | | 数据库 CPU | 85% | 35% | | 并发能力 | 5000 | 20000 |
常见问题 问题一:命中率低 原因:key 设计不合理;TTL 太短。 解决:优化 key;调整 TTL;缓存热点数据。
问题二:缓存不一致 原因:更新策略不当。 解决:删除缓存 + 延迟双删;消息队列异步。
问题三:内存不够 原因:缓存太多;大 Key。 解决:设置 TTL;淘汰策略;拆分大 Key。
问题四:Redis 宕机 原因:内存满;硬件故障。 解决:持久化;主从复制;集群;限流降级。
总结:Redis 缓存要设计好 key、TTL、更新策略、防穿透击穿雪崩。命中率 95%+ 才能真正减轻数据库压力。