redis存储状态
为什么用redis
Redis通过 RedisSessionManager 类来管理用户会话,存储结构如下:
1 | session:{user_id} -> { |
主要功能
- 会话创建与维护 :为每个用户创建唯一会话,支持会话超时自动清理
- 状态跟踪 :实时跟踪智能体执行状态(空闲、运行中、中断、完成、错误)
- 中断恢复支持 :当智能体需要人工干预时,Redis保存中断状态,支持后续恢复执行
- 用户管理 :统计活跃用户数量,管理多用户并发访问
与PostgreSQL的分工
- Redis :负责临时会话状态和实时数据(快速读写)
- PostgreSQL :负责智能体的长期记忆存储(通过LangGraph的checkpointer)
为什么不使用pgsql完成对状态的存储
频繁读写 :会话状态需要频繁更新(每次请求都要更新状态),PostgreSQL的磁盘I/O比Redis内存操作慢很多4
短期记忆(PostgreSQL + LangGraph Checkpointer)
临时状态记忆(Redis)
redis实现状态存储业务逻辑总览图
使用redis的根本逻辑:存储对话的状态,当出现由工具调用或者客户端崩溃导致的中断时,可以存储状态在redis,在开始对话时,通过session_id获取redis的状态,并根据状态判断是要恢复中断还是正常对话
存储的redis(调用invoke_agent接口):开始(创建)对话时要根据会话user_id获取或创建redis;再调用agent后,根据响应是否存在status字段是否是”interrupt”,判断是否有终端,最后更新redis状态
恢复的redis(调用resume_agent接口):获取redis状态,并根据请求的恢复内容,使用Command命令恢复agent,最后更新redis
redis类
1 | # 初始化异步 Redis 连接和会话配置 |
| 方法名 | 作用 | 输入参数 | 返回值 | 备注 |
|---|---|---|---|---|
__init__ |
建立与 Redis 的异步连接并设置会话超时 | redis_host, redis_port,
redis_db, session_timeout |
- | decode_responses=True 使 Redis 返回字符串而非字节 |
close |
优雅关闭 Redis 连接 | - | - | 异步方法,需 await |
create_session |
为指定用户新建(或覆盖)会话记录 | user_id, 可选 session_id,
status, last_query,
last_response, last_updated |
str:生成的 session_id |
会话键格式:session:{user_id};过期时间为
session_timeout |
get_session |
读取指定用户的完整会话字典 | user_id |
dict 或 None |
自动将 JSON 里的 last_response 反序列化为
AgentResponse 对象 |
update_session |
增量更新已有会话的字段 | user_id, 可选 status,
last_query, last_response,
last_updated |
bool:True 更新成功,False
用户不存在 |
更新后刷新过期时间 |
delete_session |
删除单个用户的会话 | user_id |
bool:True 删除成功 |
直接删除 session:{user_id} |
get_session_count |
计算当前活跃会话总数 | - | int |
使用异步扫描 session:* 键空间 |
get_all_user_ids |
取出所有已创建会话的 user_id |
- | List[str] |
同样基于 session:* 扫描 |
user_id_exists |
快速判断某用户是否已有会话 | user_id |
bool |
利用 EXISTS 命令 |
安装redis
linux系统
1 | sudo apt update |
docker
1 | # Docker Compose 配置文件,用于启动 Redis 服务 |
1 | docker run -d --name redis -p 6379:6379 -v redis-data:/data redis:latest |