Files
EdgeCommon/pkg/serverconfigs/http_cache_policy.go

125 lines
4.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package serverconfigs
import (
"bytes"
"encoding/json"
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/shared"
"time"
)
const DefaultHTTPCachePolicyFetchTimeout = 20 * time.Minute
// HTTPCachePolicy 缓存策略配置
type HTTPCachePolicy struct {
Id int64 `yaml:"id" json:"id"`
IsOn bool `yaml:"isOn" json:"isOn"` // 是否开启
Name string `yaml:"name" json:"name"` // 名称
Description string `yaml:"description" json:"description"` // 描述
Capacity *shared.SizeCapacity `yaml:"capacity" json:"capacity"` // 最大内容容量
MaxSize *shared.SizeCapacity `yaml:"maxSize" json:"maxSize"` // 单个缓存最大尺寸
Type CachePolicyStorageType `yaml:"type" json:"type"` // 类型
Options map[string]any `yaml:"options" json:"options"` // 选项
Life *shared.TimeDuration `yaml:"life" json:"life"` // 默认有效期 TODO 需要实现
MinLife *shared.TimeDuration `yaml:"minLife" json:"minLife"` // 最小有效期 TODO 需要实现
MaxLife *shared.TimeDuration `yaml:"maxLife" json:"maxLife"` // 最大有效期 TODO 需要实现
SyncCompressionCache bool `yaml:"syncCompressionCache" json:"syncCompressionCache"` // 同步写入压缩缓存
FetchTimeout *shared.TimeDuration `yaml:"fetchTimeout" json:"fetchTimeout"` // 预热超时时间
CacheRefs []*HTTPCacheRef `yaml:"cacheRefs" json:"cacheRefs"` // 缓存配置
PersistenceAutoPurgeCount int `yaml:"persistenceAutoPurgeCount" json:"persistenceAutoPurgeCount"` // 每次自动清理的条数 TODO 需要实现
PersistenceAutoPurgeInterval int `yaml:"persistenceAutoPurgeInterval" json:"persistenceAutoPurgeInterval"` // 自动清理的时间间隔(秒) TODO 需要实现
PersistenceLFUFreePercent float32 `yaml:"persistenceLFUFreePercent" json:"persistenceLFUFreePercent"` // LFU算法执行阈值剩余空间比例使用百分比比如20 TODO 需要实现
PersistenceHitSampleRate int `yaml:"persistenceHitSampleRate" json:"persistenceHitSampleRate"` // 热点数据采样比例 TODO 需要实现
MemoryAutoPurgeCount int `yaml:"memoryAutoPurgeCount" json:"memoryAutoPurgeCount"` // 每次自动清理的条数 TODO 需要实现
MemoryAutoPurgeInterval int `yaml:"memoryAutoPurgeInterval" json:"memoryAutoPurgeInterval"` // 自动清理的时间间隔(秒) TODO 需要实现
MemoryLFUFreePercent float32 `yaml:"memoryLFUFreePercent" json:"memoryLFUFreePercent"` // LFU算法执行阈值剩余空间比例使用百分比比如20 TODO 需要实现
MemoryAutoFlushQueueSize int `yaml:"memoryAutoFlushQueueSize" json:"memoryAutoFlushQueueSize"` // 自动刷新到持久层队列尺寸 TODO 需要实现
capacity int64
maxSize int64
}
// Init 校验
func (this *HTTPCachePolicy) Init() error {
if this.Capacity != nil {
this.capacity = this.Capacity.Bytes()
}
if this.MaxSize != nil {
this.maxSize = this.MaxSize.Bytes()
}
for _, cacheRef := range this.CacheRefs {
err := cacheRef.Init()
if err != nil {
return err
}
}
return nil
}
// CapacityBytes 容量
func (this *HTTPCachePolicy) CapacityBytes() int64 {
return this.capacity
}
// MaxSizeBytes 单个缓存最大尺寸
func (this *HTTPCachePolicy) MaxSizeBytes() int64 {
return this.maxSize
}
// IsSame 对比Policy是否有变化
func (this *HTTPCachePolicy) IsSame(anotherPolicy *HTTPCachePolicy) bool {
policyJSON1, err := json.Marshal(this)
if err != nil {
return false
}
policyJSON2, err := json.Marshal(anotherPolicy)
if err != nil {
return false
}
return bytes.Equal(policyJSON1, policyJSON2)
}
// UpdateDiskDir 修改文件路径
func (this *HTTPCachePolicy) UpdateDiskDir(dir string, subDirs []*CacheDir) {
if this.Type == CachePolicyStorageFile {
if len(dir) == 0 && len(subDirs) == 0 {
return
}
oldOptionsJSON, err := json.Marshal(this.Options)
if err != nil {
return
}
var options = &HTTPFileCacheStorage{}
err = json.Unmarshal(oldOptionsJSON, options)
if err != nil {
return
}
if len(dir) > 0 {
options.Dir = dir
}
if len(subDirs) > 0 {
options.SubDirs = subDirs
}
newOptionsJSON, err := json.Marshal(options)
if err != nil {
return
}
var newOptionsMap = map[string]any{}
err = json.Unmarshal(newOptionsJSON, &newOptionsMap)
if err != nil {
return
}
this.Options = newOptionsMap
}
}