Skip to content

[BUG] Redis 聊天记忆 saveAll 应原子替换并保留失败前历史 #51

Open

Description

@Aias00

基线与代码依据

Extensions 495414b76a37aca4d7c1022d973a8e5b9a7e92e6;Core 76d44429fdaa6a69320e21a1cb77119d0889d792。两个仓库已更新,远端均无新提交。

已复现问题

三个实现都分开执行删除和列表写入,没有原子替换边界。Redisson 还在删除旧列表后才序列化新消息。

实际 Redisson 仓库的两个独立复现:

  1. 两个 saveAll 各写一条快照;在 RList.delete 设置屏障,使两次删除先完成,再执行两次 addAll。最终保存两条消息,即两份快照混合,既不是完整 A,也不是完整 B。
  2. 新消息 metadata 包含循环引用使实际序列化器失败;旧列表已经执行 delete,保存抛错后历史为空。Jedis/Lettuce 预先序列化,但仍有 DEL/RPUSH 间的并发与故障窗口。

交付与验收

  • 所有校验和序列化在破坏现有记录之前完成;serialization failure 不删除旧历史。
  • 为整个快照定义 Redis 侧原子替换,读取只能看见旧或新完整快照;明确 Lua、事务或临时 key 交换的选择和 Cluster key-slot 约束。
  • 覆盖并发写、写入与读取交错、空列表、序列化失败、命令失败和三客户端互读,真实 Redis 上验证。
  • 原子替换不等于合并多个上层 read-modify-write;若仍采用最后写入者覆盖,明确该语义,不宣称解决所有对话并发丢更新。
  • 保持或明确迁移旧列表格式、key、TTL 策略,不对旧消息进行无依据重排。

验证边界与变更约束

本次使用当前实际编译类进行可执行验证,Redis 客户端/命令边界使用 Mockito 替换,未声称已通过真实 Redis、TLS 握手或集群验收。修复需增加真实后端验证。优先局部修复;若涉及公开 API、默认行为、坐标或存量数据,说明消费者影响、兼容替代、迁移/回滚及目标版本,不等待 Agent/Workflow/Loop 全局重构。关联 #30、#34;#34 是包职责整理,本单是具体运行行为缺陷。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions