feat: backend core - auth, user, role, permission, device, webhook, monitoring, cache, repository, service, middleware, API handlers
This commit is contained in:
108
internal/cache/cache_manager.go
vendored
Normal file
108
internal/cache/cache_manager.go
vendored
Normal file
@@ -0,0 +1,108 @@
|
||||
package cache
|
||||
|
||||
import (
|
||||
"context"
|
||||
"time"
|
||||
)
|
||||
|
||||
// CacheManager 缓存管理器
|
||||
type CacheManager struct {
|
||||
l1 *L1Cache
|
||||
l2 L2Cache
|
||||
}
|
||||
|
||||
// NewCacheManager 创建缓存管理器
|
||||
func NewCacheManager(l1 *L1Cache, l2 L2Cache) *CacheManager {
|
||||
return &CacheManager{
|
||||
l1: l1,
|
||||
l2: l2,
|
||||
}
|
||||
}
|
||||
|
||||
// Get 获取缓存(先从L1获取,再从L2获取)
|
||||
func (cm *CacheManager) Get(ctx context.Context, key string) (interface{}, bool) {
|
||||
// 先从L1缓存获取
|
||||
if value, ok := cm.l1.Get(key); ok {
|
||||
return value, true
|
||||
}
|
||||
|
||||
// 再从L2缓存获取
|
||||
if cm.l2 != nil {
|
||||
if value, err := cm.l2.Get(ctx, key); err == nil && value != nil {
|
||||
// 回写L1缓存
|
||||
cm.l1.Set(key, value, 5*time.Minute)
|
||||
return value, true
|
||||
}
|
||||
}
|
||||
|
||||
return nil, false
|
||||
}
|
||||
|
||||
// Set 设置缓存(同时写入L1和L2)
|
||||
func (cm *CacheManager) Set(ctx context.Context, key string, value interface{}, l1TTL, l2TTL time.Duration) error {
|
||||
// 写入L1缓存
|
||||
cm.l1.Set(key, value, l1TTL)
|
||||
|
||||
// 写入L2缓存
|
||||
if cm.l2 != nil {
|
||||
if err := cm.l2.Set(ctx, key, value, l2TTL); err != nil {
|
||||
// L2写入失败不影响整体流程
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// Delete 删除缓存(同时删除L1和L2)
|
||||
func (cm *CacheManager) Delete(ctx context.Context, key string) error {
|
||||
// 删除L1缓存
|
||||
cm.l1.Delete(key)
|
||||
|
||||
// 删除L2缓存
|
||||
if cm.l2 != nil {
|
||||
return cm.l2.Delete(ctx, key)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// Exists 检查缓存是否存在
|
||||
func (cm *CacheManager) Exists(ctx context.Context, key string) bool {
|
||||
// 先检查L1
|
||||
if _, ok := cm.l1.Get(key); ok {
|
||||
return true
|
||||
}
|
||||
|
||||
// 再检查L2
|
||||
if cm.l2 != nil {
|
||||
if exists, err := cm.l2.Exists(ctx, key); err == nil && exists {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
// Clear 清空缓存
|
||||
func (cm *CacheManager) Clear(ctx context.Context) error {
|
||||
// 清空L1缓存
|
||||
cm.l1.Clear()
|
||||
|
||||
// 清空L2缓存
|
||||
if cm.l2 != nil {
|
||||
return cm.l2.Clear(ctx)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// GetL1 获取L1缓存
|
||||
func (cm *CacheManager) GetL1() *L1Cache {
|
||||
return cm.l1
|
||||
}
|
||||
|
||||
// GetL2 获取L2缓存
|
||||
func (cm *CacheManager) GetL2() L2Cache {
|
||||
return cm.l2
|
||||
}
|
||||
Reference in New Issue
Block a user