feat(cache): 增加批量操作支持以提升性能
- 在 HoTimeCache 中新增 SessionsGet、SessionsSet 和 SessionsDelete 方法,支持批量获取、设置和删除 Session 缓存 - 优化缓存逻辑,减少数据库写入次数,提升性能 - 更新文档,详细说明批量操作的使用方法和性能对比 - 添加调试日志记录,便于追踪批量操作的执行情况
This commit is contained in:
+80
-5
@@ -135,7 +135,9 @@ func main() {
|
||||
"db": {
|
||||
"db": true,
|
||||
"session": true,
|
||||
"timeout": 2592000
|
||||
"timeout": 2592000,
|
||||
"history": false,
|
||||
"mode": "compatible"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -143,6 +145,27 @@ func main() {
|
||||
|
||||
缓存优先级: **Memory > Redis > DB**,自动穿透与回填
|
||||
|
||||
#### DB 缓存配置说明
|
||||
|
||||
| 配置项 | 默认值 | 说明 |
|
||||
|--------|--------|------|
|
||||
| `db` | false | 是否缓存数据库查询 |
|
||||
| `session` | true | 是否缓存 Session |
|
||||
| `timeout` | 2592000 | 过期时间(秒) |
|
||||
| `history` | false | 是否记录缓存历史,开启后每次新增/修改缓存都会记录到历史表 |
|
||||
| `mode` | compatible | 缓存表模式,见下表 |
|
||||
|
||||
**缓存表模式 (mode)**:
|
||||
|
||||
| 模式 | 说明 |
|
||||
|------|------|
|
||||
| `compatible` | **默认**。兼容模式:写新表,新表无数据时回退读老表;写入时自动删除老表同 key 记录;删除时同时删两表。适合从老版本平滑升级,老数据自然过期消亡 |
|
||||
| `new` | 只使用新表 `hotime_cache`,启动时自动迁移老表 `cached` 数据。老表保留由人工删除,不再被读写 |
|
||||
|
||||
> **升级建议**:从老版本升级时,建议先使用 `compatible` 模式运行一段时间(让老数据自然过期),确认无问题后再切换到 `new` 模式
|
||||
|
||||
> 从老版本升级时,建议使用 `compatible` 模式平滑过渡,待老表数据消亡后切换到 `new` 模式
|
||||
|
||||
### 错误码配置
|
||||
|
||||
```json
|
||||
@@ -342,6 +365,44 @@ data := that.Cache("key") // 获取
|
||||
that.Cache("key", nil) // 删除
|
||||
```
|
||||
|
||||
### 批量操作(性能优化)
|
||||
|
||||
当需要同时操作多个 Session 字段时,使用批量操作可显著提升性能:
|
||||
|
||||
```go
|
||||
// SessionsSet - 批量设置(N个字段只触发1次数据库写入)
|
||||
that.SessionsSet(Map{
|
||||
"user_id": userId,
|
||||
"username": "张三",
|
||||
"login_time": time.Now().Unix(),
|
||||
"role": "admin",
|
||||
})
|
||||
|
||||
// SessionsGet - 批量获取(1次调用获取多个字段)
|
||||
result := that.SessionsGet("user_id", "username", "role")
|
||||
// result = Map{"user_id": 123, "username": "张三", "role": "admin"}
|
||||
|
||||
userId := ObjToInt64(result["user_id"], nil)
|
||||
username := ObjToStr(result["username"])
|
||||
|
||||
// SessionsDelete - 批量删除(N个字段只触发1次数据库写入)
|
||||
that.SessionsDelete("token", "temp_code", "verify_expire")
|
||||
```
|
||||
|
||||
**性能对比**:
|
||||
|
||||
| 操作方式 | 设置10个字段 | 数据库写入次数 |
|
||||
|----------|-------------|---------------|
|
||||
| 逐个调用 `Session()` | 10次调用 | **10次** |
|
||||
| 使用 `SessionsSet()` | 1次调用 | **1次** |
|
||||
|
||||
| 操作方式 | 获取10个字段 | 缓存查询次数 |
|
||||
|----------|-------------|--------------|
|
||||
| 逐个调用 `Session()` | 10次调用 | **10次** |
|
||||
| 使用 `SessionsGet()` | 1次调用 | **1次** |
|
||||
|
||||
> 💡 **最佳实践**:当一次性操作 3 个以上字段时,建议使用批量操作
|
||||
|
||||
三级缓存自动运作:**Memory → Redis → Database**
|
||||
|
||||
## 数据库操作(简要)
|
||||
@@ -439,6 +500,8 @@ that.Log = Map{
|
||||
package main
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
. "code.hoteas.com/golang/hotime"
|
||||
. "code.hoteas.com/golang/hotime/common"
|
||||
)
|
||||
@@ -481,14 +544,25 @@ func main() {
|
||||
return
|
||||
}
|
||||
|
||||
that.Session("user_id", user.GetInt64("id"))
|
||||
// 使用批量设置,一次写入多个字段
|
||||
that.SessionsSet(Map{
|
||||
"user_id": user.GetInt64("id"),
|
||||
"username": user.GetString("name"),
|
||||
"login_time": time.Now().Unix(),
|
||||
})
|
||||
that.Display(0, Map{"user": user})
|
||||
},
|
||||
|
||||
"info": func(that *Context) {
|
||||
userId := that.Session("user_id").ToInt64()
|
||||
// 使用批量获取,一次读取多个字段
|
||||
sess := that.SessionsGet("user_id", "username", "login_time")
|
||||
userId := ObjToInt64(sess["user_id"], nil)
|
||||
|
||||
user := that.Db.Get("user", "*", Map{"id": userId})
|
||||
that.Display(0, Map{"user": user})
|
||||
that.Display(0, Map{
|
||||
"user": user,
|
||||
"login_time": sess["login_time"],
|
||||
})
|
||||
},
|
||||
|
||||
"list": func(that *Context) {
|
||||
@@ -513,7 +587,8 @@ func main() {
|
||||
},
|
||||
|
||||
"logout": func(that *Context) {
|
||||
that.Session("user_id", nil)
|
||||
// 使用批量删除,一次清除多个字段
|
||||
that.SessionsDelete("user_id", "username", "login_time")
|
||||
that.Display(0, "退出成功")
|
||||
},
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user