178 lines
5.6 KiB
Go
178 lines
5.6 KiB
Go
package common
|
|
|
|
import (
|
|
"sync"
|
|
"sync/atomic"
|
|
)
|
|
|
|
// DiskCacheConfig 磁盘缓存配置(由 performance_setting 包更新)
|
|
type DiskCacheConfig struct {
|
|
// Enabled 是否启用磁盘缓存
|
|
Enabled bool
|
|
// ThresholdMB 触发磁盘缓存的请求体大小阈值(MB)
|
|
ThresholdMB int
|
|
// MaxSizeMB 磁盘缓存最大总大小(MB)
|
|
MaxSizeMB int
|
|
// Path 磁盘缓存目录
|
|
Path string
|
|
}
|
|
|
|
// 全局磁盘缓存配置
|
|
var diskCacheConfig = DiskCacheConfig{
|
|
Enabled: false,
|
|
ThresholdMB: 10,
|
|
MaxSizeMB: 1024,
|
|
Path: "",
|
|
}
|
|
var diskCacheConfigMu sync.RWMutex
|
|
|
|
// GetDiskCacheConfig 获取磁盘缓存配置
|
|
func GetDiskCacheConfig() DiskCacheConfig {
|
|
diskCacheConfigMu.RLock()
|
|
defer diskCacheConfigMu.RUnlock()
|
|
return diskCacheConfig
|
|
}
|
|
|
|
// SetDiskCacheConfig 设置磁盘缓存配置
|
|
func SetDiskCacheConfig(config DiskCacheConfig) {
|
|
diskCacheConfigMu.Lock()
|
|
defer diskCacheConfigMu.Unlock()
|
|
diskCacheConfig = config
|
|
}
|
|
|
|
// IsDiskCacheEnabled 是否启用磁盘缓存
|
|
func IsDiskCacheEnabled() bool {
|
|
diskCacheConfigMu.RLock()
|
|
defer diskCacheConfigMu.RUnlock()
|
|
return diskCacheConfig.Enabled
|
|
}
|
|
|
|
// GetDiskCacheThresholdBytes 获取磁盘缓存阈值(字节)
|
|
func GetDiskCacheThresholdBytes() int64 {
|
|
diskCacheConfigMu.RLock()
|
|
defer diskCacheConfigMu.RUnlock()
|
|
return int64(diskCacheConfig.ThresholdMB) << 20
|
|
}
|
|
|
|
// GetDiskCacheMaxSizeBytes 获取磁盘缓存最大大小(字节)
|
|
func GetDiskCacheMaxSizeBytes() int64 {
|
|
diskCacheConfigMu.RLock()
|
|
defer diskCacheConfigMu.RUnlock()
|
|
return int64(diskCacheConfig.MaxSizeMB) << 20
|
|
}
|
|
|
|
// GetDiskCachePath 获取磁盘缓存目录
|
|
func GetDiskCachePath() string {
|
|
diskCacheConfigMu.RLock()
|
|
defer diskCacheConfigMu.RUnlock()
|
|
return diskCacheConfig.Path
|
|
}
|
|
|
|
// DiskCacheStats 磁盘缓存统计信息
|
|
type DiskCacheStats struct {
|
|
// 当前活跃的磁盘缓存文件数
|
|
ActiveDiskFiles int64 `json:"active_disk_files"`
|
|
// 当前磁盘缓存总大小(字节)
|
|
CurrentDiskUsageBytes int64 `json:"current_disk_usage_bytes"`
|
|
// 当前内存缓存数量
|
|
ActiveMemoryBuffers int64 `json:"active_memory_buffers"`
|
|
// 当前内存缓存总大小(字节)
|
|
CurrentMemoryUsageBytes int64 `json:"current_memory_usage_bytes"`
|
|
// 磁盘缓存命中次数
|
|
DiskCacheHits int64 `json:"disk_cache_hits"`
|
|
// 内存缓存命中次数
|
|
MemoryCacheHits int64 `json:"memory_cache_hits"`
|
|
// 磁盘缓存最大限制(字节)
|
|
DiskCacheMaxBytes int64 `json:"disk_cache_max_bytes"`
|
|
// 磁盘缓存阈值(字节)
|
|
DiskCacheThresholdBytes int64 `json:"disk_cache_threshold_bytes"`
|
|
}
|
|
|
|
var diskCacheStats DiskCacheStats
|
|
|
|
// GetDiskCacheStats 获取缓存统计信息
|
|
func GetDiskCacheStats() DiskCacheStats {
|
|
stats := DiskCacheStats{
|
|
ActiveDiskFiles: atomic.LoadInt64(&diskCacheStats.ActiveDiskFiles),
|
|
CurrentDiskUsageBytes: atomic.LoadInt64(&diskCacheStats.CurrentDiskUsageBytes),
|
|
ActiveMemoryBuffers: atomic.LoadInt64(&diskCacheStats.ActiveMemoryBuffers),
|
|
CurrentMemoryUsageBytes: atomic.LoadInt64(&diskCacheStats.CurrentMemoryUsageBytes),
|
|
DiskCacheHits: atomic.LoadInt64(&diskCacheStats.DiskCacheHits),
|
|
MemoryCacheHits: atomic.LoadInt64(&diskCacheStats.MemoryCacheHits),
|
|
DiskCacheMaxBytes: GetDiskCacheMaxSizeBytes(),
|
|
DiskCacheThresholdBytes: GetDiskCacheThresholdBytes(),
|
|
}
|
|
return stats
|
|
}
|
|
|
|
// IncrementDiskFiles 增加磁盘文件计数
|
|
func IncrementDiskFiles(size int64) {
|
|
atomic.AddInt64(&diskCacheStats.ActiveDiskFiles, 1)
|
|
atomic.AddInt64(&diskCacheStats.CurrentDiskUsageBytes, size)
|
|
}
|
|
|
|
// DecrementDiskFiles 减少磁盘文件计数
|
|
func DecrementDiskFiles(size int64) {
|
|
if atomic.AddInt64(&diskCacheStats.ActiveDiskFiles, -1) < 0 {
|
|
atomic.StoreInt64(&diskCacheStats.ActiveDiskFiles, 0)
|
|
}
|
|
if atomic.AddInt64(&diskCacheStats.CurrentDiskUsageBytes, -size) < 0 {
|
|
atomic.StoreInt64(&diskCacheStats.CurrentDiskUsageBytes, 0)
|
|
}
|
|
}
|
|
|
|
// IncrementMemoryBuffers 增加内存缓存计数
|
|
func IncrementMemoryBuffers(size int64) {
|
|
atomic.AddInt64(&diskCacheStats.ActiveMemoryBuffers, 1)
|
|
atomic.AddInt64(&diskCacheStats.CurrentMemoryUsageBytes, size)
|
|
}
|
|
|
|
// DecrementMemoryBuffers 减少内存缓存计数
|
|
func DecrementMemoryBuffers(size int64) {
|
|
atomic.AddInt64(&diskCacheStats.ActiveMemoryBuffers, -1)
|
|
atomic.AddInt64(&diskCacheStats.CurrentMemoryUsageBytes, -size)
|
|
}
|
|
|
|
// IncrementDiskCacheHits 增加磁盘缓存命中次数
|
|
func IncrementDiskCacheHits() {
|
|
atomic.AddInt64(&diskCacheStats.DiskCacheHits, 1)
|
|
}
|
|
|
|
// IncrementMemoryCacheHits 增加内存缓存命中次数
|
|
func IncrementMemoryCacheHits() {
|
|
atomic.AddInt64(&diskCacheStats.MemoryCacheHits, 1)
|
|
}
|
|
|
|
// ResetDiskCacheStats 重置命中统计信息(不重置当前使用量)
|
|
func ResetDiskCacheStats() {
|
|
atomic.StoreInt64(&diskCacheStats.DiskCacheHits, 0)
|
|
atomic.StoreInt64(&diskCacheStats.MemoryCacheHits, 0)
|
|
}
|
|
|
|
// ResetDiskCacheUsage 重置磁盘缓存使用量统计(用于清理缓存后)
|
|
func ResetDiskCacheUsage() {
|
|
atomic.StoreInt64(&diskCacheStats.ActiveDiskFiles, 0)
|
|
atomic.StoreInt64(&diskCacheStats.CurrentDiskUsageBytes, 0)
|
|
}
|
|
|
|
// SyncDiskCacheStats 从实际磁盘状态同步统计信息
|
|
// 用于修正统计与实际不符的情况
|
|
func SyncDiskCacheStats() {
|
|
fileCount, totalSize, err := GetDiskCacheInfo()
|
|
if err != nil {
|
|
return
|
|
}
|
|
atomic.StoreInt64(&diskCacheStats.ActiveDiskFiles, int64(fileCount))
|
|
atomic.StoreInt64(&diskCacheStats.CurrentDiskUsageBytes, totalSize)
|
|
}
|
|
|
|
// IsDiskCacheAvailable 检查是否可以创建新的磁盘缓存
|
|
func IsDiskCacheAvailable(requestSize int64) bool {
|
|
if !IsDiskCacheEnabled() {
|
|
return false
|
|
}
|
|
maxBytes := GetDiskCacheMaxSizeBytes()
|
|
currentUsage := atomic.LoadInt64(&diskCacheStats.CurrentDiskUsageBytes)
|
|
return currentUsage+requestSize <= maxBytes
|
|
}
|