第1章 离线缓存场景识别与系统边界
构建离线缓存系统的第一步是回答五个核心问题:缓存什么?离线多久?数据多重要?什么时候切换?谁在使用?这三个维度的答案直接决定了本地存储结构、数据一致性模型以及与远程服务的同步策略。本章从场景识别的边界出发,建立离线缓存的可度量框架。
1.1 系统边界定义
离线缓存系统的边界以“网络可用性”为分割线。在线一侧是远程服务(API、数据库、消息队列),离线一侧是本地存储与缓存引擎。边界上的关键动作是切换触发和数据同步。下图描述了核心边界要素与交互关系。
1.2 场景识别的四个关键维度
离线缓存的场景识别并不只是“有网/没网”的二元划分,需要从以下四个维度进行综合评估。每个维度都会影响后续的存储结构设计。
| 维度 | 核心问题 | 典型场景 | 对系统的影响 |
|---|---|---|---|
| 缓存目标 | 缓存哪些数据? | 用户资料、商品列表、地图瓦片、操作日志 | 决定本地存储格式与空间预算 |
| 离线时长等级 | 离线持续多久? | 秒级(网络抖动)、分钟级(隧道)、小时级(航班)、天级(偏远地区) | 决定缓存替换策略与持久化要求 |
| 数据一致性要求 | 离线数据能否过期? | 强一致(交易)、最终一致(资讯)、只读快照(配置) | 决定同步模型与冲突解决算法 |
| 网络切换触发条件 | 如何检测离线? | 心跳超时、信号阈值、手动模式、系统广播 | 决定切换延迟与用户体验 |
[设计提示] 实际项目中,优先定义最低支持的离线时长和可接受的数据新鲜度。这两个约束会直接筛选出可用的本地数据库候选。
1.3 离线时长等级划分
将离线时长划分为四个等级,每个等级对应不同的本地存储策略和资源预算。等级越高,对存储空间和数据持久性的要求越严格。
- 等级 L0(秒级):网络瞬间抖动,重试即恢复。使用内存缓存 + 本地容错队列即可,无持久化要求。
- 等级 L1(分钟级):短暂失联(如电梯、隧道)。需要写入本地数据库,但缓存淘汰策略可以激进。
- 等级 L2(小时级):长时间离线(如航班)。本地缓存需覆盖核心业务流程,并启用写日志机制。
- 等级 L3(天级+):极端离线(如野外作业)。需要全量数据副本,存储空间按 MB/GB 规划,同步使用批次增量。
1.4 数据一致性模型选择
数据一致性要求决定了缓存数据的有效期与同步触发机制。下表归纳了三种常见模型及其适用边界。
| 一致性模型 | 离线行为 | 冲突处理 | 适用场景 |
|---|---|---|---|
| 最终一致 | 离线可写,本地先应用 | 时间戳/版本号合并 | 资讯、社交动态、配置下发 |
| 弱一致 | 只读缓存,离线不可写 | 无需冲突处理 | 商品详情、只读报表 |
| 强一致(离线受限) | 离线不可操作或采用锁机制 | 悲观锁或保留写日志 | 交易系统、库存扣减 |
[风险提示] 强一致要求与离线写操作存在天然矛盾。如果业务要求强一致且允许离线写,必须引入冲突检测与补偿事务,这将显著增加系统复杂度。
1.5 网络切换触发条件清单
系统必须明确定义从在线模式切换到离线模式的触发条件,以避免频繁震荡或切换延迟。以下是四种常见触发模式:
- 心跳超时:连续 N 次心跳失败(通常 3 次,超时 5s/次),判定为离线。
- 信号强度阈值:RSSI 低于 -120 dBm 或网络类型降级到 2G/EDGE,主动切换。
- 应用层显式切换:用户手动开启「离线模式」,应用无条件进入离线缓存读写。
- 系统广播事件:监听 Android ConnectivityManager 或 iOS NWPathMonitor 的实时状态变化。
[关键指标] 切换延迟应控制在 < 500ms,切换过程中不能出现数据丢失或重复提交。建议为每次切换生成 sync_session_id 用于追踪。
1.6 本章边界总结
第 1 章完成了离线缓存场景的识别与系统边界定义。后续章节将基于本章确定的三个核心维度(目标、时长、一致性)继续深入:
- 第 2 章~第 4 章:本地存储结构设计与分层架构。
- 第 5 章~第 8 章:离线数据库选型与权衡。
- 第 9 章~第 15 章:同步引擎、冲突解决与信任链路。