Files
tyapi-server/docs/智能缓存机制说明.md
2025-07-28 01:46:39 +08:00

5.6 KiB
Raw Blame History

智能缓存机制说明

概述

为了解决 EnabledTables 配置问题,我们实现了一个智能缓存决策机制。该机制允许您:

  1. 精确控制缓存表:通过 EnabledTablesDisabledTables 精确控制哪些表使用缓存
  2. 智能决策CachedBaseRepositoryImpl 会自动根据配置决定是否使用缓存
  3. 无需修改代码钱包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
}

决策流程:

  1. Repository层:调用 GetWithCache 方法
  2. 智能决策shouldUseCacheForTable() 检查 wallets 表是否启用缓存
  3. 配置检查:通过 GlobalCacheConfigManager.IsTableCacheEnabled("wallets") 检查
  4. 结果处理
    • 如果启用缓存:设置 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内存使用情况
  • 根据业务增长调整缓存容量