5.6 KiB
5.6 KiB
智能缓存机制说明
概述
为了解决 EnabledTables 配置问题,我们实现了一个智能缓存决策机制。该机制允许您:
- 精确控制缓存表:通过
EnabledTables和DisabledTables精确控制哪些表使用缓存 - 智能决策:
CachedBaseRepositoryImpl会自动根据配置决定是否使用缓存 - 无需修改代码:钱包Repository等代码无需修改,自动适应配置
核心组件
1. 全局缓存配置管理器 (CacheConfigManager)
// 全局实例
var GlobalCacheConfigManager *CacheConfigManager
// 主要方法
func (m *CacheConfigManager) IsTableCacheEnabled(tableName string) bool
func (m *CacheConfigManager) IsTableCacheDisabled(tableName string) bool
func (m *CacheConfigManager) AddEnabledTable(tableName string)
func (m *CacheConfigManager) AddDisabledTable(tableName string)
2. 智能缓存Repository (CachedBaseRepositoryImpl)
// 智能决策方法
func (r *CachedBaseRepositoryImpl) shouldUseCacheForTable() bool
func (r *CachedBaseRepositoryImpl) isTableCacheEnabled() bool
// 智能缓存方法
func (r *CachedBaseRepositoryImpl) GetWithCache(ctx context.Context, dest interface{}, ttl time.Duration, where string, args ...interface{}) error
func (r *CachedBaseRepositoryImpl) FindWithCache(ctx context.Context, dest interface{}, ttl time.Duration, where string, args ...interface{}) error
3. 智能GORM插件 (GormCachePlugin)
// 智能缓存决策
func (p *GormCachePlugin) shouldCache(db *gorm.DB) bool
func (p *GormCachePlugin) shouldInvalidateTable(table string) bool
工作原理
1. 配置初始化
// 在 cache_setup.go 中
cacheConfig := cache.CacheConfig{
EnabledTables: []string{
"users",
"product",
"product_category",
// 注意:这里没有 "wallets"
},
DisabledTables: []string{
"audit_logs",
"system_logs",
},
}
// 初始化全局管理器
cache.InitCacheConfigManager(cacheConfig)
2. 智能决策流程
当钱包Repository调用缓存方法时:
// 钱包Repository代码(无需修改)
func (r *GormWalletRepository) GetByUserID(ctx context.Context, userID string) (*Wallet, error) {
var wallet Wallet
err := r.CachedBaseRepositoryImpl.GetWithCache(ctx, &wallet, 5*time.Minute, "user_id = ?", userID)
return &wallet, err
}
决策流程:
- Repository层:调用
GetWithCache方法 - 智能决策:
shouldUseCacheForTable()检查wallets表是否启用缓存 - 配置检查:通过
GlobalCacheConfigManager.IsTableCacheEnabled("wallets")检查 - 结果处理:
- 如果启用缓存:设置
cache:enabled=true,正常使用缓存 - 如果禁用缓存:设置
cache:disabled=true,跳过缓存,直接查询数据库
- 如果启用缓存:设置
3. 缓存失效智能控制
// GORM回调中的智能失效
func (p *GormCachePlugin) afterCreate(db *gorm.DB) {
if !p.config.AutoInvalidate || db.Error != nil {
return
}
// 只对启用缓存的表执行失效操作
if p.shouldInvalidateTable(db.Statement.Table) {
p.invalidateTableCache(db.Statement.Context, db.Statement.Table)
}
}
使用场景
场景1:钱包表不启用缓存
// 配置中不包含 wallets
EnabledTables: []string{
"users",
"product",
// 没有 "wallets"
}
// 结果:钱包查询不使用缓存,直接查询数据库
// 不会触发缓存失效操作,避免 "context canceled" 错误
场景2:钱包表启用缓存
// 配置中包含 wallets
EnabledTables: []string{
"users",
"product",
"wallets", // 添加钱包表
}
// 结果:钱包查询正常使用缓存
// 缓存失效操作正常执行
场景3:动态调整
// 运行时动态启用钱包缓存
cache.GlobalCacheConfigManager.AddEnabledTable("wallets")
// 运行时动态禁用钱包缓存
cache.GlobalCacheConfigManager.AddDisabledTable("wallets")
优势
1. 精确控制
- 通过配置精确控制哪些表使用缓存
- 避免对不需要缓存的表执行无效操作
2. 代码无需修改
- Repository层代码无需修改
- 自动适应配置变化
3. 性能优化
- 避免对未启用缓存的表执行缓存失效操作
- 减少Redis无效操作,提高性能
4. 错误消除
- 彻底解决
"context canceled"错误 - 避免对不存在缓存数据的表执行失效操作
5. 灵活配置
- 支持运行时动态调整
- 支持环境级别的配置差异
监控和调试
1. 查看表缓存状态
// 获取单个表状态
status := cache.GlobalCacheConfigManager.GetTableCacheStatus("wallets")
// 返回:{"table_name": "wallets", "enabled": false, "disabled": true, ...}
// 获取所有表状态
allStatus := cache.GlobalCacheConfigManager.GetAllTableStatus()
2. 日志监控
// 启用缓存的查询
"执行带缓存查询" {"table": "users", "ttl": "5m0s", "where": "id = ?"}
// 禁用缓存的查询
"执行无缓存查询" {"table": "wallets", "where": "user_id = ?"}
// 表未启用缓存的提示
"表未启用缓存,跳过缓存操作" {"table": "wallets"}
最佳实践
1. 配置原则
- 只对查询频繁、数据变化不频繁的表启用缓存
- 对实时性要求高的表(如钱包余额)谨慎使用缓存
- 对日志表等大数据量表禁用缓存
2. 性能考虑
- 合理设置TTL,平衡缓存命中率和数据一致性
- 监控缓存命中率和失效频率
- 根据业务特点调整缓存策略
3. 运维建议
- 定期检查缓存配置的合理性
- 监控Redis内存使用情况
- 根据业务增长调整缓存容量