feat: backend core - auth, user, role, permission, device, webhook, monitoring, cache, repository, service, middleware, API handlers

This commit is contained in:
2026-04-02 11:19:50 +08:00
parent e59a77bc49
commit dcc1f186f8
298 changed files with 62603 additions and 0 deletions

108
internal/cache/cache_manager.go vendored Normal file
View 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
}