# F3 String 快照解析

通用 `parse` 现支持混合 String / Hash / List / Set。`parse_strings` 仍只接受 String，以下接口边界保持不变。

## 返回内容

`parse_strings` 读取完整格式版本 11 的 RDB 文件，支持 String 对象、AUX、数据库选择、容量提示、键前置元信息和完整 CRC64；非 String 对象仍明确失败。结果是 `StringSnapshot`，保留文件顺序的所有记录，不替换重复键、不读取时钟、不丢弃过期键。空库也可以使用此入口。`read_header` 和 `parse_empty` 的原有行为不变。

每条 `StringRecord` 保存：

- `database`、二进制安全的 `key` / `value`。
- `key_storage` / `value_storage`：`Raw`、`Integer8`、`Integer16`、`Integer32` 或 `Lzf`，分别表示输入中的实际存储编码。
- `expires_at_ms`、`idle_seconds`、`frequency`：原始元信息，缺省为 None。到期时间为 Int64 绝对毫秒，不转成相对 TTL；空闲时间和 LFU 频率不冒充运行时访问统计。
- `record_start` / `record_end`：原文件的半开字节区间，包含该记录前置元信息、对象类型、键和值。
- `serialized_bytes`：该区间长度，使用原文件压缩表示。`value.length()` 是解码后的值长度；二者都不是 Redis 运行时内存占用。

结果还保留 F2 的格式版本、AUX、数据库选择、容量提示、校验状态和文件长度。`global_overhead_bytes` 是文件长度减去所有记录区间，包含头部、全局元信息、数据库操作码和 EOF / 校验区。对成功输入，记录体积之和与全局开销可核对回文件长度。

## 字符串与 LZF

普通字符串按长度读取原始字节，不隐式转 UTF-8。整数编码按有符号 8 / 16 / 32 位小端值读取，转为精确十进制字节；前导零文本和超出整数编码范围的文本保持原字节。

参考固定 Redis 提交的 [rdbLoadLzfStringObject](https://github.com/redis/redis/blob/f60370ce28b946c1146dcea77c9c399d39601aaa/src/rdb.c#L391-L438) 以及 [lzf_d.c](https://github.com/redis/redis/blob/f60370ce28b946c1146dcea77c9c399d39601aaa/src/lzf_d.c)，按编码规则独立实现，未纳入上游 C 源码或二进制。LZF 字段包含压缩长度、解码长度和压缩载荷，长度字段只允许普通长度标记。

解压支持 1—32 字节字面量、回溯距离 1—8192、扩展匹配长度以及重叠引用。重叠匹配逐字节向前复制，允许新生成字节参与后续复制。字面量缺失、扩展长度／距离缺失、引用早于输出起点、输出越界、最终解码长度不匹配均返回带原文件偏移的 `InvalidLzf`；不会静默接受部分解压结果或忽略多余压缩载荷。

## 限制与内存边界

默认限制：完整输入 64 MiB，单个键／值／AUX 字符串解码后 1 MiB，保留的全局元信息 4096 条，String 记录 100000 条，累计解码字节 64 MiB。实际可选参数见生成接口：`max_input_bytes`、`max_string_bytes`、`max_metadata_entries`、`max_records`、`max_decoded_bytes`。负数配置明确失败，零表示不允许对应非空内容。

累计解码预算包含 AUX 键和值、记录键和值，按每次出现计数。LZF 输出声明长度在缩窄整数和分配前，先检查单串上限及累计预算；压缩载荷也必须在剩余输入范围内。整数转换只涉及固定的小型数字结果。单个字符串读取失败会恢复读取游标和预算，完整文件失败不会返回部分成功结果。

这些限制是逻辑数据预算，不是精确的进程峰值内存限制。原输入、记录对象、数组及解压暂存缓冲仍占空间。当前 API 保留所有解码记录，既不是回调扫描器，也不是恒定内存的分块文件解析；没有性能优势或任意大文件支持承诺。

## 实测范围

F3 交付时 native 测试为 59 项（含 3 项文档测试），在后续阶段中保留；完整测试现为 155 项。

新增真实 Redis 7.2.5 样本包含 DB 0 / 2 的 15 个合成键：普通、空键与空值、非 UTF-8 二进制、INT8/16/32 正负边界、保留前导零的文本、超过 JavaScript 安全整数范围的十进制文本、LZF 值与 LZF 键、绝对到期时间和 LRU 元信息。生成后由 Redis 检查文件，并在第二个隔离 Redis 进程重新加载，对每个键核对 GET 和 PEXPIRETIME；MoonBit 测试再逐键比较字节、编码和元信息，核对体积总和。

真实 String 文件的全部短前缀与每个字节的最低位修改均被拒绝。LZF 字面量、重叠／非重叠匹配、最长扩展匹配、最大回溯距离和恶意压缩载荷另有合成测试；压缩 AUX、重复键、LFU、旧秒时间、零时刻到期记录及资源上限也由合成测试覆盖。F4 另增真实 Hash 的 LFU 证据；旧秒编码仍无真实对象样本。没有导出格式或性能验收。
