缓存机制
Go Cursor SDK 内置了缓存机制,可以显著提升数据访问性能,减少重复的数据库查询。
启用缓存
基本配置
go
config := &cursor.ClientConfig{
EnableCache: true,
CacheTTL: 5 * time.Minute, // 缓存有效期
}
client, err := cursor.NewCursorClient(config)
if err != nil {
log.Fatal(err)
}
defer client.Close()缓存策略
默认缓存策略
SDK 使用 LRU (Least Recently Used) 缓存策略:
- 自动缓存频繁访问的数据
- 当缓存满时,移除最少使用的数据
- 支持设置缓存过期时间
缓存的数据类型
以下数据会被自动缓存:
- 会话列表
- Composer 列表
- 统计数据
- 配置信息
- MCP 服务数据
- 终端历史
缓存管理
清除缓存
go
// 清除所有缓存
client.Cache().Clear()
// 清除特定类型的缓存
client.Cache().ClearSessions()
client.Cache().ClearComposers()
client.Cache().ClearStats()刷新缓存
go
// 强制刷新数据(绕过缓存)
sessions, err := client.Sessions().ListSessions()检查缓存状态
go
// 获取缓存统计信息
stats := client.Cache().Stats()
fmt.Printf("缓存命中率:%.2f%%\n", stats.HitRate)
fmt.Printf("缓存大小:%d\n", stats.Size)性能优化
合理设置缓存时间
go
// 对于频繁变化的数据,使用较短的缓存时间
config := &cursor.ClientConfig{
EnableCache: true,
CacheTTL: 1 * time.Minute,
}
// 对于不常变化的数据,使用较长的缓存时间
config := &cursor.ClientConfig{
EnableCache: true,
CacheTTL: 30 * time.Minute,
}预加载数据
go
// 在应用启动时预加载常用数据
func preloadData(client *cursor.CursorClient) error {
// 预加载会话
_, err := client.Sessions().ListSessions()
if err != nil {
return err
}
// 预加载 Composer
_, err = client.Composers().ListComposers()
if err != nil {
return err
}
// 预加载配置
_, err = client.Config().GetUserConfig()
if err != nil {
return err
}
return nil
}实际示例
使用缓存提升性能
go
package main
import (
"fmt"
"log"
"time"
cursor "github.com/vibe-coding-labs/go-cursor-sdk"
)
func main() {
// 启用缓存
config := &cursor.ClientConfig{
EnableCache: true,
CacheTTL: 5 * time.Minute,
}
client, err := cursor.NewCursorClient(config)
if err != nil {
log.Fatal(err)
}
defer client.Close()
// 第一次访问(从数据库读取)
start := time.Now()
sessions, err := client.Sessions().ListSessions()
if err != nil {
log.Fatal(err)
}
fmt.Printf("第一次访问耗时:%v\n", time.Since(start))
// 第二次访问(从缓存读取)
start = time.Now()
sessions, err = client.Sessions().ListSessions()
if err != nil {
log.Fatal(err)
}
fmt.Printf("第二次访问耗时:%v\n", time.Since(start))
// 输出缓存统计
stats := client.Cache().Stats()
fmt.Printf("缓存命中率:%.2f%%\n", stats.HitRate)
}缓存失效处理
go
// 监听数据变化,自动清除缓存
watcher := client.Watcher()
watcher.WatchSessions(func(event cursor.WatchEvent) {
// 数据变化时清除缓存
client.Cache().ClearSessions()
})
if err := watcher.Start(); err != nil {
log.Fatal(err)
}注意事项
缓存一致性
- 缓存的数据可能不是最新的
- 对于需要实时数据的场景,考虑禁用缓存或使用较短的 TTL
- 使用 Watcher 监听数据变化,及时更新缓存
内存使用
- 缓存会占用内存
- 根据应用需求调整缓存大小
- 定期清理不需要的缓存
并发访问
- 缓存是并发安全的
- 多个 goroutine 可以同时访问缓存
- 内部使用互斥锁保护数据