从客户端到服务端多级缓存层层剖析总结为什么需要用缓存因为受制于机械硬盘的读写耗时的原因即使是SSD这种固态硬盘其读写IO耗时也是一个不小的耗时所以就引出了内存中存储也就是缓存的概念。像是电商这种读多写少的环境更适合使用多级缓存来提高读取的效率。多级缓存都包含哪些方面客户端浏览器层、Nginx负载均衡层 、进程内部层、 分布式Redis层完整链路分层浏览器缓存 → CDN 缓存 → 接入层缓存 → 应用本地缓存 → 分布式缓存 → 数据库缓存 → SSD/对象存储每层各司其职层层拦截请求降低底层 DB 压力。按照请求的流向从用户点击到数据库拆解这7层缓存的设计逻辑、核心技术选型和避坑指南第一层客户端本地缓存手机/浏览器位置APP内存、浏览器LocalStorage/SessionStorage、Cookie。作用拦截重复请求节省用户流量即使断网也能展示部分数据。技术浏览器使用HTTP强缓存Cache-Control: max-age和协商缓存ETagAPP使用内存图片缓存如Glide或序列化数据。痛点存储空间小通常10MB且容易被系统回收。第二层边缘/CDN缓存就近分发位置运营商机房或云厂商的CDN节点。作用承载图片、CSS/JS、视频等静态资源命中率极高能扛住80%以上的流量冲击。技术设置合理的URL失效时间如Cache-Control: public, max-age31536000配合回源策略。痛点动态接口如带Token的请求很难做CDN需配合边缘计算如Cloudflare Workers动态拼接缓存。第三层DNS/接入层缓存网关层位置Nginx、Apache或Spring Cloud Gateway。作用对全量静态页面如商品详情页HTML进行片段缓存减少下游Tomcat线程占用。技术Nginx的proxy_cache配合proxy_cache_key按URL参数区分可使用lua-resty-redis做更灵活的缓存决策。关键点这里适合做“动静分离”——动态数据走AJAX静态框架走Nginx缓存。第四层进程内缓存JVM/应用内存位置业务服务如Java应用的堆内存。作用速度最快微秒级专门存放热点字典数据如配置项、权限树、分类信息。技术CaffeineJava王者淘汰Guava、Ehcache。关键参数设置maximumSize防止OOM使用expireAfterWrite实现定时失效。痛点集群环境下每台机器缓存独立数据更新时需广播清除使用Redis的Pub/Sub或RocketMQ通知所有节点删除本地缓存。第五层分布式缓存Redis / Memcached——核心枢纽位置独立缓存集群。作用承上启下承载所有业务数据用户Session、热点商品、排行榜缓存击穿/雪崩发生在此层。高阶架构多级L1L2本地CaffeineL1做一级挡洪RedisL2做数据主存。读取时先L1后Redis极大减少网络IO。集群模式生产必须用Redis Cluster或Codis主从哨兵保证高可用。避坑慎用KEYS *不用FLUSHALL大Key必须拆分如将List拆为多个String。第六层数据库查询缓存MySQL Query Cache / 中间件位置数据库内部或MyBatis二级缓存。作用缓存相同SQL的执行结果减少数据库CPU计算。现状MySQL 8.0已移除Query Cache因为表更新导致大量失效弊大于利。替代方案MyBatis二级缓存极少开启易产生脏读或TiDB等NewSQL的行存缓存。实际生产中这层通常旁路掉直接交给Redis。第七层存储层冷热分离SSD/对象存储位置ClickHouse、Elasticsearch或OSS。作用对于海量历史数据如3年前的订单内存放不下利用SSD的高速读取或对象存储的归档能力充当“慢缓存”。策略通过TTL将热数据迁入Redis冷数据降级为ES或直接读库。一致性难题的解法核心痛点多级缓存最棘手的是数据更新时的一致性问题。业内通用的解法是Cache-Aside Pattern旁路缓存写操作先更新数据库删除而不是更新Redis缓存。读操作查Redis - 查DB - 回填Redis。最终一致性对于允许短暂不一致的场景如库存使用延迟双删写DB后休眠1秒再删一次Redis强一致性场景如金钱则不缓存直接读写DB。