1. 分布式缓存与本地缓存的本质差异
第一次接触分布式系统时,我也曾困惑为什么不能直接用本地缓存。直到某次线上事故让我彻底明白了二者的本质区别——那次我们某个服务的本地缓存数据与数据库严重不一致,导致用户看到的价格与实际支付金额相差巨大。
本地缓存就像你办公桌抽屉里的便签纸:
- 访问速度极快(纳秒级)
- 只对当前JVM进程有效
- 生命周期随应用重启而消失
- 典型实现:HashMap、Guava Cache、Caffeine
分布式缓存则如同公司的共享文件服务器:
- 访问需要网络开销(毫秒级)
- 对所有服务实例可见
- 数据持久化独立于应用
- 典型代表:Redis、Memcached
关键经验:我曾用JMeter压测对比过Caffeine和Redis——单机QPS可达50万 vs 10万,但跨服务数据一致性才是真正的痛点。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 分布式缓存的不可替代价值
去年双十一大促期间,我们的商品服务需要支撑每秒20万次查询。如果只用MySQL,按照单机5000QPS计算需要40台数据库实例,而引入Redis后只需5台。
必须用分布式缓存的场景:
- 多服务实例共享数据(如用户会话)
- 高频读写且允许短暂不一致(如商品库存)
- 计算成本高的中间结果(如推荐算法模型)
典型误区警示:
- 把Redis当数据库用:曾有个团队把所有用户数据塞进Redis,结果内存爆满导致全站崩溃
- 无限制的TTL设置:某次凌晨缓存集体失效,数据库直接被流量打挂
3. 多级缓存架构的平衡艺术
我们的订单系统最终采用这样的层级结构:
code复制用户请求 → Nginx本地缓存 → Redis集群 → MySQL
各级缓存配置要点:
| 缓存层级 | 命中率 | 过期时间 | 更新策略 |
|---|---|---|---|
| Nginx | 15-20% | 10s | LRU淘汰 |
| Redis | 60-70% | 30分钟 | 主动更新 |
| MySQL | - | - | 源头数据 |
血泪教训:某次在Nginx层缓存了商品详情页,但忘记设置`Cache-Contro
