显式状态与不变量Explicit state and invariants
为重要状态设置明确表示,规定修改前后必须成立的关系。
- 核心约束
- 所有修改入口共同维护同一组约束,例如 0 ≤ 已用长度 ≤ 容量。
- 适用问题
- 二进制缓冲区、对象生命周期、缓存状态与协议解析。
- 边界与取舍
- 冗余状态可能不同步;绕过封装会使原有不变量失效。
常见操作#
以 Redis SDS 保存 len、alloc 和终止符为例;n 为字符串长度。
| 操作 | 时间成本 | 条件与说明 |
|---|---|---|
| 读取长度 / 剩余容量 | 从明确维护的元数据读取,无需每次扫描内容。 | |
| 追加内容并更新状态 | 拷贝新增内容 + 必要扩容 | 必须同时维护长度、容量和终止符;不能只更新其中一个字段。 |
| 核验不变量 | 按检查内容计费 | 局部边界可常数检查;验证整个结构一致性可能需要遍历。 |
实施成本#
- 时间成本
- 新增元数据可省重复扫描,但更新时必须维护
- 空间成本
- 长度 / 容量等元数据及可选冗余状态
这是一种设计方法而非独立算法。额外状态也可能因更新遗漏而失真,需在变更入口集中维护并用测试验证。
工程中的应用#
1 个案例 · 附源码Redis SDS 把字节长度与可用容量放进头部,追加按长度复制,正文允许包含零字节。
附源码片段 · 内存管理