RedisContextSaver把同一会话的全部检查点、待处理写入及请求历史存入一个hash。F101时get_tuple调用HGETALL取回全部字段,再选中并解码最新/指定检查点及其待处理写入。F102改为单次Lua:HKEYS在服务端扫描字段名,选择对应命名空间内最新/指定检查点,仅HGET并回传该检查点及它的pending writes。历史列表接口仍全量读取。
读取原子执行,避免并发写入或过期发生在选择与取值之间。旧v1 hash直接兼容,不迁移、不删除历史、不刷新读取TTL、不跳过最终get_state。新建会话首轮也产生多个检查点,因此同样适用。服务重启后,新request_performance按原thread_id/request_id记录数值统计,旧请求无法回填。
下列名称后缀.session_result_load表示最终get_state;.session_load表示开始读取。其他后缀是所在图阶段或other,不能混作最终读取。count/total_ms/max_ms/failed_count沿用原口径。
| 前缀 | 范围 |
|---|---|
| redis_hgetall | Redis客户端HGETALL调用到返回,包括连接获取、网络、服务器执行和客户端RESP解析,不能当作纯服务器执行时间 |
| redis_checkpoint_read | F102状态定向读取EVAL调用到返回,同样包括网络、服务器执行及客户端解析;取代get_tuple的redis_hgetall |
| redis_rows_parse | 返回字段名JSON解析、字典组装及新增计数开销;不解析历史value正文 |
| checkpoint_select | 扫描字段选择最新或指定检查点 |
| checkpoint_pending_select | 选取该检查点的pending writes,不含其解码 |
| checkpoint_json_decode | 选中value的JSON包裹层解析 |
| checkpoint_base64_decode | 选中value的Base64解码 |
| checkpoint_deserialize | LangGraph serde.loads_typed,恢复选中检查点和待处理写入 |
session_result_load总区间仍包含这些子项;它与子项的差额还包含LangGraph状态/任务组装和其他本地开销,不能全部归为Redis网络。不同类别解码按实际次数累加。
每项提供count、total、max,后缀同上。count是观测次数,total是各次量值之和,max是单次最大值;例如redis_returned_fields的total才是累计字段数。
| 前缀 | 量值 |
|---|---|
| redis_scanned_fields | 定向读在Redis服务端扫描的字段名数量,不表示返回了对应正文 |
| redis_returned_fields | 实际返回字段数;定向读仅为选中检查点及其pending writes,历史列表仍为全hash |
| redis_returned_bytes | 所有字段名和值的编码字节数之和 |
| redis_checkpoint_fields / redis_checkpoint_bytes | 检查点类字段数/字节量 |
| redis_write_fields / redis_write_bytes | pending write类字段数/字节量 |
| redis_request_fields / redis_request_bytes | 请求历史类字段数/字节量 |
| redis_other_fields / redis_other_bytes | 其他字段数/字节量 |
| checkpoint_pending_fields | 为当前选中检查点取出的pending write数量 |
| checkpoint_decoded_input_bytes | 实际进入_decode的编码value字节量,count表示解码value数量 |
| checkpoint_serialized_bytes | Base64解码后的序列化字节量,反序列化之前 |
字节量不含Redis协议封装/TCP/TLS头,也不等于Python对象内存大小。真实客户端返回bytes直接len计数,替身str按UTF-8计算。仅日志数值和固定分类,不写Redis键、字段名、checkpoint ID、历史原文、模型输入输出或异常正文。空会话也记录0字段/0字节;读取失败记录耗时和失败计数,未返回的数据不伪报为0。
重启后比较redis_checkpoint_read.session_result_load、redis_returned_bytes.session_result_load及session_result_load。定向读的返回量应接近选中解码量(差异含字段名)。服务器仍需O(N)扫描字段名,Lua执行期间占用Redis执行线程,大历史会话的容量需评测;最新检查点正文自身仍完整传输。不能按节省字节比例直接推算耗时收益。
正常完成请求的最终内容可以考虑复用内存状态,但当前流为tasks/updates,最终get_state还提供next/tasks/interrupts及pending writes恢复语义。不能只拿recommendation替代整个快照。F102已通过296项问答、82项API回归及真实Redis随机合成Lua/跨进程恢复/TTL验证;未增加缓存或绕过回读,未重放业务请求或重启服务,不承诺固定提速。