Skip to content

缓存机制

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 可以同时访问缓存
  • 内部使用互斥锁保护数据

下一步

Released under the MIT License.