线上出现接口偶发返回旧数据,应用使用本地缓存、Redis 和数据库三级读取链路,如何定位缓存一致性问题并设计失效策略?
旗舰版来源:xiaohongshu中级工程师重试策略Redis集群主从切换缓存一致性
答案解析
我会先把问题拆成两部分:到底是哪一级缓存返回了旧数据,以及数据更新链路中哪个环节没有完成失效。
定位时会先给请求加上 traceId,并在应用日志中记录数据版本号、更新时间、命中的缓存层级、本地缓存 key、Redis key 和数据库查询结果。重点确认几种情况:
本地缓存命中旧数据,说明实例内缓存没有及时失效,或者本地缓存 TTL 过长。 Redis 命中旧数据,说明更新后 Redis 删除或更新失败,或者 key 设计、序列化版本存在问题。 Redis 没命中但数据库仍然是旧数据,需要确认是否读了从库,以及是否存在主从复制延迟。 数据库已经是新数据,但接口仍然返回旧数据,基本可以判断是本地缓存或 Redis 的一致性问题。
同时会检查更新链路和失效链路的日志、Redis 操作结果、消息消费情况,以及多实例之间是否存在某个实例没有收到失效通知。线上偶发问题通常还要重点关注删除失败、网络抖动、超时重试、并发读写时序,以及数据库事务提交和缓存删除之间的时间窗口。
策略上我一般采用 Cache Aside,也就是读请求先查本地缓存,再查 Redis,最后查数据库;写
登录后查看完整内容
