1
0

exposed_cache.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. package ratio_setting
  2. import (
  3. "sync"
  4. "sync/atomic"
  5. "time"
  6. "github.com/gin-gonic/gin"
  7. )
  8. const exposedDataTTL = 30 * time.Second
  9. type exposedCache struct {
  10. data gin.H
  11. expiresAt time.Time
  12. }
  13. var (
  14. exposedData atomic.Value
  15. rebuildMu sync.Mutex
  16. )
  17. func InvalidateExposedDataCache() {
  18. exposedData.Store((*exposedCache)(nil))
  19. }
  20. func cloneGinH(src gin.H) gin.H {
  21. dst := make(gin.H, len(src))
  22. for k, v := range src {
  23. dst[k] = v
  24. }
  25. return dst
  26. }
  27. func GetExposedData() gin.H {
  28. if c, ok := exposedData.Load().(*exposedCache); ok && c != nil && time.Now().Before(c.expiresAt) {
  29. return cloneGinH(c.data)
  30. }
  31. rebuildMu.Lock()
  32. defer rebuildMu.Unlock()
  33. if c, ok := exposedData.Load().(*exposedCache); ok && c != nil && time.Now().Before(c.expiresAt) {
  34. return cloneGinH(c.data)
  35. }
  36. newData := gin.H{
  37. "model_ratio": GetModelRatioCopy(),
  38. "completion_ratio": GetCompletionRatioCopy(),
  39. "cache_ratio": GetCacheRatioCopy(),
  40. "model_price": GetModelPriceCopy(),
  41. }
  42. exposedData.Store(&exposedCache{
  43. data: newData,
  44. expiresAt: time.Now().Add(exposedDataTTL),
  45. })
  46. return cloneGinH(newData)
  47. }