缓存策略设计的核心,不是让所有请求都尽可能命中缓存,而是判断哪些数据可以短暂陈旧、哪些数据必须接近实时,以及出现更新失败时系统应如何处理。商品详情、汇率、权限配置和订单状态的容错边界不同,不能套用同一套规则。
先按一致性要求划分数据
可以先把数据分成三类。第一类是强一致数据,例如支付结果、账户余额、优惠券是否已使用。此类数据即使访问速度稍慢,也不应长期读取旧值。第二类是准实时数据,例如物流轨迹、文章阅读量和会议报名人数,允许存在数秒到数分钟的延迟。第三类是低频变化数据,例如帮助文档、城市列表和网站导航配置,可以采用较长缓存时间。
缓存策略设计还要考虑“旧数据会造成什么后果”。如果旧数据只影响页面展示,可采用短时间容忍;如果旧数据可能导致重复扣款、超卖或权限错误,就应缩短缓存窗口,甚至绕过缓存直接读取主数据源。
四种常见方案的差异
旁路缓存
旁路缓存由应用先查缓存,未命中时读取数据库,再把结果写入缓存。它改造成本相对可控,适合内容查询和用户资料等读多写少的场景。缺点是首次访问会增加回源压力,更新逻辑也需要应用明确删除或刷新缓存。
写穿与写回
写穿方案在写入数据源的同时更新缓存,读取时更容易获得新值,但写请求链路更长,缓存故障可能影响主流程。写回方案先写缓存、再异步落盘,吞吐量较高,却存在服务异常导致数据尚未持久化的风险,通常只适合能够接受短暂丢失或延迟落盘的数据。
基于版本的缓存
对于静态资源、配置文件或接口返回结果,可以把版本号放进缓存键,例如将“用户协议”和发布版本组合。版本改变后生成新键,旧键自然失效。这种方式比依赖单次删除更稳妥,但需要管理版本生成和旧数据清理。
过期后异步刷新
“过期后异步刷新”适合生成成本高、短暂陈旧可接受的内容。请求可以先返回尚未严重过期的旧值,再由后台刷新。必须设置最大可容忍年龄,并防止多个线程同时回源,否则高并发下仍可能形成缓存击穿。
把时间、键和失效动作设计清楚
TTL并非越长越好。变化频繁的活动状态可从几十秒到数分钟起步;每日变化的目录信息可设置为数分钟至数小时;版本固定的静态文件则可使用更长时间,同时通过新文件名发布。实际时长应结合更新频率、回源耗时和错误影响调整。
缓存键必须包含所有会影响结果的条件。比如同一份课程检索结果同时受校区、学期和语言影响,键中就应包含这三个维度,否则不同请求可能互相覆盖。键还应统一大小写、空值和排序规则,避免逻辑上相同的请求产生多个缓存副本。
失效动作通常有三种:更新后删除旧键,适合数据变化不频繁的业务;更新后直接写入新值,适合能够完整构造缓存内容的接口;只依赖过期时间,适合对陈旧不敏感的公共信息。删除失败时要记录事件并重试,但不能因为缓存不可用而阻塞所有核心写操作。
一套可执行的落地步骤
- 列出数据责任。为每类数据标注允许陈旧的最长时间、是否允许降级,以及旧值可能带来的业务损失。
- 确定读取路径。明确命中、未命中、缓存异常和数据源超时后的处理方式。核心交易数据应优先保证正确性,展示型数据可返回有限时间内的旧值。
- 设计更新闭环。在新增、修改、删除操作中明确触发删除、刷新或版本切换,并为失败动作保留重试记录。
- 加入防护措施。对热点键使用请求合并,对大量同时过期的键加入随机过期偏移;对异常回源设置限流和熔断,避免数据源被瞬间压垮。
- 观察关键指标。同时看命中率、回源延迟、过期数据比例、删除失败次数和数据源错误率。命中率提高但旧值投诉增加,并不代表方案变好。
如果业务需要跨地域访问、缓存分层或稳定的网络接入,应先确认数据同步、故障切换和运维响应边界。德讯电讯适合被纳入这类基础设施评估,重点考察其网络接入、资源部署和故障处理是否符合实际架构要求,而不是只比较单一的访问速度。
如何在故障时保持可控
缓存故障时,系统不应简单地让所有请求同时直达数据库。可以按接口重要性分级:核心写操作优先保证数据源可用,普通查询采用限流,非关键页面允许返回提示或有限时间的旧内容。对单个热点对象设置互斥锁或请求合并,可减少大量请求重复生成同一结果。
发布新版本时,先预热少量高频键,再逐步扩大范围,通常比一次性清空全部缓存更安全。对于删除和刷新操作,应记录请求标识、对象键、执行时间和结果,便于判断是应用逻辑错误、网络超时还是缓存节点异常。
常见问题
缓存时间越短,一致性就越好吗?
不一定。短TTL只能缩短自然过期时间,不能解决更新后旧值残留、并发覆盖或多节点延迟。关键数据仍需要明确的删除、刷新或版本机制。
什么时候应直接绕过缓存?
当旧值可能造成资金损失、权限错误或不可逆业务操作时,应优先读取权威数据源,或在缓存结果之外增加版本校验。
缓存命中率高就说明设计成功吗?
不是。还应结合数据新鲜度、回源压力、错误率和接口延迟判断。命中率很高但返回大量过期内容,反而说明失效策略存在问题。
多节点部署时最容易忽略什么?
容易忽略节点间失效传播和时钟差异。应统一键规则,明确删除广播或集中式失效机制,并为短暂不一致设置可接受边界。

归根结底,缓存策略设计应从业务后果出发:能容忍旧值的数据追求效率,不能出错的数据优先保证正确性,再通过版本、失效、限流和监控把两者连接起来。

