模块 2 · 会话记忆

session_repository + Redis 会话窗口(memory_service.py):
Redis 窗口,MySQL 权威

对话每轮消息同步写 MySQL(权威),同时用 Redis 缓存最近 N≤20 条,TTL 2 小时。读历史时 Redis 命中快,miss 则回源 session_repository。

数据流:用户发第二条消息

🚪对话 HTTP 入口(chat.py)
🗄session_repository
⚡Redis 会话窗口(memory_service.py)

Key 格式:sess:{agent}:{session_id}:msgs

降级策略: Redis 写失败只打 warning,不阻塞对话;读失败回源 MySQL。指挥 AI 加缓存时别破坏「MySQL 为准」这条铁律。
Redis 会话窗口(memory_service.py)
def window_key(agent_type, session_id):
    return f"sess:{agent_type}:{session_id}:msgs"

def get_recent(agent_type, session_id, limit=20):
    raw = get_gateway().lrange(window_key(...), -limit, -1)
    if raw: return [json.loads(item) for item in raw]
    return SessionRepository().list_messages(session_id, limit=limit)

def append_window(...):
    client.rpush(key, ...); client.ltrim(key, -20, -1); client.expire(key, 7200)
白话

每个会话在 Redis 里是一条 List,key 带 agent 类型防串线。

读:先捞 List 尾部 N 条;空或报错就去 MySQL 查 agent_message 表。

写:新消息 RPUSH 进去,LTRIM 砍掉太老的,EXPIRE 两小时自动过期。

session_repository 管表结构、分页列表、关闭会话——和合规审计表分开。

Redis 里 sess:customer:xxx:msgs 过期了,历史消息去哪了?