From 98662c1d67d85c83987b2770ecb38ff3d71da663 Mon Sep 17 00:00:00 2001 From: hujiebin Date: Mon, 21 Aug 2023 12:31:34 +0800 Subject: [PATCH] feat:redis send gift queue --- cron/cron.go | 5 +- cron/gift_cron/send_gift_redis.go | 79 +++++++ domain/cache/gift_c/group_event.go | 34 +++ domain/service/event_s/cp_level.go | 304 +++++++++++++-------------- domain/service/event_s/event_init.go | 2 +- 5 files changed, 263 insertions(+), 161 deletions(-) create mode 100644 cron/gift_cron/send_gift_redis.go create mode 100644 domain/cache/gift_c/group_event.go diff --git a/cron/cron.go b/cron/cron.go index c2c4b5e..69f5de9 100644 --- a/cron/cron.go +++ b/cron/cron.go @@ -12,8 +12,9 @@ func Init() { if !config.IsMaster() { return } - gift_cron.SendGiftEventInit() // 礼物消息 - gift_cron.GiftRemark() // 礼物消息补偿 + //gift_cron.SendGiftEventInit() // 礼物消息 + //gift_cron.GiftRemark() // 礼物消息补偿 + gift_cron.SendGiftEvent() // 送礼事件 cp_cron.ClearCpExpire() // 清理过期cp cp_cron.CpAnniversaryNotice() // cp纪念日 cp_cron.CpInviteCancelInit() // cp邀请、解除到期结算 diff --git a/cron/gift_cron/send_gift_redis.go b/cron/gift_cron/send_gift_redis.go new file mode 100644 index 0000000..f4ee273 --- /dev/null +++ b/cron/gift_cron/send_gift_redis.go @@ -0,0 +1,79 @@ +package gift_cron + +import ( + "git.hilo.cn/hilo-common/domain" + "github.com/jinzhu/now" + "hilo-user/_const/enum/cp_e" + "hilo-user/domain/cache/gift_c" + "hilo-user/domain/event/gift_ev" + "hilo-user/domain/model/cp_m" + "time" +) + +// 送礼事件 +func SendGiftEvent() { + //if !config.IsMaster() { + // return + //} + go func() { + for true { + model := domain.CreateModelNil() + if sendGiftEvent := gift_c.BLPopQueueSendGift(model); sendGiftEvent != nil { + cpGiftEvent(model, sendGiftEvent) // cp送礼 + } + } + }() +} + +// 送礼增加cp等级 +// 送礼增加cp排行榜 +func cpGiftEvent(model *domain.Model, sendGiftEvent *gift_ev.SendGiftEvent) { + // 只处理cp礼物 + if !sendGiftEvent.ResGift.Cp { + return + } + for _, receiverUid := range sendGiftEvent.ReceiveUserIds { + diamonds := sendGiftEvent.GiftN * sendGiftEvent.ResGift.DiamondNum + // 有cp关系 + if cpRelation, exits := cp_m.GetCpRelationPair(model, sendGiftEvent.SendUserId, receiverUid); exits { + if err := cp_m.AddCpLevelPoints(model, cpRelation, diamonds, sendGiftEvent.SceneType, sendGiftEvent.SceneUid); err != nil { + model.Log.Errorf("AddCpLevelPoints fail:%v", err) + } + if err := cp_m.AddCpDayRank(model, cpRelation, diamonds); err != nil { + model.Log.Errorf("AddCpDayRank fail:%v", err) + } + // 检查最新的等级 + if cpLevel := cp_m.GetCpLevel(model, cpRelation.Id); cpLevel.CpId >= 0 { + points := cpLevel.Points + cp_e.CpLevelPoints[cpLevel.Level] + if err := cp_m.UpdateCpAchievement(model, cpLevel.CpId, cpRelation.UserId1, cpRelation.UserId2, cp_e.CpAchievementLevel, points); err != nil { + model.Log.Errorf("UpdateCpAchievement fail:%v", err) + } + } + // 检查最高的分数 + for _, queryType := range []string{"day", "week", "month"} { + var beginDate, endDate string + var cpAchievementType cp_e.CpAchievement + switch queryType { + case "day": + beginDate, endDate = time.Now().Format("2006-01-02"), time.Now().Format("2006-01-02") + cpAchievementType = cp_e.CpAchievementDayRank + case "week": + beginDate = now.BeginningOfWeek().Format("2006-01-02") + endDate = now.EndOfWeek().Format("2006-01-02") + cpAchievementType = cp_e.CpAchievementWeekRank + case "month": + beginDate = now.BeginningOfMonth().Format("2006-01-02") + endDate = now.EndOfMonth().Format("2006-01-02") + cpAchievementType = cp_e.CpAchievementMonthRank + } + if data := cp_m.GetCpDayRank(model, beginDate, endDate, cpRelation.Id); data.Score > 0 { + if err := cp_m.UpdateCpAchievement(model, cpRelation.Id, cpRelation.UserId1, cpRelation.UserId2, cpAchievementType, data.Score); err != nil { + model.Log.Errorf("UpdateCpAchievement fail:%v", err) + } + } + } + // 检查最新日周月榜单 + return // 业务场景允许提前break(cp是唯一的) + } + } +} diff --git a/domain/cache/gift_c/group_event.go b/domain/cache/gift_c/group_event.go new file mode 100644 index 0000000..c671000 --- /dev/null +++ b/domain/cache/gift_c/group_event.go @@ -0,0 +1,34 @@ +package gift_c + +import ( + "encoding/json" + "git.hilo.cn/hilo-common/domain" + "github.com/go-redis/redis/v8" + "hilo-user/domain/event/gift_ev" + "time" +) + +const EventSendGiftHiloUserQueue = "send:gift:queue:hilo_user" + +// redis pop event sendGift +func BLPopQueueSendGift(model *domain.Model) *gift_ev.SendGiftEvent { + var res *gift_ev.SendGiftEvent + queue := EventSendGiftHiloUserQueue + strs, err := model.Redis.BLPop(model, time.Second, queue).Result() + if err != nil { + if err != redis.Nil { + model.Log.Errorf("BLPopQueueSendGift fail:%v", err) + } + return nil + } + if len(strs) >= 2 { + content := strs[1] + res = new(gift_ev.SendGiftEvent) + if err := json.Unmarshal([]byte(content), res); err != nil { + model.Log.Errorf("BLPopQueueSendGift json fail:%v", err) + return nil + } + return res + } + return nil +} diff --git a/domain/service/event_s/cp_level.go b/domain/service/event_s/cp_level.go index 4d172e8..98a7b35 100644 --- a/domain/service/event_s/cp_level.go +++ b/domain/service/event_s/cp_level.go @@ -1,166 +1,154 @@ package event_s -import ( - "git.hilo.cn/hilo-common/domain" - "git.hilo.cn/hilo-common/resource/config" - "git.hilo.cn/hilo-common/resource/redisCli" - "github.com/jinzhu/now" - "hilo-user/_const/enum/cp_e" - "hilo-user/_const/enum/gift_e" - "hilo-user/domain/event/gift_ev" - "hilo-user/domain/model/cp_m" - "time" -) - // 送礼增加cp等级 // 送礼增加cp排行榜 -func CpGiftEvent() { - gift_ev.AddSendGiftEventSync(func(model *domain.Model, event interface{}) error { - sendGiftEvent, ok := event.(*gift_ev.SendGiftEvent) - if !ok { - model.Log.Errorf("AddSendGiftEventAsync event type err") - return nil - } - // 只处理cp礼物 - if !sendGiftEvent.ResGift.Cp { - return nil - } - for _, receiverUid := range sendGiftEvent.ReceiveUserIds { - diamonds := sendGiftEvent.GiftN * sendGiftEvent.ResGift.DiamondNum - // 有cp关系 - if cpRelation, exits := cp_m.GetCpRelationPair(model, sendGiftEvent.SendUserId, receiverUid); exits { - if err := cp_m.AddCpLevelPoints(model, cpRelation, diamonds, sendGiftEvent.SceneType, sendGiftEvent.SceneUid); err != nil { - model.Log.Errorf("AddCpLevelPoints fail:%v", err) - } - if err := cp_m.AddCpDayRank(model, cpRelation, diamonds); err != nil { - model.Log.Errorf("AddCpDayRank fail:%v", err) - } - // 检查最新的等级 - if cpLevel := cp_m.GetCpLevel(model, cpRelation.Id); cpLevel.CpId >= 0 { - points := cpLevel.Points + cp_e.CpLevelPoints[cpLevel.Level] - if err := cp_m.UpdateCpAchievement(model, cpLevel.CpId, cpRelation.UserId1, cpRelation.UserId2, cp_e.CpAchievementLevel, points); err != nil { - model.Log.Errorf("UpdateCpAchievement fail:%v", err) - } - } - // 检查最高的分数 - for _, queryType := range []string{"day", "week", "month"} { - var beginDate, endDate string - var cpAchievementType cp_e.CpAchievement - switch queryType { - case "day": - beginDate, endDate = time.Now().Format("2006-01-02"), time.Now().Format("2006-01-02") - cpAchievementType = cp_e.CpAchievementDayRank - case "week": - beginDate = now.BeginningOfWeek().Format("2006-01-02") - endDate = now.EndOfWeek().Format("2006-01-02") - cpAchievementType = cp_e.CpAchievementWeekRank - case "month": - beginDate = now.BeginningOfMonth().Format("2006-01-02") - endDate = now.EndOfMonth().Format("2006-01-02") - cpAchievementType = cp_e.CpAchievementMonthRank - } - if data := cp_m.GetCpDayRank(model, beginDate, endDate, cpRelation.Id); data.Score > 0 { - if err := cp_m.UpdateCpAchievement(model, cpRelation.Id, cpRelation.UserId1, cpRelation.UserId2, cpAchievementType, data.Score); err != nil { - model.Log.Errorf("UpdateCpAchievement fail:%v", err) - } - } - } - // 检查最新日周月榜单 - return nil // 业务场景允许提前break(cp是唯一的) - } - } - return nil - }) -} +//func CpGiftEvent() { +// gift_ev.AddSendGiftEventSync(func(model *domain.Model, event interface{}) error { +// sendGiftEvent, ok := event.(*gift_ev.SendGiftEvent) +// if !ok { +// model.Log.Errorf("AddSendGiftEventAsync event type err") +// return nil +// } +// // 只处理cp礼物 +// if !sendGiftEvent.ResGift.Cp { +// return nil +// } +// for _, receiverUid := range sendGiftEvent.ReceiveUserIds { +// diamonds := sendGiftEvent.GiftN * sendGiftEvent.ResGift.DiamondNum +// // 有cp关系 +// if cpRelation, exits := cp_m.GetCpRelationPair(model, sendGiftEvent.SendUserId, receiverUid); exits { +// if err := cp_m.AddCpLevelPoints(model, cpRelation, diamonds, sendGiftEvent.SceneType, sendGiftEvent.SceneUid); err != nil { +// model.Log.Errorf("AddCpLevelPoints fail:%v", err) +// } +// if err := cp_m.AddCpDayRank(model, cpRelation, diamonds); err != nil { +// model.Log.Errorf("AddCpDayRank fail:%v", err) +// } +// // 检查最新的等级 +// if cpLevel := cp_m.GetCpLevel(model, cpRelation.Id); cpLevel.CpId >= 0 { +// points := cpLevel.Points + cp_e.CpLevelPoints[cpLevel.Level] +// if err := cp_m.UpdateCpAchievement(model, cpLevel.CpId, cpRelation.UserId1, cpRelation.UserId2, cp_e.CpAchievementLevel, points); err != nil { +// model.Log.Errorf("UpdateCpAchievement fail:%v", err) +// } +// } +// // 检查最高的分数 +// for _, queryType := range []string{"day", "week", "month"} { +// var beginDate, endDate string +// var cpAchievementType cp_e.CpAchievement +// switch queryType { +// case "day": +// beginDate, endDate = time.Now().Format("2006-01-02"), time.Now().Format("2006-01-02") +// cpAchievementType = cp_e.CpAchievementDayRank +// case "week": +// beginDate = now.BeginningOfWeek().Format("2006-01-02") +// endDate = now.EndOfWeek().Format("2006-01-02") +// cpAchievementType = cp_e.CpAchievementWeekRank +// case "month": +// beginDate = now.BeginningOfMonth().Format("2006-01-02") +// endDate = now.EndOfMonth().Format("2006-01-02") +// cpAchievementType = cp_e.CpAchievementMonthRank +// } +// if data := cp_m.GetCpDayRank(model, beginDate, endDate, cpRelation.Id); data.Score > 0 { +// if err := cp_m.UpdateCpAchievement(model, cpRelation.Id, cpRelation.UserId1, cpRelation.UserId2, cpAchievementType, data.Score); err != nil { +// model.Log.Errorf("UpdateCpAchievement fail:%v", err) +// } +// } +// } +// // 检查最新日周月榜单 +// return nil // 业务场景允许提前break(cp是唯一的) +// } +// } +// return nil +// }) +//} // 漏掉加分数的送礼记录,补上cp增加分数 // 送礼增加cp等级 // 送礼增加cp排行榜 -func CompensateCpScore() { - if !config.IsMaster() { - return - } - model := domain.CreateModelNil() - num, err := redisCli.IncrNumExpire("scirpt:compensateCpScore", 1, time.Hour*999) - if err != nil { - model.Log.Errorf("CompensateCpScore err:%v", err) - } - if num > 1 { - model.Log.Errorf("CompensateCpScore 执行过了,退出") - return - } - // 查找需要补分的送礼记录 - type GiftOperate struct { - Id uint64 `json:"id"` - ResGiftId uint64 `json:"res_gift_id"` - GiftN int32 `json:"gift_n"` - SendUserId uint64 `json:"send_user_id"` - ReceiveUserId uint64 `json:"receive_user_id"` - SendUserDiamond uint32 `json:"send_user_diamond"` - SceneType int8 `json:"scene_type"` - SceneUid string `json:"scene_uid"` - CreatedTime time.Time `json:"created_time"` - } - rows := make([]*GiftOperate, 0) - err = model.DB().Model(GiftOperate{}). - Where("created_time < ?", "2023-06-22 11:20:15"). - Where("res_gift_id in (?)", - []int{3561, 3571, 3581, 3591, 3601, 3611, 3621, 3631, 3641, 3651, 3661, 3671, 3681, 3691, 3701, 3711}). - Find(&rows).Error - if err != nil { - model.Log.Errorf("CompensateCpScore err:%v", err) - return - } - model.Log.Infof("CompensateCpScore len(rows):%v", len(rows)) - - for idx, r := range rows { - diamonds := r.SendUserDiamond - // 有cp关系 - if cpRelation, exits := cp_m.GetCpRelationPair(model, r.SendUserId, r.ReceiveUserId); exits { - if err := cp_m.AddCpLevelPoints(model, cpRelation, diamonds, gift_e.GiftOperateSceneType(r.SceneType), r.SceneUid); err != nil { - model.Log.Errorf("CompensateCpScore AddCpLevelPoints fail:%v", err) - return - } - if err := cp_m.AddCpDayRank(model, cpRelation, diamonds); err != nil { - model.Log.Errorf("CompensateCpScore AddCpDayRank fail:%v", err) - return - } - // 检查最新的等级 - if cpLevel := cp_m.GetCpLevel(model, cpRelation.Id); cpLevel.CpId >= 0 { - points := cpLevel.Points + cp_e.CpLevelPoints[cpLevel.Level] - if err := cp_m.UpdateCpAchievement(model, cpLevel.CpId, cpRelation.UserId1, cpRelation.UserId2, cp_e.CpAchievementLevel, points); err != nil { - model.Log.Errorf("CompensateCpScore UpdateCpAchievement fail:%v", err) - } - } - // 检查最高的分数 - for _, queryType := range []string{"day", "week", "month"} { - var beginDate, endDate string - var cpAchievementType cp_e.CpAchievement - switch queryType { - case "day": - beginDate, endDate = r.CreatedTime.Format("2006-01-02"), r.CreatedTime.Format("2006-01-02") - cpAchievementType = cp_e.CpAchievementDayRank - case "week": - beginDate = now.With(r.CreatedTime).BeginningOfWeek().Format("2006-01-02") - endDate = now.With(r.CreatedTime).EndOfWeek().Format("2006-01-02") - cpAchievementType = cp_e.CpAchievementWeekRank - case "month": - beginDate = now.BeginningOfMonth().Format("2006-01-02") - endDate = now.EndOfMonth().Format("2006-01-02") - cpAchievementType = cp_e.CpAchievementMonthRank - } - if data := cp_m.GetCpDayRank(model, beginDate, endDate, cpRelation.Id); data.Score > 0 { - if err := cp_m.UpdateCpAchievement(model, cpRelation.Id, cpRelation.UserId1, cpRelation.UserId2, cpAchievementType, data.Score); err != nil { - model.Log.Errorf("CompensateCpScore UpdateCpAchievement fail:%v", err) - } - } - } - } - model.Log.Infof("CompensateCpScore idx:%v", idx) - if idx%1000 == 0 { - time.Sleep(time.Millisecond * 100) - } - } - - model.Log.Infof("CompensateCpScore 补偿完毕") -} +//func CompensateCpScore() { +// if !config.IsMaster() { +// return +// } +// model := domain.CreateModelNil() +// num, err := redisCli.IncrNumExpire("scirpt:compensateCpScore", 1, time.Hour*999) +// if err != nil { +// model.Log.Errorf("CompensateCpScore err:%v", err) +// } +// if num > 1 { +// model.Log.Errorf("CompensateCpScore 执行过了,退出") +// return +// } +// // 查找需要补分的送礼记录 +// type GiftOperate struct { +// Id uint64 `json:"id"` +// ResGiftId uint64 `json:"res_gift_id"` +// GiftN int32 `json:"gift_n"` +// SendUserId uint64 `json:"send_user_id"` +// ReceiveUserId uint64 `json:"receive_user_id"` +// SendUserDiamond uint32 `json:"send_user_diamond"` +// SceneType int8 `json:"scene_type"` +// SceneUid string `json:"scene_uid"` +// CreatedTime time.Time `json:"created_time"` +// } +// rows := make([]*GiftOperate, 0) +// err = model.DB().Model(GiftOperate{}). +// Where("created_time < ?", "2023-06-22 11:20:15"). +// Where("res_gift_id in (?)", +// []int{3561, 3571, 3581, 3591, 3601, 3611, 3621, 3631, 3641, 3651, 3661, 3671, 3681, 3691, 3701, 3711}). +// Find(&rows).Error +// if err != nil { +// model.Log.Errorf("CompensateCpScore err:%v", err) +// return +// } +// model.Log.Infof("CompensateCpScore len(rows):%v", len(rows)) +// +// for idx, r := range rows { +// diamonds := r.SendUserDiamond +// // 有cp关系 +// if cpRelation, exits := cp_m.GetCpRelationPair(model, r.SendUserId, r.ReceiveUserId); exits { +// if err := cp_m.AddCpLevelPoints(model, cpRelation, diamonds, gift_e.GiftOperateSceneType(r.SceneType), r.SceneUid); err != nil { +// model.Log.Errorf("CompensateCpScore AddCpLevelPoints fail:%v", err) +// return +// } +// if err := cp_m.AddCpDayRank(model, cpRelation, diamonds); err != nil { +// model.Log.Errorf("CompensateCpScore AddCpDayRank fail:%v", err) +// return +// } +// // 检查最新的等级 +// if cpLevel := cp_m.GetCpLevel(model, cpRelation.Id); cpLevel.CpId >= 0 { +// points := cpLevel.Points + cp_e.CpLevelPoints[cpLevel.Level] +// if err := cp_m.UpdateCpAchievement(model, cpLevel.CpId, cpRelation.UserId1, cpRelation.UserId2, cp_e.CpAchievementLevel, points); err != nil { +// model.Log.Errorf("CompensateCpScore UpdateCpAchievement fail:%v", err) +// } +// } +// // 检查最高的分数 +// for _, queryType := range []string{"day", "week", "month"} { +// var beginDate, endDate string +// var cpAchievementType cp_e.CpAchievement +// switch queryType { +// case "day": +// beginDate, endDate = r.CreatedTime.Format("2006-01-02"), r.CreatedTime.Format("2006-01-02") +// cpAchievementType = cp_e.CpAchievementDayRank +// case "week": +// beginDate = now.With(r.CreatedTime).BeginningOfWeek().Format("2006-01-02") +// endDate = now.With(r.CreatedTime).EndOfWeek().Format("2006-01-02") +// cpAchievementType = cp_e.CpAchievementWeekRank +// case "month": +// beginDate = now.BeginningOfMonth().Format("2006-01-02") +// endDate = now.EndOfMonth().Format("2006-01-02") +// cpAchievementType = cp_e.CpAchievementMonthRank +// } +// if data := cp_m.GetCpDayRank(model, beginDate, endDate, cpRelation.Id); data.Score > 0 { +// if err := cp_m.UpdateCpAchievement(model, cpRelation.Id, cpRelation.UserId1, cpRelation.UserId2, cpAchievementType, data.Score); err != nil { +// model.Log.Errorf("CompensateCpScore UpdateCpAchievement fail:%v", err) +// } +// } +// } +// } +// model.Log.Infof("CompensateCpScore idx:%v", idx) +// if idx%1000 == 0 { +// time.Sleep(time.Millisecond * 100) +// } +// } +// +// model.Log.Infof("CompensateCpScore 补偿完毕") +//} diff --git a/domain/service/event_s/event_init.go b/domain/service/event_s/event_init.go index 14d1079..652f709 100644 --- a/domain/service/event_s/event_init.go +++ b/domain/service/event_s/event_init.go @@ -14,7 +14,7 @@ import ( func EventInit() { UserBagSendEvent() - CpGiftEvent() + //CpGiftEvent() CpSpaceVisitEvent() } -- 2.22.0