Files
zt-closet-backend/internal/redisdao/virtualpay.go
T
2026-09-15 16:02:45 +08:00

68 lines
1.9 KiB
Go

package redisdao
import (
"context"
"fmt"
"time"
"git.lzcwy.cn/zhengchiliu/zt-closet-backend/global"
"git.lzcwy.cn/zhengchiliu/zt-closet-backend/internal/redismodel"
)
// VirtualPayUnpaidSet 标记某虚拟支付订单「最近一次查单确认未支付」,TTL 内不再重复查询。
func VirtualPayUnpaidSet(ctx context.Context, orderNo string, ttl time.Duration) error {
ctx, span := global.Tracer.Start(ctx, "redisdao.VirtualPayUnpaidSet")
defer span.End()
key := fmt.Sprintf(redismodel.KeyVirtualPayUnpaid, orderNo)
if err := global.RedisEngine.Set(ctx, key, 1, ttl).Err(); err != nil {
span.RecordError(err)
return err
}
return nil
}
// VirtualPayUnpaidDel 清除负缓存(订单已支付/已处理后调用,让后续流程不再跳过它)。
func VirtualPayUnpaidDel(ctx context.Context, orderNo string) error {
ctx, span := global.Tracer.Start(ctx, "redisdao.VirtualPayUnpaidDel")
defer span.End()
key := fmt.Sprintf(redismodel.KeyVirtualPayUnpaid, orderNo)
if err := global.RedisEngine.Del(ctx, key).Err(); err != nil {
span.RecordError(err)
return err
}
return nil
}
// VirtualPayUnpaidBatchGet 批量判断哪些订单命中负缓存。
// 用一次 MGET 代替 N 次 GET,避免逐单往返 Redis 放大单轮耗时。
func VirtualPayUnpaidBatchGet(ctx context.Context, orderNos []string) (map[string]bool, error) {
ctx, span := global.Tracer.Start(ctx, "redisdao.VirtualPayUnpaidBatchGet")
defer span.End()
result := make(map[string]bool, len(orderNos))
if len(orderNos) == 0 {
return result, nil
}
keys := make([]string, 0, len(orderNos))
for _, no := range orderNos {
keys = append(keys, fmt.Sprintf(redismodel.KeyVirtualPayUnpaid, no))
}
vals, err := global.RedisEngine.MGet(ctx, keys...).Result()
if err != nil {
span.RecordError(err)
return nil, err
}
for i, v := range vals {
if i >= len(orderNos) {
break
}
if v != nil {
result[orderNos[i]] = true
}
}
return result, nil
}