disk_cache_config.go 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. package common
  2. import (
  3. "sync"
  4. "sync/atomic"
  5. )
  6. // DiskCacheConfig 磁盘缓存配置(由 performance_setting 包更新)
  7. type DiskCacheConfig struct {
  8. // Enabled 是否启用磁盘缓存
  9. Enabled bool
  10. // ThresholdMB 触发磁盘缓存的请求体大小阈值(MB)
  11. ThresholdMB int
  12. // MaxSizeMB 磁盘缓存最大总大小(MB)
  13. MaxSizeMB int
  14. // Path 磁盘缓存目录
  15. Path string
  16. }
  17. // 全局磁盘缓存配置
  18. var diskCacheConfig = DiskCacheConfig{
  19. Enabled: false,
  20. ThresholdMB: 10,
  21. MaxSizeMB: 1024,
  22. Path: "",
  23. }
  24. var diskCacheConfigMu sync.RWMutex
  25. // GetDiskCacheConfig 获取磁盘缓存配置
  26. func GetDiskCacheConfig() DiskCacheConfig {
  27. diskCacheConfigMu.RLock()
  28. defer diskCacheConfigMu.RUnlock()
  29. return diskCacheConfig
  30. }
  31. // SetDiskCacheConfig 设置磁盘缓存配置
  32. func SetDiskCacheConfig(config DiskCacheConfig) {
  33. diskCacheConfigMu.Lock()
  34. defer diskCacheConfigMu.Unlock()
  35. diskCacheConfig = config
  36. }
  37. // IsDiskCacheEnabled 是否启用磁盘缓存
  38. func IsDiskCacheEnabled() bool {
  39. diskCacheConfigMu.RLock()
  40. defer diskCacheConfigMu.RUnlock()
  41. return diskCacheConfig.Enabled
  42. }
  43. // GetDiskCacheThresholdBytes 获取磁盘缓存阈值(字节)
  44. func GetDiskCacheThresholdBytes() int64 {
  45. diskCacheConfigMu.RLock()
  46. defer diskCacheConfigMu.RUnlock()
  47. return int64(diskCacheConfig.ThresholdMB) << 20
  48. }
  49. // GetDiskCacheMaxSizeBytes 获取磁盘缓存最大大小(字节)
  50. func GetDiskCacheMaxSizeBytes() int64 {
  51. diskCacheConfigMu.RLock()
  52. defer diskCacheConfigMu.RUnlock()
  53. return int64(diskCacheConfig.MaxSizeMB) << 20
  54. }
  55. // GetDiskCachePath 获取磁盘缓存目录
  56. func GetDiskCachePath() string {
  57. diskCacheConfigMu.RLock()
  58. defer diskCacheConfigMu.RUnlock()
  59. return diskCacheConfig.Path
  60. }
  61. // DiskCacheStats 磁盘缓存统计信息
  62. type DiskCacheStats struct {
  63. // 当前活跃的磁盘缓存文件数
  64. ActiveDiskFiles int64 `json:"active_disk_files"`
  65. // 当前磁盘缓存总大小(字节)
  66. CurrentDiskUsageBytes int64 `json:"current_disk_usage_bytes"`
  67. // 当前内存缓存数量
  68. ActiveMemoryBuffers int64 `json:"active_memory_buffers"`
  69. // 当前内存缓存总大小(字节)
  70. CurrentMemoryUsageBytes int64 `json:"current_memory_usage_bytes"`
  71. // 磁盘缓存命中次数
  72. DiskCacheHits int64 `json:"disk_cache_hits"`
  73. // 内存缓存命中次数
  74. MemoryCacheHits int64 `json:"memory_cache_hits"`
  75. // 磁盘缓存最大限制(字节)
  76. DiskCacheMaxBytes int64 `json:"disk_cache_max_bytes"`
  77. // 磁盘缓存阈值(字节)
  78. DiskCacheThresholdBytes int64 `json:"disk_cache_threshold_bytes"`
  79. }
  80. var diskCacheStats DiskCacheStats
  81. // GetDiskCacheStats 获取缓存统计信息
  82. func GetDiskCacheStats() DiskCacheStats {
  83. stats := DiskCacheStats{
  84. ActiveDiskFiles: atomic.LoadInt64(&diskCacheStats.ActiveDiskFiles),
  85. CurrentDiskUsageBytes: atomic.LoadInt64(&diskCacheStats.CurrentDiskUsageBytes),
  86. ActiveMemoryBuffers: atomic.LoadInt64(&diskCacheStats.ActiveMemoryBuffers),
  87. CurrentMemoryUsageBytes: atomic.LoadInt64(&diskCacheStats.CurrentMemoryUsageBytes),
  88. DiskCacheHits: atomic.LoadInt64(&diskCacheStats.DiskCacheHits),
  89. MemoryCacheHits: atomic.LoadInt64(&diskCacheStats.MemoryCacheHits),
  90. DiskCacheMaxBytes: GetDiskCacheMaxSizeBytes(),
  91. DiskCacheThresholdBytes: GetDiskCacheThresholdBytes(),
  92. }
  93. return stats
  94. }
  95. // IncrementDiskFiles 增加磁盘文件计数
  96. func IncrementDiskFiles(size int64) {
  97. atomic.AddInt64(&diskCacheStats.ActiveDiskFiles, 1)
  98. atomic.AddInt64(&diskCacheStats.CurrentDiskUsageBytes, size)
  99. }
  100. // DecrementDiskFiles 减少磁盘文件计数
  101. func DecrementDiskFiles(size int64) {
  102. if atomic.AddInt64(&diskCacheStats.ActiveDiskFiles, -1) < 0 {
  103. atomic.StoreInt64(&diskCacheStats.ActiveDiskFiles, 0)
  104. }
  105. if atomic.AddInt64(&diskCacheStats.CurrentDiskUsageBytes, -size) < 0 {
  106. atomic.StoreInt64(&diskCacheStats.CurrentDiskUsageBytes, 0)
  107. }
  108. }
  109. // IncrementMemoryBuffers 增加内存缓存计数
  110. func IncrementMemoryBuffers(size int64) {
  111. atomic.AddInt64(&diskCacheStats.ActiveMemoryBuffers, 1)
  112. atomic.AddInt64(&diskCacheStats.CurrentMemoryUsageBytes, size)
  113. }
  114. // DecrementMemoryBuffers 减少内存缓存计数
  115. func DecrementMemoryBuffers(size int64) {
  116. atomic.AddInt64(&diskCacheStats.ActiveMemoryBuffers, -1)
  117. atomic.AddInt64(&diskCacheStats.CurrentMemoryUsageBytes, -size)
  118. }
  119. // IncrementDiskCacheHits 增加磁盘缓存命中次数
  120. func IncrementDiskCacheHits() {
  121. atomic.AddInt64(&diskCacheStats.DiskCacheHits, 1)
  122. }
  123. // IncrementMemoryCacheHits 增加内存缓存命中次数
  124. func IncrementMemoryCacheHits() {
  125. atomic.AddInt64(&diskCacheStats.MemoryCacheHits, 1)
  126. }
  127. // ResetDiskCacheStats 重置命中统计信息(不重置当前使用量)
  128. func ResetDiskCacheStats() {
  129. atomic.StoreInt64(&diskCacheStats.DiskCacheHits, 0)
  130. atomic.StoreInt64(&diskCacheStats.MemoryCacheHits, 0)
  131. }
  132. // ResetDiskCacheUsage 重置磁盘缓存使用量统计(用于清理缓存后)
  133. func ResetDiskCacheUsage() {
  134. atomic.StoreInt64(&diskCacheStats.ActiveDiskFiles, 0)
  135. atomic.StoreInt64(&diskCacheStats.CurrentDiskUsageBytes, 0)
  136. }
  137. // SyncDiskCacheStats 从实际磁盘状态同步统计信息
  138. // 用于修正统计与实际不符的情况
  139. func SyncDiskCacheStats() {
  140. fileCount, totalSize, err := GetDiskCacheInfo()
  141. if err != nil {
  142. return
  143. }
  144. atomic.StoreInt64(&diskCacheStats.ActiveDiskFiles, int64(fileCount))
  145. atomic.StoreInt64(&diskCacheStats.CurrentDiskUsageBytes, totalSize)
  146. }
  147. // IsDiskCacheAvailable 检查是否可以创建新的磁盘缓存
  148. func IsDiskCacheAvailable(requestSize int64) bool {
  149. if !IsDiskCacheEnabled() {
  150. return false
  151. }
  152. maxBytes := GetDiskCacheMaxSizeBytes()
  153. currentUsage := atomic.LoadInt64(&diskCacheStats.CurrentDiskUsageBytes)
  154. return currentUsage+requestSize <= maxBytes
  155. }