52 lines
1.7 KiB
Go
52 lines
1.7 KiB
Go
|
|
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
|
||
|
|
}
|