匹配算法-优化
12-13 匹配算法-优化
主要内容:
- 开发完成个人队伍页面、队伍检索等功能(前端、后端)
- 开发用户匹配功能(编辑距离算法)
- 优化用户匹配功能后端,开发前端用户匹配模式
- 优化前端加载效果,使用骨架屏
- 优化前端队伍操作权限
- 实现前端导航标题动态切换
- 优化前端、完善部分功能
前端不同页面怎么传递数据?
- url querystring (xxx?id=1) 比较适用于页面跳转
- url (/team/:id,xxx/1)
- hash (/team#1)
- localStorage
- context(全局变量,同页面或整个项目要访问的公共变量)
随机匹配
需求背景:为了帮助大家更快地发现和自己兴趣相同的朋友
思考:匹配一个还是多个?
答:匹配多个,并且按照匹配的相似度从高到低排序
思考:怎么匹配?(根据什么来进行匹配?)
答:根据标签 tags
还可以根据 user_team 匹配加入相同队伍的用户
问题本质:找到有相似标签的用户
1.怎么匹配?
- 找到有共同标签最多的用户(Top N)
- 共同标签越多,分数越高,月排在前面
- 如没有匹配的用户,随机推荐(降级方案)
两种算法
最小编辑距离:字符串 1 通过最少多少次增删改字符的操作可以变成字符串 2
- 余弦相似度算法(如果需要带权重计算,比如学什么方向最重要,性别相对次要)
2.怎么对所有用户匹配,去取TOP?
直接取出所有用户,依次和当前用户计算分数,去 TOP N (54 秒)
优化方法
- 切忌不要在数据量答的时候循环输出日志(取消日志后 20 秒)
- Map 存了所有的分数信息,占用内存
解决:维护一个固定长度的有序集合(sortedSet),只保留分数最高的几个用户(时间换空间) - 细节:剔除自己 √
- 尽量只查需要的数据:
a. 过滤掉标签为空的用户 √
b. 根据部分标签取用户(前提是能区分出来哪个标签比较重要)
c. 只查需要的数据 (比如 id 和 tags) √ (7 秒) - 提前查?(定时任务)
a. 提前给所有用户给缓存(不适用于经常更新的数据)
b. 提前运算出来结果,缓存(针对一些重点用户,提前缓存)
类比大数据推荐机制
大数据推荐场景:比如说几个亿个商品,难道要查出所有商品?难道要对所有数据计算一遍相似度?
大数据推荐流程:
- 检索 => 召回 => 粗排 => 精排 => 重排序等
- 检索:尽可能多地查符合要求的数据(比如按记录查)
- 召回:查询可能要用到的数据(不做运算)
- 粗排:粗略排序,简单运算(运算相对轻量)
- 精排:精细排序,确定固定排位
分表学习建议
- mycat、 sharding sphere 框架
- 一致性 hash 算法
队伍操作权限控制
权限整理
加入队伍:仅非队伍创建人、且未加入队伍的人可见
更新队伍:仅创建人可见
解散队伍:仅创建人可见
退出队伍:创建人不可见,仅加入队伍的人可见
权限控制
仅加入队伍和创建队伍的人看到队伍操作按钮(listTeam 接口要能获取我加入的队伍状态)
方案 1:前端查询我加入了哪些队伍列表,然后判断每个队伍 id 是否在列表中(前端要多发一次请求)
方案 2:在后端处理(推荐)
项目优化
前端导航栏【标题】问题
解决:使用 router.beforeEach, 根据要跳转页面的 URL 路径匹配 config/routes 配置 title 字段强制登录,自动跳转到登录页
解决:axios 全局配置响应拦截器、并且添加重定向
区别公开和加密队伍;加入有密码的队伍,要指定密码
展示已加入队伍人数
并发时,重复加入队伍的问题
解决:加锁、分布式锁
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 墨枫个人博客!
评论