package service import ( "fmt" "strconv" "strings" "time" "91porn-server/common" "91porn-server/common/constant/redisconst" "91porn-server/common/log" "91porn-server/common/redis" "91porn-server/common/usertruth" "91porn-server/models/l/registermod" "91porn-server/models/v/usermod" "91porn-server/skd/skdg" ) const ( RestartSignal string = "RESTART" NotifyKeyPrefix string = "notify:user:new:register:" TrimPrefix string = "notify:" ) var MessageCh = make(chan *redis.Message, 100) var ChStatus = make(chan string) // DoRegister func DoRegister() { common.Go(func() { Sub(redisconst.Db0ExpiredChannel) }) common.Go(func() { for { select { case v, ok := <-MessageCh: if !ok { log.Warn("MessChan is nil waiting some second") } if v != nil { LoadNewRegister(v.Payload) } case v, ok := <-ChStatus: if !ok { log.Warn("Restart signal is not receive") } if v == RestartSignal { Sub(redisconst.Db0ExpiredChannel) } } } }) } // 接收过期的键 将信息存入到数据库中 只处理指定的过期键 notify:user:new:register func LoadNewRegister(expiredKey interface{}) { if v, ok := expiredKey.(string); ok { if strings.HasPrefix(v, NotifyKeyPrefix) { common.Go(func() { key := strings.TrimPrefix(v, TrimPrefix) uidstr := strings.TrimPrefix(v, NotifyKeyPrefix) uid, _ := strconv.ParseUint(uidstr, 10, 64) log.Info("Expired Key And Handle Data", log.Any("expiredKey", expiredKey), log.Any("needHandleKey", key), log.Any("uid", uid)) handleRegisterData(key, uid) }) } } } func handleRegisterData(key string, uid uint64) { fileds := skdg.Redis.Hkeys(key) //获取IP ip, _ := skdg.Redis.Hget(key, "ip") if len(fileds) > 0 { values, err := skdg.Redis.HMget(key, fileds) if err != nil { log.Warn("[Method] HandleRegisterData HMget Data from redis error", log.Any("key", key), log.E(err)) } qCountMap := make(map[string]int64) var qsArray []registermod.QueryStat rgister := ®istermod.NewRegisterLog{} for i := 0; i < len(fileds); i++ { if v, ok := values[i].(string); ok { cnt, err := strconv.ParseInt(v, 10, 64) if err != nil { continue } qCountMap[fileds[i]] = cnt qs := registermod.QueryStat{QueryUrl: fileds[i], Count: cnt} qsArray = append(qsArray, qs) } } _, _ = skdg.Redis.Del(key) rgister.CreatedAt = time.Now() rgister.UID = uid rgister.Query = qsArray rgister.IP = ip _ = registermod.InsertRegisterLog(rgister) score := usertruth.Score(qCountMap) //为区别默认值0 将计算出来的得分为0的情况 设置为-1 if score == 0 { score = -1 } _, _ = usermod.Update(uid, usermod.UserSelector{TrueScore: &score}) log.Info("[Method] HandleRegisterData success", log.Any("key", key), log.Any("trueScore", score), log.Any("uid", uid)) } } // 订阅 func Sub(channel string) { subpush, err := skdg.Redis.Subscribe(channel) if err != nil { ChStatus <- RestartSignal log.Warn(fmt.Sprintf("skd sever sub channel %s err", channel), log.E(err)) } ch := subpush.Channel() for msg := range ch { message := &redis.Message{Channel: msg.Channel, Payload: msg.Payload} MessageCh <- message } }