exposed_cache.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  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. "create_cache_ratio": GetCreateCacheRatioCopy(),
  41. "model_price": GetModelPriceCopy(),
  42. }
  43. exposedData.Store(&exposedCache{
  44. data: newData,
  45. expiresAt: time.Now().Add(exposedDataTTL),
  46. })
  47. return cloneGinH(newData)
  48. }