package trafficcutoff import ( "context" "fmt" "git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/library/cache" "strings" "time" ) func acquireCutoffDedupe(ctx context.Context, card cutoffCard, runTime time.Time) (bool, string, error) { key := cutoffDedupeKey(card) if key == "" { return false, "", nil } value := fmt.Sprintf( "threshold=%.3f;used=%.3f;total=%.3f;remain=%.3f;time=%s", card.TrafficCutoffThreshold, card.UsedFlowMb, cutoffTotalFlowMb(card), cutoffRemainFlowMb(card), runTime.Format("2006-01-02 15:04:05"), ) ok, err := cache.Instance().SetIfNotExist(ctx, key, value, cutoffDedupeTTL) return ok, key, err } func releaseCutoffDedupe(ctx context.Context, key string) { key = strings.TrimSpace(key) if key == "" { return } _, _ = cache.Instance().Remove(ctx, key) } func releaseCutoffDedupeBatch(ctx context.Context, items []lockedCutoffCard) { for _, item := range items { releaseCutoffDedupe(ctx, item.DedupeKey) } } func cutoffDedupeKey(card cutoffCard) string { tenantId := strings.TrimSpace(card.TenantId) if tenantId == "" || card.Id <= 0 { return "" } return fmt.Sprintf("%s:card:%s:%d", cutoffDedupeKeyPrefix, tenantId, card.Id) }