hotime/.cursor/plans/缓存表模式配置_49ed5633.plan.md
hoteas 3d83c41905 feat(cache): 增加批量操作支持以提升性能
- 在 HoTimeCache 中新增 SessionsGet、SessionsSet 和 SessionsDelete 方法,支持批量获取、设置和删除 Session 缓存
- 优化缓存逻辑,减少数据库写入次数,提升性能
- 更新文档,详细说明批量操作的使用方法和性能对比
- 添加调试日志记录,便于追踪批量操作的执行情况
2026-01-30 17:51:43 +08:00

6.6 KiB
Raw Blame History

name overview todos
缓存表模式配置 为 CacheDb 添加 mode 配置项,支持 "new"(默认,只用新表)和 "compatible"(写新读老)两种模式,并更新配置说明。
id content status
add-mode-field 在 CacheDb 结构体中添加 Mode 字段 completed
id content status dependencies
modify-init 修改 initDbTable根据 Mode 决定是否迁移删除老表 completed
add-mode-field
id content status dependencies
add-legacy-get 添加 getLegacy 方法读取老表数据unix时间戳格式 completed
add-mode-field
id content status dependencies
modify-get 修改 get 方法compatible 模式下回退读取老表 completed
add-legacy-get
id content status dependencies
modify-set 修改 set 方法compatible 模式下写新表后删除老表同key记录 completed
add-mode-field
id content status dependencies
modify-delete 修改 delete 方法compatible 模式下同时删除新表和老表 completed
add-mode-field
id content status dependencies
update-cache-init 在 cache.go Init 方法中读取 mode 配置 completed
add-mode-field
id content status
update-config-note 在 var.go ConfigNote 中添加 mode 配置说明 completed
id content status dependencies
add-cache-test 在 example/main.go 中添加缓存测试路由 completed
modify-get
modify-set
modify-delete
update-cache-init
id content status
todo-1769763169689-k7t9twp5t QUICKSTART.md 更新:缓存配置部分需要添加 mode 和 history 配置说明 pending

缓存表模式配置实现计划

需求概述

cache/cache_db.go 中实现两种缓存表模式:

  • new(默认):只使用新的 hotime_cache 表,自动迁移老表数据
  • compatible:写入新表,读取时先查新表再查老表,老数据自然过期消亡

实现步骤

1. 修改 CacheDb 结构体

cache/cache_db.go 中添加 Mode 字段:

type CacheDb struct {
    TimeOut    int64
    DbSet      bool
    SessionSet bool
    HistorySet bool
    Mode       string // "new"(默认) 或 "compatible"
    Db         HoTimeDBInterface
    // ...
}

2. 修改初始化逻辑 initDbTable

  • new 模式:创建新表、迁移老表数据,但不删除老表(删除交给用户手动操作,更安全)
  • compatible 模式:创建新表,不迁移也不删除老表

两种模式都不自动删除老表,避免自动删除造成数据丢失风险

3. 修改 get 方法

  • new 模式:只从新表读取
  • compatible 模式:先从新表读取,如果没有再从老表读取

需要新增 getLegacy 方法来读取老表数据,该方法需要:

  1. 查询老表数据
  2. 检查 endtimeunix 时间戳)是否过期
  3. 如果过期:删除该条记录,返回 nil
  4. 如果未过期:返回数据

4. 修改 set 方法(写新删老)

  • new 模式:只写新表(老表保留但不再管理)
  • compatible 模式:写入新表 + 删除老表中相同 key 的记录

这样可以主动加速老数据消亡,而不是等自然过期。

5. 修改 delete 方法

  • new 模式:只删除新表(老表保留但不再管理)
  • compatible 模式:同时删除新表和老表中的 key

这是必要的,否则删除新表后,下次读取会回退读到老表的数据,造成"删不掉"的问题。

需要新增 deleteLegacy 方法处理老表删除逻辑

6. 更新缓存初始化

cache/cache.goInit 方法中读取 mode 配置:

that.dbCache = &CacheDb{
    // ...
    Mode: db.GetString("mode"), // 读取 mode 配置
}

7. 更新配置说明

var.goConfigNote 中添加 mode 配置说明:

"db": Map{
    // ...
    "mode": "默认new非必须new为只使用新表自动迁移老数据compatible为兼容模式写新表读老表老数据自然过期",
}

8. 编写测试

example/main.go 中添加缓存测试路由,测试覆盖:

new 模式测试:

  • 基础读写set/get/delete 正常工作
  • 过期测试:设置短过期时间,验证过期后读取返回 nil
  • 数据迁移:验证老表数据能正确迁移到新表
  • 老表保留:验证迁移后老表仍存在(不自动删除)

compatible 模式测试:

  • 新表读写:优先从新表读取
  • 老表回退:新表没有时从老表读取
  • 过期检测:读取老表过期数据时返回 nil 并删除该记录
  • 写新删老:写入新表后老表同 key 记录被删除
  • 删除双表:删除操作同时删除新表和老表记录
  • 通配删除:key* 格式删除测试

边界情况测试:

  • 空值处理nil 值的 set/get
  • 不存在的 key 读取
  • 重复 set 同一个 key
  • 超时时间参数测试(默认/自定义)

架构图

flowchart TD
    subgraph Config[配置]
        ModeNew["mode: new (默认)"]
        ModeCompat["mode: compatible"]
    end
    
    subgraph NewMode[new模式]
        N1[初始化] --> N2[创建新表]
        N2 --> N3{老表存在?}
        N3 -->|是| N4[迁移数据到新表]
        N4 --> N5[保留老表由人工删除]
        N3 -->|否| N6[完成]
        N5 --> N6
        
        NR[读取] --> NR1[只查询新表]
        NW[写入] --> NW1[只写入新表]
        ND[删除] --> ND1[只删除新表记录]
    end
    
    subgraph CompatMode[compatible模式]
        C1[初始化] --> C2[创建新表]
        C2 --> C3[保留老表]
        
        CR[读取] --> CR1[查询新表]
        CR1 -->|未找到| CR2[查询老表]
        CR2 --> CR3{过期?}
        CR3 -->|是| CR4[删除老表记录]
        CR4 --> CR5[返回nil]
        CR3 -->|否| CR6[返回数据]
        
        CW[写入] --> CW1[写入新表]
        CW1 --> CW2[删除老表同key]
        
        CD[删除] --> CD1[删除新表记录]
        CD1 --> CD2[删除老表记录]
    end

文件修改列表

| 文件 | 修改内容 |

|------|----------|

| cache/cache_db.go | 添加 Mode 字段、修改 initDbTable、添加 getLegacy含过期检测删除、修改 get、修改 set写新删老、修改 delete |

| cache/cache.go | 读取 mode 配置 |

| var.go | ConfigNote 添加 mode 说明 |

| example/main.go | 添加缓存测试路由 |

| example/config/config.json | 可选:添加 mode 配置示例 |