package dashboard import ( "context" "fmt" "github.com/redis/go-redis/v9" "github.com/shopspring/decimal" ) func (p *Projector) writeRealtimeRedis(ctx context.Context, contributions []Contribution) error { if p.redisClient == nil || len(contributions) == 0 { return nil } pipe := p.redisClient.Pipeline() for _, c := range contributions { if c.Empty() || c.DeltaSign == 0 { continue } key := fmt.Sprintf("%s:today:%s:%s:%s", p.cfg.Dashboard.RedisKeyPrefix, DailyDate(c.EventTime, p.storageZone).Format("2006-01-02"), c.SysOrigin, c.Country.Code, ) sign := decimal.NewFromInt(int64(c.DeltaSign)) newDealerUserRecharge := decimal.Zero if SamePeriod(c.UserCreatedAt, c.EventTime, PeriodWindow{Type: PeriodDay}, p.storageZone) { newDealerUserRecharge = c.NewDealerUserRecharge } hincrDecimal(pipe, ctx, key, "official_recharge", c.OfficialRecharge.Mul(sign)) hincrDecimal(pipe, ctx, key, "mifapay_recharge", c.MifapayRecharge.Mul(sign)) hincrDecimal(pipe, ctx, key, "google_recharge", c.GoogleRecharge.Mul(sign)) hincrDecimal(pipe, ctx, key, "dealer_recharge", c.DealerRecharge.Mul(sign)) hincrDecimal(pipe, ctx, key, "user_recharge", c.UserRecharge.Mul(sign)) hincrDecimal(pipe, ctx, key, "new_dealer_user_recharge", newDealerUserRecharge.Mul(sign)) hincrDecimal(pipe, ctx, key, "salary_exchange", c.SalaryExchange.Mul(sign)) hincrDecimal(pipe, ctx, key, "salary_transfer", c.SalaryTransfer.Mul(sign)) hincrDecimal(pipe, ctx, key, "lucky_gift_total_flow", c.LuckyGiftTotalFlow.Mul(sign)) hincrDecimal(pipe, ctx, key, "lucky_gift_payout", c.LuckyGiftPayout.Mul(sign)) hincrDecimal(pipe, ctx, key, "game_total_flow", c.GameTotalFlow.Mul(sign)) hincrDecimal(pipe, ctx, key, "game_payout", c.GamePayout.Mul(sign)) pipe.Expire(ctx, key, p.cfg.Dashboard.RealtimeRedisTTL) } _, err := pipe.Exec(ctx) return err } func hincrDecimal(pipe redis.Pipeliner, ctx context.Context, key string, field string, value decimal.Decimal) { if value.IsZero() { return } floatValue, _ := value.Float64() pipe.HIncrByFloat(ctx, key, field, floatValue) }