redis-read-timing.md 4.5 KB

最终会话回读拆分与定向读取(F101/F102)

RedisContextSaver把同一会话的全部检查点、待处理写入及请求历史存入一个hash。F101时get_tuple调用HGETALL取回全部字段,再选中并解码最新/指定检查点及其待处理写入。F102改为单次Lua:HKEYS在服务端扫描字段名,选择对应命名空间内最新/指定检查点,仅HGET并回传该检查点及它的pending writes。历史列表接口仍全量读取。

读取原子执行,避免并发写入或过期发生在选择与取值之间。旧v1 hash直接兼容,不迁移、不删除历史、不刷新读取TTL、不跳过最终get_state。新建会话首轮也产生多个检查点,因此同样适用。服务重启后,新request_performance按原thread_id/request_id记录数值统计,旧请求无法回填。

耗时(metrics.spans)

下列名称后缀.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网络。不同类别解码按实际次数累加。

数据量(metrics.measurements)

每项提供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验证;未增加缓存或绕过回读,未重放业务请求或重启服务,不承诺固定提速。