package cacheSer import ( "fmt" "gitea.anxinyun.cn/container/common_models" "gitea.anxinyun.cn/container/common_models/constant/redisKey" "gitea.anxinyun.cn/container/common_utils" "log" "sync" "time" ) var once sync.Once var cacheWindowMaps sync.Map type CacheServer struct { CacheWindowMaps *sync.Map configHelper *common_utils.ConfigHelper } func NewCacheServer(configHelper *common_utils.ConfigHelper) *CacheServer { once.Do(func() { cacheWindowMaps = sync.Map{} }) return &CacheServer{ CacheWindowMaps: &cacheWindowMaps, configHelper: configHelper, } } func (c *CacheServer) CreatFilterWindow(stationId int, itemName string) common_models.CacheWindow { //新测点滑窗 size默认1 k := fmt.Sprintf("%d-%s", stationId, itemName) cacheWindow := common_models.NewCacheWindow(k, 1, 0, common_models.FilterParams{}) Filter, err := c.configHelper.GetFilter(stationId) if err == nil { for _, item := range Filter.Items { if itemName == item.FieldName { cacheWindow = common_models.NewCacheWindow(k, item.WindowSize, item.MethodId, item.Params) } } } return cacheWindow } func (c *CacheServer) UpdateCacheMap(key string, value common_models.CacheWindow) { c.CacheWindowMaps.Store(key, value) err := c.configHelper.SetChainedCacheObjWithExpiration(key, value.ToSaveCache(), time.Hour*6) if err != nil { log.Printf("updateCacheMap 异常,err=%s", err.Error()) } } // ReadCacheMap // read map 时 判断时间 超过2分钟 重新读取 func (c *CacheServer) ReadCacheMap(stationId int, itemName string) (common_models.CacheWindow, bool) { key := fmt.Sprintf("%s:%d:%s", redisKey.CacheWindow, stationId, itemName) if obj, ok := c.CacheWindowMaps.Load(key); ok { win, ok2 := obj.(common_models.CacheWindow) return win, ok2 } if preWindow, err := c.configHelper.GetCacheWindowObj(key); err == nil { //过期 if preWindow.CheckExpiration() { preData := preWindow.DeQueueAll() reloadWindow := c.CreatFilterWindow(stationId, itemName) if len(preData) > 0 { for _, datum := range preData { reloadWindow.EnQueue(datum) } return reloadWindow, true } } return preWindow, true } v := c.CreatFilterWindow(stationId, itemName) return v, true } // 获取缓存总数 测试用 func getSizeByCacheWindowMaps() int { size := 0 cacheWindowMaps.Range(func(key, value any) bool { size += 1 log.Printf("================ CacheWindowMap-key:%v", key) return true }) log.Printf("================= CacheWindowMap-size:%v", size) return size }