69 lines
1.6 KiB
Go
69 lines
1.6 KiB
Go
package manager
|
|
|
|
import (
|
|
"schisandra-album-cloud-microservices/common/storage/storage"
|
|
"sync"
|
|
"time"
|
|
)
|
|
|
|
// CacheEntry 缓存项定义
|
|
type CacheEntry struct {
|
|
Instance storage.Service
|
|
mu sync.Mutex // 确保 LastUsed 的线程安全
|
|
LastUsed time.Time
|
|
}
|
|
|
|
// UserStorageCache 管理每个用户的存储实例缓存
|
|
type UserStorageCache struct {
|
|
cache sync.Map // map[userID::providerName]*CacheEntry
|
|
}
|
|
|
|
// NewUserStorageCache 创建新的用户存储缓存
|
|
func NewUserStorageCache() *UserStorageCache {
|
|
return &UserStorageCache{}
|
|
}
|
|
|
|
// GetOrCreate 获取或创建缓存实例
|
|
func (usc *UserStorageCache) GetOrCreate(key, providerName string, factory func() (storage.Service, error)) (storage.Service, error) {
|
|
cacheKey := key + "::" + providerName
|
|
|
|
if entry, exists := usc.cache.Load(cacheKey); exists {
|
|
usc.updateLastUsed(entry.(*CacheEntry))
|
|
return entry.(*CacheEntry).Instance, nil
|
|
}
|
|
|
|
instance, err := factory()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
cacheEntry := &CacheEntry{
|
|
Instance: instance,
|
|
LastUsed: time.Now(),
|
|
}
|
|
usc.cache.Store(cacheKey, cacheEntry)
|
|
return instance, nil
|
|
}
|
|
|
|
// ClearUnused 清理长时间未使用的实例
|
|
func (usc *UserStorageCache) ClearUnused(timeout time.Duration) {
|
|
now := time.Now()
|
|
usc.cache.Range(func(key, value interface{}) bool {
|
|
entry := value.(*CacheEntry)
|
|
entry.mu.Lock()
|
|
defer entry.mu.Unlock()
|
|
|
|
if now.Sub(entry.LastUsed) > timeout {
|
|
usc.cache.Delete(key)
|
|
}
|
|
return true
|
|
})
|
|
}
|
|
|
|
// updateLastUsed 更新最后使用时间
|
|
func (usc *UserStorageCache) updateLastUsed(entry *CacheEntry) {
|
|
entry.mu.Lock()
|
|
defer entry.mu.Unlock()
|
|
entry.LastUsed = time.Now()
|
|
}
|