package initialize import ( "fmt" "strconv" "strings" "time" "shop-api/global" "shop-api/service" "shop-api/utils" "github.com/go-redis/redis" "go.uber.org/zap" ) func Redis() { redisCfg := global.MG_CONFIG.Redis client := redis.NewClient(&redis.Options{ Addr: redisCfg.Addr, Password: redisCfg.Password, // no password set DB: redisCfg.DB, // use default DB }) pong, err := client.Ping().Result() if err != nil { global.MG_LOG.Error("redis connect ping failed, err:", zap.Any("err", err)) } else { global.MG_LOG.Info("redis connect ping response:", zap.String("pong", pong)) global.MG_REDIS = client } // 开启过期消息订阅 go PubsunChannel(client) } func PubsunChannel(client *redis.Client) { pubsub := client.Subscribe("__keyevent@" + strconv.Itoa(global.MG_CONFIG.Redis.DB) + "__:expired") defer pubsub.Close() for msg := range pubsub.Channel() { key := strings.Split(msg.Payload, "-") if len(key) > 1 { switch key[0] { case "test": fmt.Println(key) case "orderBack": // 订单超时 err, result := utils.RedisSetNX(key[0]+":"+key[0]+"-"+key[1], "used", 10*time.Second) if result && err == nil { go service.UserOrderBack(key[1]) } case "orderConfirm": // 订单确认 err, result := utils.RedisSetNX(key[0]+":"+key[0]+"-"+key[1], "used", 10*time.Second) if result && err == nil { go service.UserOrderConfirm(key[1]) } default: // 默认处理 } } } }