Files
cache_manager/cache.go
T

52 lines
1.7 KiB
Go
Raw Normal View History

2026-05-16 19:54:12 +08:00
package cache_manager
import (
"fmt"
"time"
"code.yun.ink/pkg/cache_manager/manager"
"gorm.io/gorm"
)
// T必须实现IModel接口,提供TableName方法来获取表名,用于缓存键的生成
type commonTableCache[T any] struct {
tableName string
cache manager.ICache
ttl time.Duration
*manager.EventManager[T] // 对外提供调用(自动缓存)
cacheManager *manager.CacheManager[T] // 操作缓存管理器
}
type IModel interface {
TableName() string
}
// newCommonCache 创建通用缓存结构
// T 是实现了 IModel 接口的具体数据类型,实现了 IModel 接口的 TableName 方法来获取表名
// cache 是缓存管理器实例,ttl 是缓存的过期时间,getId 是一个函数,用于从数据实例中提取唯一标识符(ID)
// 适合于监听表数据变化并更新缓存的场景,提供了一个事件管理器来处理数据更新事件
func NewCommonTableCache[T any](tx *gorm.DB, cache manager.ICache, ttl time.Duration, getId func(data *T) int64) (*commonTableCache[T], error) {
var zero T
_, ok := any(&zero).(IModel) // 断言,确保 T 实现了 IModel 接口
if !ok {
return nil, fmt.Errorf("type %T does not implement IModel", zero)
}
tableName := any(&zero).(IModel).TableName()
o := &commonTableCache[T]{
tableName: tableName,
// cache: cache,
ttl: ttl,
}
o.cacheManager = manager.NewCacheManager(tx, cache, tableName, getId)
o.EventManager = manager.NewEventManager(tx, o.ttl, o.cacheManager, getId)
// 注册事件监听器,用于处理数据更新和删除操作
// global.EventRegister(o.tableName, o.cacheManager.Remove)
return o, nil
}