package util import ( MC "app.yhyue.com/moapp/jybase/common" "app.yhyue.com/moapp/jybase/redis" "fmt" IC "bp.jydev.jianyu360.cn/BaseService/jyMicroservices/jyBXCore/rpc/init" ) // 标讯搜索:全文搜索和附件搜索限制 func IsSearchLimit(searchItems []string) bool { for _, searchItem := range searchItems { if searchItem == "detail" || searchItem == "filetext" { return true } } return false } func LimitSearchInit() { if IC.C.LimitSearchText.Flag { LimitSearchClear() for i := 0; i < IC.C.LimitSearchText.Count; i++ { redis.RPUSH("other", IC.SearchLimitKey, 1) } } } func LimitSearchClear() { redis.Del("other", IC.SearchLimitKey) } // 限制正文、附件查询 // return 1 正常 // return -1 抱歉!由于系统繁忙暂时无法进行搜索,请1分钟后再试! // return -2 抱歉!由于系统繁忙暂时无法进行搜索,请稍后再试! func IsLimited(limitFlag, userid string, isPayedUser, isNew bool) int64 { if !IC.C.LimitSearchText.Flag { return 1 } var llen = int(redis.LLEN("other", IC.SearchLimitKey)) if IC.C.LimitSearchText.TimeOut > 0 { //limitFlag, isNew := getFlag(r, w, userid) if isNew { if llen <= IC.C.LimitSearchText.Count/2 { timeLimit, _ := redis.Exists("other", fmt.Sprintf(IC.C.LimitSearchText.LimitKey, limitFlag)) if timeLimit { return -1 } } } redis.Put("other", fmt.Sprintf(IC.C.LimitSearchText.LimitKey, limitFlag), 1, IC.C.LimitSearchText.TimeOut) } if IC.C.LimitSearchText.Count == -2 { //不限制 return 1 } else if IC.C.LimitSearchText.Count == -1 { //无条件限制 return -2 } //免费和付费用户 使用并发的80%(默认)通道|| 保留一条通道给付费用户使用 if userid == "" { //未登录用户2个并发数限制, if IC.C.LimitSearchText.Count-IC.C.LimitSearchText.NoLogin <= 0 || llen <= IC.C.LimitSearchText.Count-IC.C.LimitSearchText.NoLogin || llen == 1 { return -2 } } else if !isPayedUser { if llen <= IC.C.LimitSearchText.Count*IC.C.LimitSearchText.Percentage/100 || llen == 1 { return -1 } } // pollLimit := redis.LPOP("other", IC.SearchLimitKey) if MC.IntAll(pollLimit) <= 0 { return -2 } return 1 } func Limit() { if !IC.C.LimitSearchText.Flag { return } if int(redis.LLEN("other", IC.SearchLimitKey)) < IC.C.LimitSearchText.Count { redis.RPUSH("other", IC.SearchLimitKey, 1) } } func IsCanLogin(userId string) bool { for _, v := range IC.C.LimitSearchText.UserIds { if v == userId { return true } } return false }