- 在 HoTimeCache 中新增 SessionsGet、SessionsSet 和 SessionsDelete 方法,支持批量获取、设置和删除 Session 缓存 - 优化缓存逻辑,减少数据库写入次数,提升性能 - 更新文档,详细说明批量操作的使用方法和性能对比 - 添加调试日志记录,便于追踪批量操作的执行情况
6.6 KiB
6.6 KiB
| name | overview | todos | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 缓存表模式配置 | 为 CacheDb 添加 mode 配置项,支持 "new"(默认,只用新表)和 "compatible"(写新读老)两种模式,并更新配置说明。 |
|
缓存表模式配置实现计划
需求概述
在 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 方法来读取老表数据,该方法需要:
- 查询老表数据
- 检查
endtime(unix 时间戳)是否过期 - 如果过期:删除该条记录,返回 nil
- 如果未过期:返回数据
4. 修改 set 方法(写新删老)
- new 模式:只写新表(老表保留但不再管理)
- compatible 模式:写入新表 + 删除老表中相同 key 的记录
这样可以主动加速老数据消亡,而不是等自然过期。
5. 修改 delete 方法
- new 模式:只删除新表(老表保留但不再管理)
- compatible 模式:同时删除新表和老表中的 key
这是必要的,否则删除新表后,下次读取会回退读到老表的数据,造成"删不掉"的问题。
需要新增 deleteLegacy 方法处理老表删除逻辑
6. 更新缓存初始化
在 cache/cache.go 的 Init 方法中读取 mode 配置:
that.dbCache = &CacheDb{
// ...
Mode: db.GetString("mode"), // 读取 mode 配置
}
7. 更新配置说明
在 var.go 的 ConfigNote 中添加 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 配置示例 |