1.4.5.2
This commit is contained in:
81
EdgeNode/internal/encryption/cache.go
Normal file
81
EdgeNode/internal/encryption/cache.go
Normal file
@@ -0,0 +1,81 @@
|
||||
// Copyright 2024 GoEdge CDN goedge.cdn@gmail.com. All rights reserved. Official site: https://goedge.cn .
|
||||
|
||||
package encryption
|
||||
|
||||
import (
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/TeaOSLab/EdgeNode/internal/utils/fasttime"
|
||||
"github.com/TeaOSLab/EdgeNode/internal/utils/ttlcache"
|
||||
)
|
||||
|
||||
// EncryptionCache 加密缓存
|
||||
type EncryptionCache struct {
|
||||
cache *ttlcache.Cache[[]byte]
|
||||
}
|
||||
|
||||
var sharedCache *EncryptionCache
|
||||
var sharedCacheOnce sync.Once
|
||||
|
||||
// SharedEncryptionCache 获取共享缓存实例
|
||||
func SharedEncryptionCache(maxSize int, ttl time.Duration) *EncryptionCache {
|
||||
sharedCacheOnce.Do(func() {
|
||||
sharedCache = NewEncryptionCache(maxSize, ttl)
|
||||
})
|
||||
return sharedCache
|
||||
}
|
||||
|
||||
// NewEncryptionCache 创建新缓存
|
||||
func NewEncryptionCache(maxSize int, ttl time.Duration) *EncryptionCache {
|
||||
cache := ttlcache.NewCache[[]byte](
|
||||
ttlcache.NewMaxItemsOption(maxSize),
|
||||
ttlcache.NewGCConfigOption().
|
||||
WithBaseInterval(ttl).
|
||||
WithMinInterval(ttl/2).
|
||||
WithMaxInterval(ttl*2).
|
||||
WithAdaptive(true),
|
||||
)
|
||||
|
||||
return &EncryptionCache{
|
||||
cache: cache,
|
||||
}
|
||||
}
|
||||
|
||||
// Get 获取缓存值
|
||||
func (this *EncryptionCache) Get(key string) ([]byte, bool) {
|
||||
item := this.cache.Read(key)
|
||||
if item == nil {
|
||||
return nil, false
|
||||
}
|
||||
|
||||
// 检查是否过期
|
||||
if item.ExpiresAt() < fasttime.Now().Unix() {
|
||||
return nil, false
|
||||
}
|
||||
|
||||
// 复制数据,避免外部修改
|
||||
result := make([]byte, len(item.Value))
|
||||
copy(result, item.Value)
|
||||
return result, true
|
||||
}
|
||||
|
||||
// Set 设置缓存值
|
||||
func (this *EncryptionCache) Set(key string, value []byte, ttlSeconds int64) {
|
||||
// 复制数据,避免外部修改
|
||||
copied := make([]byte, len(value))
|
||||
copy(copied, value)
|
||||
|
||||
expiresAt := fasttime.Now().Unix() + ttlSeconds
|
||||
this.cache.Write(key, copied, expiresAt)
|
||||
}
|
||||
|
||||
// Clear 清空缓存(TTL 缓存会自动过期,这里不需要手动清空)
|
||||
func (this *EncryptionCache) Clear() {
|
||||
// TTL 缓存会自动过期,不需要手动清空
|
||||
}
|
||||
|
||||
// Len 获取缓存大小
|
||||
func (this *EncryptionCache) Len() int {
|
||||
return this.cache.Count()
|
||||
}
|
||||
Reference in New Issue
Block a user