221 lines
6.6 KiB
Markdown
221 lines
6.6 KiB
Markdown
|
|
---
|
|||
|
|
name: 缓存表模式配置
|
|||
|
|
overview: 为 CacheDb 添加 mode 配置项,支持 "new"(默认,只用新表)和 "compatible"(写新读老)两种模式,并更新配置说明。
|
|||
|
|
todos:
|
|||
|
|
- id: add-mode-field
|
|||
|
|
content: 在 CacheDb 结构体中添加 Mode 字段
|
|||
|
|
status: completed
|
|||
|
|
- id: modify-init
|
|||
|
|
content: 修改 initDbTable,根据 Mode 决定是否迁移删除老表
|
|||
|
|
status: completed
|
|||
|
|
dependencies:
|
|||
|
|
- add-mode-field
|
|||
|
|
- id: add-legacy-get
|
|||
|
|
content: 添加 getLegacy 方法读取老表数据(unix时间戳格式)
|
|||
|
|
status: completed
|
|||
|
|
dependencies:
|
|||
|
|
- add-mode-field
|
|||
|
|
- id: modify-get
|
|||
|
|
content: 修改 get 方法,compatible 模式下回退读取老表
|
|||
|
|
status: completed
|
|||
|
|
dependencies:
|
|||
|
|
- add-legacy-get
|
|||
|
|
- id: modify-set
|
|||
|
|
content: 修改 set 方法,compatible 模式下写新表后删除老表同key记录
|
|||
|
|
status: completed
|
|||
|
|
dependencies:
|
|||
|
|
- add-mode-field
|
|||
|
|
- id: modify-delete
|
|||
|
|
content: 修改 delete 方法,compatible 模式下同时删除新表和老表
|
|||
|
|
status: completed
|
|||
|
|
dependencies:
|
|||
|
|
- add-mode-field
|
|||
|
|
- id: update-cache-init
|
|||
|
|
content: 在 cache.go Init 方法中读取 mode 配置
|
|||
|
|
status: completed
|
|||
|
|
dependencies:
|
|||
|
|
- add-mode-field
|
|||
|
|
- id: update-config-note
|
|||
|
|
content: 在 var.go ConfigNote 中添加 mode 配置说明
|
|||
|
|
status: completed
|
|||
|
|
- id: add-cache-test
|
|||
|
|
content: 在 example/main.go 中添加缓存测试路由
|
|||
|
|
status: completed
|
|||
|
|
dependencies:
|
|||
|
|
- modify-get
|
|||
|
|
- modify-set
|
|||
|
|
- modify-delete
|
|||
|
|
- update-cache-init
|
|||
|
|
- id: todo-1769763169689-k7t9twp5t
|
|||
|
|
content: |
|
|||
|
|
QUICKSTART.md 更新:缓存配置部分需要添加 mode 和 history 配置说明
|
|||
|
|
status: pending
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
# 缓存表模式配置实现计划
|
|||
|
|
|
|||
|
|
## 需求概述
|
|||
|
|
|
|||
|
|
在 [`cache/cache_db.go`](cache/cache_db.go) 中实现两种缓存表模式:
|
|||
|
|
|
|||
|
|
- **new**(默认):只使用新的 `hotime_cache` 表,自动迁移老表数据
|
|||
|
|
- **compatible**:写入新表,读取时先查新表再查老表,老数据自然过期消亡
|
|||
|
|
|
|||
|
|
## 实现步骤
|
|||
|
|
|
|||
|
|
### 1. 修改 CacheDb 结构体
|
|||
|
|
|
|||
|
|
在 [`cache/cache_db.go`](cache/cache_db.go) 中添加 `Mode` 字段:
|
|||
|
|
|
|||
|
|
```go
|
|||
|
|
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. 检查 `endtime`(unix 时间戳)是否过期
|
|||
|
|
3. 如果过期:删除该条记录,返回 nil
|
|||
|
|
4. 如果未过期:返回数据
|
|||
|
|
|
|||
|
|
### 4. 修改 set 方法(写新删老)
|
|||
|
|
|
|||
|
|
- **new 模式**:只写新表(老表保留但不再管理)
|
|||
|
|
- **compatible 模式**:写入新表 + 删除老表中相同 key 的记录
|
|||
|
|
|
|||
|
|
这样可以主动加速老数据消亡,而不是等自然过期。
|
|||
|
|
|
|||
|
|
### 5. 修改 delete 方法
|
|||
|
|
|
|||
|
|
- **new 模式**:只删除新表(老表保留但不再管理)
|
|||
|
|
- **compatible 模式**:同时删除新表和老表中的 key
|
|||
|
|
|
|||
|
|
这是必要的,否则删除新表后,下次读取会回退读到老表的数据,造成"删不掉"的问题。
|
|||
|
|
|
|||
|
|
需要新增 `deleteLegacy` 方法处理老表删除逻辑
|
|||
|
|
|
|||
|
|
### 6. 更新缓存初始化
|
|||
|
|
|
|||
|
|
在 [`cache/cache.go`](cache/cache.go) 的 `Init` 方法中读取 `mode` 配置:
|
|||
|
|
|
|||
|
|
```go
|
|||
|
|
that.dbCache = &CacheDb{
|
|||
|
|
// ...
|
|||
|
|
Mode: db.GetString("mode"), // 读取 mode 配置
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 7. 更新配置说明
|
|||
|
|
|
|||
|
|
在 [`var.go`](var.go) 的 `ConfigNote` 中添加 `mode` 配置说明:
|
|||
|
|
|
|||
|
|
```go
|
|||
|
|
"db": Map{
|
|||
|
|
// ...
|
|||
|
|
"mode": "默认new,非必须,new为只使用新表(自动迁移老数据),compatible为兼容模式(写新表读老表,老数据自然过期)",
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 8. 编写测试
|
|||
|
|
|
|||
|
|
在 [`example/main.go`](example/main.go) 中添加缓存测试路由,测试覆盖:
|
|||
|
|
|
|||
|
|
**new 模式测试:**
|
|||
|
|
|
|||
|
|
- 基础读写:set/get/delete 正常工作
|
|||
|
|
- 过期测试:设置短过期时间,验证过期后读取返回 nil
|
|||
|
|
- 数据迁移:验证老表数据能正确迁移到新表
|
|||
|
|
- 老表保留:验证迁移后老表仍存在(不自动删除)
|
|||
|
|
|
|||
|
|
**compatible 模式测试:**
|
|||
|
|
|
|||
|
|
- 新表读写:优先从新表读取
|
|||
|
|
- 老表回退:新表没有时从老表读取
|
|||
|
|
- 过期检测:读取老表过期数据时返回 nil 并删除该记录
|
|||
|
|
- 写新删老:写入新表后老表同 key 记录被删除
|
|||
|
|
- 删除双表:删除操作同时删除新表和老表记录
|
|||
|
|
- 通配删除:`key*` 格式删除测试
|
|||
|
|
|
|||
|
|
**边界情况测试:**
|
|||
|
|
|
|||
|
|
- 空值处理:nil 值的 set/get
|
|||
|
|
- 不存在的 key 读取
|
|||
|
|
- 重复 set 同一个 key
|
|||
|
|
- 超时时间参数测试(默认/自定义)
|
|||
|
|
|
|||
|
|
## 架构图
|
|||
|
|
|
|||
|
|
```mermaid
|
|||
|
|
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`](cache/cache_db.go) | 添加 Mode 字段、修改 initDbTable、添加 getLegacy(含过期检测删除)、修改 get、修改 set(写新删老)、修改 delete |
|
|||
|
|
|
|||
|
|
| [`cache/cache.go`](cache/cache.go) | 读取 mode 配置 |
|
|||
|
|
|
|||
|
|
| [`var.go`](var.go) | ConfigNote 添加 mode 说明 |
|
|||
|
|
|
|||
|
|
| [`example/main.go`](example/main.go) | 添加缓存测试路由 |
|
|||
|
|
|
|||
|
|
| [`example/config/config.json`](example/config/config.json) | 可选:添加 mode 配置示例 |
|