type RandomOffset map[string]int//args
type MatchUserArgs struct {Profile *pb.EntityXsUserProfileRecommendGender intBigAreaID uint32Rmo score.RandomOffset
}// 按评分获取推荐用户uidsGroup, more, err = home.New(false).GetMatchUsers(r.GetCtx(), &home.MatchUserArgs{Profile: profile,//执行搜索过滤的当前用户RecommendGender: recommendGender,//需要查的是男,还是女的列表BigAreaID: ub.BigareaId,//大区Rmo: rmo,//过滤条件,是一个map[string]int})type API struct {rds *redis.ClientScore :Api{HashKey: "user_score_hash_group_key",RefreshKey: "user_score_refresh_group_key",Store: getStorage(mode),Groups: []string{SCORE_GROUP_S, SCORE_GROUP_A, SCORE_GROUP_B, SCORE_GROUP_C, SCORE_GROUP_D, SCORE_GROUP_E, SCORE_GROUP_F, SCORE_GROUP_G, SCORE_GROUP_H, SCORE_GROUP_I},}
}// 优先在线用户onlineGroupMembers, onlineCount, err1 := MatchMembers(ctx, &MatchMembersArgs{MatchUserArgs: args,Rules: rules,Online: consts.USER_ONLINE,TotalNum: totalNum,})
1. 接收请求参数,进行解密到map[string]int
2. 初始化全局的各个组数据(过滤是按组来的)
3. 加载全局的组的规则数据(每个组都有自己的规则,这些规则数据在数据库,需要一次性加载到内存)
4. 优先按各个组的规则搜索在线的用户
5. 如果数据不够就从离线的用户中凑数
6. 返回结果4.1 确认当前搜索的uid在各个组里面的百分比(也就是应该为这个uid所提供各个组里面的相互比例,很明显uid越优质,那么提供的优质组里面的目标用户就越高)4.2 如果当前用户是 不是菲律宾国家的男性,就判断这个用户石村是 rich 或 vo标签的,最终(SCORE_GROUP_I,SCORE_GROUP_H,SCORE_GROUP_G)4.3 如果用户还没有 sgk 就根据uid%100 去 user_score_hash_group_key 拼接成redis的key,去里面
127.0.0.1:6379> keys user_score_hash_group_key*1) "user_score_hash_group_key_12"2) "user_score_hash_group_key_17"3) "user_score_hash_group_key_15"4) "user_score_hash_group_key_85"5) "user_score_hash_group_key_91"6) "user_score_hash_group_key_75"7) "user_score_hash_group_key_41"
127.0.0.1:6379> hgetall user_score_hash_group_key_691) "800242169"2) "user_score_set_d_5_male_offline"3) "810000069"4) "user_score_set_d_5_female_offline"5) "810000169"6) "user_score_set_c_5_female_offline"7) "810000269"8) "user_score_set_d_5_female_offline"9) "810000369"4.4 最终根据uid找到了当前用户属于哪个级别,然后根据级别key+yougo_friend_list_group_rate (user_score_set_d_5 + yougo_friend_list_group_rate)去redis里面获取rate(这个用户的再各个组里面比例的数据), 说白了就是先想办法搞到当前uid属于哪个级别,然后级别就确定了rate比例,各个级别的比例是有api设置的疑问:
1. 首页搜索优化 我看有个api 是用来设置 各个组的比例的 这个是用于什么场景呀? 估计是后门
2. 我看需求里面的比例跟我代码里面了解到的有点不一样,代码里面,比如 s,a,b,c,e,f,d依次取组,然后根据组的比例取用户,但产品是 h、s(f、g)、a、b、c… 怎么感觉组都没对齐 => 但产品是 h(f、g)、s、a、b、c… 这里的f,g属于H
// UserScore 计算用户评分
func (api *Api) UserScore(ctx context.Context, mem *Member) error {var err errorctxLog, b := ctx.Value(CTX_LOG_KEY).(*Logger)defer func() {if b && ctxLog.IsLog {ctxLog.Logs = append(ctxLog.Logs, fmt.Sprintf("[userscore] uid = %d, mem=%+vn", mem.UID, mem))if err != nil {ctxLog.Logs = append(ctxLog.Logs, err.Error())}}}()if err = MemberInfo(ctx, mem); err != nil {return gerror.Wrapf(err, fmt.Sprintf("fail to get member info [err=%+v]n", err))}if mem.Gender != consts.GENDER_MALE && mem.Gender != consts.GENDER_FEMALE {return fmt.Errorf("用户性别异常 【mem=%+v】", mem)}var score int// 新用户、运营配置用户 分组不参与评分if mem.IsOperatorConfig == MEM_USER_OPERATOR_CONFIG || mem.HasVoTag || mem.HasRichTag {score = SCORE_USER_OPERATOR_CONFIG} else if mem.IsNew == MEM_USER_NEW {score = SCORE_USER_NEW} else {score = scoresByGender(ctx, mem)}var scoreGroup stringif scoreGroup, err = groupByScore(mem, score); err != nil {return gerror.Wrapf(err, fmt.Sprintf("fail to divide group [err=%v]n", err.Error()))}var ub *pb.EntityXsUserBigareaif ub, err = dao.XsUserBigarea.Get(ctx, mem.UID); err != nil {return err}if ub == nil {return gerror.Newf("[match.matchUsers] user big area record not exist [uid=%v]", mem.UID)}groupKey := api.Store.GenGroupKey(ctx, &StoreMember{Gender: uint32(mem.Gender),Online: mem.Online,ScoreGroup: scoreGroup,BigAreaID: ub.BigareaId,})if b && ctxLog.IsLog {ctxLog.Logs = append(ctxLog.Logs, fmt.Sprintf("[userscore] uid score = %v divide group = %s, store group key = %sn", score, scoreGroup, groupKey))}//Hash获取历史分组并删除var preGroupKey stringif preGroupKey, err = api.Store.GetMemberGroupHash(ctx, &StoreMember{HashKey: api.hashShardKey(mem.UID), Identify: mem.UID}); err == nil && preGroupKey != "" {if err = api.Store.DelGroupMember(ctx, &StoreMember{Group: preGroupKey, Identify: mem.UID}); err != nil {return gerror.Wrapf(err, "fail to del group member")}}//设置当前score分组Hashif err = api.Store.SetMemberGroupHash(ctx, &StoreMember{HashKey: api.hashShardKey(mem.UID), Group: groupKey, Identify: mem.UID}); err != nil {return gerror.Wrapf(err, "fail to set member group hash")}//设置score分组if err = api.Store.SetGroupMember(ctx, &StoreMember{Group: groupKey,Identify: mem.UID,Score: float64(score),Gender: uint32(mem.Gender),Online: mem.Online,IsNew: mem.IsNew,}); err != nil {err = gerror.Wrapf(err, "fail to set group member")}return err
}MALE_RULE_OPT = []string{//RULE_COIN_BALANCE,//RULE_COIN_COST,//RULE_REAL_NAME_AUTH,//RULE_REAL_PEOPLE_AUTH,//RULE_CONTACT_AUTH,//RULE_VOICE_AUTH,//RULE_USER_DATA_INTEGRITY,//RULE_DITCH_AND_MSG,//RULE_CIRCLE_COMMENT_AND_LIKE,RULE_RECHARGE_WEEKLY,}FEMALE_RULE_OPT = []string{//RULE_MONEY_CASH_B_INCOME,//RULE_RECEIVE_DITCH_OR_MSG,//RULE_RECEIVE_RTC_COUNT,//RULE_SEND_RTC_COUNT,//RULE_REPLY_DITCH_OR_MSG,//RULE_DITCH_OR_PRIVATE_IM,//RULE_VIEW_OTHER_PROFILE_COUNT,//RULE_COIN_BALANCE,//RULE_REAL_NAME_AUTH,//RULE_REAL_PEOPLE_AUTH,//RULE_CONTACT_AUTH,//RULE_VOICE_AUTH,//RULE_IS_IN_BROKER,RULE_INCOME_WEEKLY,}
用户身高体重等信息的表
EntityXsYougoUserProfileExtend
//用户推荐
//用户搜索
//房间搜索
(s *chatRoomEsService) Open(ctx context.Context, rid, openTime uint32) error {
/Users/hugh/banban/goproject/yougo2/alo-room-server/app/service/room/busi///搜索用户
// @Router /go/yougo/home/search [get]// 直播历史观看记录
// 猜你喜欢的房间列表
://alpha.letsalloo/go/room/live/list
// protoc --go_out=. home.proto ./backend --env=local user setGroupRate //生成每个rate
1. 首页推荐是根据每个uid获取不同用户列表的一个需求
2. 每个uid在后台会定时算uid的一个得分(每天一次),存redis
3. cmd在算出uid的score之后,会继续根据score生成该uid对应的group,存redis
4. 有了1,2,3 三步的前提,那么用户在我们应用首页的时候,api是能够直接知道uid对应组是哪一个
5. 有了用户组,再根据全局设置的组里面 各个不同组里面用户的比例(这个一开始就全局设置了),去按比例获取用户已列表
6. 1,2,3是本次的需求变更点,4略微变化,5老逻辑查看每个用户的得分
zscore user.score.v2.home.list 810000606//app所有的用户cmd一开始就将分成各个类别,分类规则见下面规则.
// 用户全部分类之后,然后按uid所在组配置的各个 类型下用户的比例数据就出来了, 然后按比例列表
127.0.0.1:6379> keys user_score_set*1) "user_score_set_c_5_male_offline" //组成规则 user_score_set_c + 分区id + 性别 + 在线还是离线 (值是uids)2) "user_score_set_d_1_male_offline"3) "user_score_set_c_5_female_offline"4) "user_score_set_f_5_female_online"5) "user_score_set_s_2_male_offline"6) "user_score_set_h_1_male_offline"7) "user_score_set_h_2_male_offline"8) "user_score_set_d_5_female_offline"9) "user_score_set_d_1_female_offline"
10) "user_score_set_d_2_male_offline"
11) "user_score_set_d_5_male_offline"
12) "user_score_set_d_2_female_offline"
13) "user_score_set_f_5_female_offline"
14) "user_score_set_d_5_male_online"//查每个用户的分数,以及被设置的组g.Log().Debug("msg", "UserScoreV2-score8", "uid", uid, "bigareaId", bigareaId, "sex", sex, "score", score, "isNewUser", isNewUser, "online", online, "scoreGroup", scoreGroup)tail -f /home/log/yougo.http.stdout.log | grep HomeUserList1
tail -f /home/d.scoreV2.stdout.log | grep -E 'UserScoreV2-'
tail -f /home/log/xs/room_http.stdout.log//每个组获取用户的rate比例设置数据
hgetAll 2_yougo_friend_list_group_rate //获取菲律宾男,女的各个组的成分比例设置hgetAll 5_yougo_friend_list_group_rate //获取印尼男,女的各个组的成分比例设置
curl --location --request POST '120.26.42.149/go/yougo/h5/trend/topicDetail'
--header 'Content-Type: application/json'
--data-raw '{"format":"json","uid": 810002192,"tpid": 1669002688728687
}'{"success": true,"msg": "success","data": {"uid": 810002192,"topic_id": "1669002688728687","admin_status": "pending","app_id": 10,"attach": ["upload/202211/21/810002192/637af5bf2f1da.png"//动态图片地址],"atype": "picture","authority": "","cmt_num": 2,//评论数量"content": "",//动态文字内容"country_code": "CN","gift_num": 0,"giftid": 0,"language": "zh_CN","latitude": "","like_num": 1,//点赞数量"location": "武汉市","longitude": "","pron_rate": 0,"status": "success","tagtype": "","time": 1669002688,"video_duration": 0,"isfollow": 0,"name": "Isabel1",//发动态的用户名称"icon": "upload/202211/18/810002192/63774c28b79cd.png",//发动态的用户头像"sex": 2,"age": 18,"ttype": "user","has_like": 0,"mkname": "","official": 0,"in_room": 0,"card": null,"comments": [],"likes": [{"uid": 810002183,"name": "Phillip1","time": 1671350234,"mkname": "","icon": "upload/202212/08/810002183/63918d1c3ae60.png","sex": 1,"age": 0,"online": 1,"isfollow": 0}],"distance": 0,"nextCommentKey": "","cover": "","isReal": 1,"isAuthentication": 1,"relation": 0,"click_num": 345,"is_sign": false,"is_new": false,"label_id": 0,"label": "","area_id": 5,"nobility": null,"tags": [],"user_room_info": null},"code": "0"
}
//获取用户信息,房间信息(差个房间推荐列表)
curl --location --request POST '120.26.42.149/go/yougo/h5/room_detail'
--header 'Content-Type: application/json'
--data-raw '{"format":"json","uid": 810002190,//分享的房主的uid,分享链接透传"rid": 105712454//房间id,分享链接透传
}'{"success": true,"msg": "","data": {"user": {"uid": 810002190,"name": "Otto1","icon": "upload/202211/18/810002190/63772bfce565e.png","photos": []},"room": {"rid": 105712454,"name": "Otto1的房间","icon": "upload/202212/08/810002190/6391c38176908.png","user_name": "","online_num": 0,"types": ""}},"code": "0"
}//房间推荐列表api
curl --location --request GET '120.26.42.149/go/room/h5/recommend/list'
--header 'Content-Type: application/json'
--data-raw '{"format":"json","uid": 810002190//分享的谁的房间,这个在分享链接里面透传的
}'{"success": true,"msg": "","code": "","list": [{"rid": 105712505,"name": "Phillip1的房间",//房间名称"icon": "upload/202212/08/810002183/63918d1c3ae60.png",//房间图片"bicon": "","types": "auto","online_num": 1,//房间在线人数"area": "","language": "zh_cn","tag": null,"need_password": false,"uid": 810002183,//房主uid"user_name": "Phillip1"//房主用户名}]
}
curl --location --request POST '120.26.42.149/go/room/live/searchV2'
--header 'user-token: e000lhCfOQmUgoebS6ltl2DyQ6hvr8zXFbw2aWsVZsXkdwg3qNSykNylJ6ybSlHCadGzmr916rP4WuOw2KCepq3b1VF500kVzN1ZJyaGNQOTafozig'
--header 'Content-Type: application/json'
--data-raw '{"format":"json","keyword": 810002183
}'{"success": true,"msg": "","code": "","data": {"user": {"rid": 105712505,"user": {"uid": 810002183,"name": "Phillip1","icon": "upload/202212/08/810002183/63918d1c3ae60.png","sex": 1,"role": 0,"age": 20,"charm_level": 0,"finance_level": 0,"is_sign": false,"is_new": false,"nobility": null,"location": "","nobility_icon": "","user_tags": [],"alloo_uid": "110002183","city": "Wuhan","flag": 0,"icon_frame": "","live_property": "","watch_time": "0","last_live_time": "0","seat": "","entranceBanner": "","fontColor": "","designation": {"icon": ""}}},"room": {"rid": 105712505,"name": "Phillip1的房间","icon": "upload/202212/08/810002183/63918d1c3ae60.png","reviews": 0,"show_tag": null,"city": "Wuhan","uid": 810002183,"user_name": "Phillip1","property": "vip"}}
}
本文发布于:2024-01-28 10:25:03,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/17064087066752.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |