本地缓存+分布式缓存多级结构如何协同工作?如何保持一致性?

一、多级缓存协同工作逻辑

多级缓存(本地缓存+分布式缓存)通过"层层拦截请求"降低分布式缓存压力,核心流程如下:

  • 1.优先查本地缓存:应用进程优先读取本地缓存(如Java的Caffeine、Guava Cache),命中则直接返回,响应最快(微秒级)。

  • 2.本地未命中查分布式缓存:若本地缓存无数据,再请求分布式缓存(如Redis、Memcached),命中后返回数据,并同步更新本地缓存(避免下次重复查分布式)。

  • 3.分布式未命中查数据库:若分布式缓存也未命中,最终查询数据库,将结果同步写入分布式缓存和本地缓存,完成"三级存储"闭环。

二、一致性保持方案

多级缓存的一致性核心是"避免本地缓存与分布式缓存/数据库数据不一致",需针对性处理两类场景:

1. 数据更新时的一致性保障

先更数据库,再删缓存(而非更新):

①.业务系统先更新数据库数据; ②.删除分布式缓存中对应key(避免直接更新缓存导致的并发覆盖问题); ③.可选:通过"过期时间"让本地缓存自动失效(或发送通知主动清理集群内其他节点的本地缓存)。

为何不直接更新缓存?:若并发场景下,A更新数据库后未更缓存,B先查缓存(旧值)再更新数据库,会导致缓存被B的旧值覆盖,数据不一致。

2. 本地缓存的"失效补偿"

TTL过期策略

  • 设置合理过期时间:本地缓存必须配置过期时间(如10-30秒),即使未主动清理,也能通过过期自动对齐分布式缓存数据,避免长期不一致。

主动失效策略

  • 分布式通知清理:若业务对一致性要求极高,可通过MQ或广播机制,当分布式缓存key被删除时,通知所有应用节点清理本地缓存中对应的key。

版本号控制

  • 每次数据更新时递增版本号,版本缓存时带上版本号,读取时校验版本号。可以使用版本号的方式保证数据的一致性

3. 极端场景兜底:缓存降级

  • 若分布式缓存故障,可临时让本地缓存直接查数据库更新(降级策略),避免服务雪崩;待分布式缓存恢复后,再重新同步数据。

4. 缓存层级策略

本地缓存 分布式缓存 数据库
热点数据,配置信息,用户会话等 共享数据,大容量数据,需要持久化数据 完整的业务数据,需要事务保证的数据

5.实施策略对比

策略 一致性 性能影响 实现复杂度 应用场景
主动失效 较强 中等 强一致性要求
TTL过期 最终一致性 高性能要求
版本号 强一致性 强一致性要求
组合策略 可调整 可调整 复杂业务场景
相关推荐
追逐时光者4 小时前
一个基于 ASP.NET Core 的开源、模块化、多租户应用框架和内容管理系统
后端·.net
小蒜学长5 小时前
springboot二手儿童绘本交易系统设计与实现(代码+数据库+LW)
java·开发语言·spring boot·后端
xqlily5 小时前
Go语言:高效简洁的现代编程语言
开发语言·后端·golang
数据知道5 小时前
Go语言:数据压缩与解压详解
服务器·开发语言·网络·后端·golang·go语言
席万里5 小时前
什么是GO语言里面的GMP调度模型?
开发语言·后端·golang
UrbanJazzerati5 小时前
考研英语深挖 “I wonder if it isn't...” —— 否定式疑问背后的肯定式锋利观点
面试
双向336 小时前
CodeBuddy Code + 腾讯混元打造"AI识菜通"
面试
Terio_my6 小时前
Spring Boot 热部署配置与自定义排除项
java·spring boot·后端
大鱼七成饱7 小时前
Rust的Option碰到指针Box:数据怎么解
后端
倔强的石头_7 小时前
【征文计划】Rokid 语音唤醒技术深度解析:从声学模型到低功耗优化实践
后端