Files
yoyo/internal/cache/key.go
z.to b71f76c8b3 feat: 添加本地缓存功能,减少API调用
- 实现SQLite缓存模块,支持高效查询和存储
- 添加缓存键生成策略(基于原文+语言对的SHA256哈希)
- 集成缓存到Translator类,先查缓存再调用API
- 添加缓存管理命令:cache clear, cache stats, cache cleanup
- 实现组合缓存清理策略(数量限制+时间过期)
- 添加完整的单元测试
- 更新配置文件模板,添加缓存配置
- 更新文档和版本记录

版本: v0.5.1
2026-03-29 21:10:28 +08:00

64 lines
1.7 KiB
Go

package cache
import (
"crypto/sha256"
"encoding/hex"
"fmt"
"strings"
)
// GenerateCacheKey 生成缓存键
// 使用原文+语言对进行SHA256哈希
func GenerateCacheKey(originalText, fromLang, toLang string) string {
// 规范化语言代码
fromLang = normalizeLanguageCode(fromLang)
toLang = normalizeLanguageCode(toLang)
// 规范化原文
normalizedText := normalizeText(originalText)
// 生成缓存键
data := fmt.Sprintf("%s|%s|%s", normalizedText, fromLang, toLang)
hash := sha256.Sum256([]byte(data))
return hex.EncodeToString(hash[:])
}
// normalizeLanguageCode 规范化语言代码
func normalizeLanguageCode(lang string) string {
if lang == "" || lang == "auto" {
return "auto"
}
return strings.ToLower(strings.TrimSpace(lang))
}
// normalizeText 规范化文本
// 移除多余的空白字符,确保相同的文本生成相同的哈希
func normalizeText(text string) string {
// 移除首尾空白
text = strings.TrimSpace(text)
// 将多个连续空白字符替换为单个空格
text = strings.Join(strings.Fields(text), " ")
return text
}
// GenerateCacheKeyWithModel 生成包含模型信息的缓存键
// 如果需要更精确的缓存,可以使用这个函数
func GenerateCacheKeyWithModel(originalText, fromLang, toLang, model string) string {
// 规范化语言代码
fromLang = normalizeLanguageCode(fromLang)
toLang = normalizeLanguageCode(toLang)
// 规范化原文
normalizedText := normalizeText(originalText)
// 规范化模型名称
model = strings.ToLower(strings.TrimSpace(model))
// 生成缓存键
data := fmt.Sprintf("%s|%s|%s|%s", normalizedText, fromLang, toLang, model)
hash := sha256.Sum256([]byte(data))
return hex.EncodeToString(hash[:])
}