refactor: Remove Token management and integrate Redis for authentication
- Deleted the Token model and its repository, transitioning to a Redis-based token management system. - Updated the service layer to utilize Redis for token storage, enhancing performance and scalability. - Refactored the container to remove TokenRepository and integrate the new token service. - Cleaned up the Dockerfile and other files by removing unnecessary whitespace and comments. - Enhanced error handling and logging for Redis initialization and usage.
This commit is contained in:
@@ -14,12 +14,24 @@ type CacheConfig struct {
|
||||
Prefix string // 缓存键前缀
|
||||
Expiration time.Duration // 过期时间
|
||||
Enabled bool // 是否启用缓存
|
||||
Policy CachePolicy // 缓存策略(可选,不配置则回落到 Expiration)
|
||||
}
|
||||
|
||||
// CachePolicy 缓存策略,用于为不同实体设置默认 TTL
|
||||
type CachePolicy struct {
|
||||
UserTTL time.Duration
|
||||
UserEmailTTL time.Duration
|
||||
ProfileTTL time.Duration
|
||||
ProfileListTTL time.Duration
|
||||
TextureTTL time.Duration
|
||||
TextureListTTL time.Duration
|
||||
}
|
||||
|
||||
// CacheManager 缓存管理器
|
||||
type CacheManager struct {
|
||||
redis *redis.Client
|
||||
config CacheConfig
|
||||
Policy CachePolicy
|
||||
}
|
||||
|
||||
// NewCacheManager 创建缓存管理器
|
||||
@@ -31,9 +43,33 @@ func NewCacheManager(redisClient *redis.Client, config CacheConfig) *CacheManage
|
||||
config.Expiration = 5 * time.Minute
|
||||
}
|
||||
|
||||
// 填充默认策略(未配置时退回全局过期时间)
|
||||
applyPolicyDefaults := func(p *CachePolicy) {
|
||||
if p.UserTTL == 0 {
|
||||
p.UserTTL = config.Expiration
|
||||
}
|
||||
if p.UserEmailTTL == 0 {
|
||||
p.UserEmailTTL = config.Expiration
|
||||
}
|
||||
if p.ProfileTTL == 0 {
|
||||
p.ProfileTTL = config.Expiration
|
||||
}
|
||||
if p.ProfileListTTL == 0 {
|
||||
p.ProfileListTTL = config.Expiration
|
||||
}
|
||||
if p.TextureTTL == 0 {
|
||||
p.TextureTTL = config.Expiration
|
||||
}
|
||||
if p.TextureListTTL == 0 {
|
||||
p.TextureListTTL = config.Expiration
|
||||
}
|
||||
}
|
||||
applyPolicyDefaults(&config.Policy)
|
||||
|
||||
return &CacheManager{
|
||||
redis: redisClient,
|
||||
config: config,
|
||||
Policy: config.Policy,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -56,6 +92,14 @@ func (cm *CacheManager) Get(ctx context.Context, key string, dest interface{}) e
|
||||
return json.Unmarshal(data, dest)
|
||||
}
|
||||
|
||||
// TryGet 获取缓存,命中时返回 true,不视为错误
|
||||
func (cm *CacheManager) TryGet(ctx context.Context, key string, dest interface{}) (bool, error) {
|
||||
if err := cm.Get(ctx, key, dest); err != nil {
|
||||
return false, err
|
||||
}
|
||||
return true, nil
|
||||
}
|
||||
|
||||
// Set 设置缓存
|
||||
func (cm *CacheManager) Set(ctx context.Context, key string, value interface{}, expiration ...time.Duration) error {
|
||||
if !cm.config.Enabled || cm.redis == nil {
|
||||
@@ -75,6 +119,13 @@ func (cm *CacheManager) Set(ctx context.Context, key string, value interface{},
|
||||
return cm.redis.Set(ctx, cm.buildKey(key), data, exp)
|
||||
}
|
||||
|
||||
// SetAsync 异步设置缓存,避免在主请求链路阻塞
|
||||
func (cm *CacheManager) SetAsync(ctx context.Context, key string, value interface{}, expiration ...time.Duration) {
|
||||
go func() {
|
||||
_ = cm.Set(ctx, key, value, expiration...)
|
||||
}()
|
||||
}
|
||||
|
||||
// Delete 删除缓存
|
||||
func (cm *CacheManager) Delete(ctx context.Context, keys ...string) error {
|
||||
if !cm.config.Enabled || cm.redis == nil {
|
||||
@@ -187,11 +238,7 @@ func Cached[T any](
|
||||
}
|
||||
|
||||
// 设置缓存(异步,不阻塞)
|
||||
go func() {
|
||||
cacheCtx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
|
||||
defer cancel()
|
||||
_ = cache.Set(cacheCtx, key, data, expiration...)
|
||||
}()
|
||||
cache.SetAsync(context.Background(), key, data, expiration...)
|
||||
|
||||
return data, nil
|
||||
}
|
||||
@@ -217,11 +264,7 @@ func CachedList[T any](
|
||||
}
|
||||
|
||||
// 设置缓存(异步,不阻塞)
|
||||
go func() {
|
||||
cacheCtx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
|
||||
defer cancel()
|
||||
_ = cache.Set(cacheCtx, key, data, expiration...)
|
||||
}()
|
||||
cache.SetAsync(context.Background(), key, data, expiration...)
|
||||
|
||||
return data, nil
|
||||
}
|
||||
@@ -306,6 +349,11 @@ func (b *CacheKeyBuilder) TextureList(userID int64, page int) string {
|
||||
return fmt.Sprintf("%stexture:user:%d:page:%d", b.prefix, userID, page)
|
||||
}
|
||||
|
||||
// TextureListPattern 构建材质列表缓存键模式(用于批量失效)
|
||||
func (b *CacheKeyBuilder) TextureListPattern(userID int64) string {
|
||||
return fmt.Sprintf("%stexture:user:%d:*", b.prefix, userID)
|
||||
}
|
||||
|
||||
// Token 构建令牌缓存键
|
||||
func (b *CacheKeyBuilder) Token(accessToken string) string {
|
||||
return fmt.Sprintf("%stoken:%s", b.prefix, accessToken)
|
||||
|
||||
Reference in New Issue
Block a user