12-13 匹配算法-优化

主要内容:

  1. 开发完成个人队伍页面、队伍检索等功能(前端、后端)
  2. 开发用户匹配功能(编辑距离算法)
  3. 优化用户匹配功能后端,开发前端用户匹配模式
  4. 优化前端加载效果,使用骨架屏
  5. 优化前端队伍操作权限
  6. 实现前端导航标题动态切换
  7. 优化前端、完善部分功能

前端不同页面怎么传递数据?

  1. url querystring (xxx?id=1) 比较适用于页面跳转
  2. url (/team/:id,xxx/1)
  3. hash (/team#1)
  4. localStorage
  5. context(全局变量,同页面或整个项目要访问的公共变量)

随机匹配

需求背景:为了帮助大家更快地发现和自己兴趣相同的朋友

思考:匹配一个还是多个?

答:匹配多个,并且按照匹配的相似度从高到低排序

思考:怎么匹配?(根据什么来进行匹配?)

答:根据标签 tags

还可以根据 user_team 匹配加入相同队伍的用户

问题本质:找到有相似标签的用户

1.怎么匹配?

  1. 找到有共同标签最多的用户(Top N)
  2. 共同标签越多,分数越高,月排在前面
  3. 如没有匹配的用户,随机推荐(降级方案)

两种算法

最小编辑距离:字符串 1 通过最少多少次增删改字符的操作可以变成字符串 2

  • 余弦相似度算法(如果需要带权重计算,比如学什么方向最重要,性别相对次要)

2.怎么对所有用户匹配,去取TOP?

直接取出所有用户,依次和当前用户计算分数,去 TOP N (54 秒)

优化方法

  1. 切忌不要在数据量答的时候循环输出日志(取消日志后 20 秒)
  2. Map 存了所有的分数信息,占用内存
    解决:维护一个固定长度的有序集合(sortedSet),只保留分数最高的几个用户(时间换空间)
  3. 细节:剔除自己 √
  4. 尽量只查需要的数据:
    a. 过滤掉标签为空的用户 √
    b. 根据部分标签取用户(前提是能区分出来哪个标签比较重要)
    c. 只查需要的数据 (比如 id 和 tags) √ (7 秒)
  5. 提前查?(定时任务)
    a. 提前给所有用户给缓存(不适用于经常更新的数据)
    b. 提前运算出来结果,缓存(针对一些重点用户,提前缓存)

类比大数据推荐机制

大数据推荐场景:比如说几个亿个商品,难道要查出所有商品?难道要对所有数据计算一遍相似度?

大数据推荐流程:

  • 检索 => 召回 => 粗排 => 精排 => 重排序等
  • 检索:尽可能多地查符合要求的数据(比如按记录查)
  • 召回:查询可能要用到的数据(不做运算)
  • 粗排:粗略排序,简单运算(运算相对轻量)
  • 精排:精细排序,确定固定排位

分表学习建议

  1. mycat、 sharding sphere 框架
  2. 一致性 hash 算法

队伍操作权限控制

权限整理

加入队伍:仅非队伍创建人、且未加入队伍的人可见

更新队伍:仅创建人可见

解散队伍:仅创建人可见

退出队伍:创建人不可见,仅加入队伍的人可见

权限控制

仅加入队伍和创建队伍的人看到队伍操作按钮(listTeam 接口要能获取我加入的队伍状态)

方案 1:前端查询我加入了哪些队伍列表,然后判断每个队伍 id 是否在列表中(前端要多发一次请求)

方案 2:在后端处理(推荐)

项目优化

  1. 前端导航栏【标题】问题
    解决:使用 router.beforeEach, 根据要跳转页面的 URL 路径匹配 config/routes 配置 title 字段

  2. 强制登录,自动跳转到登录页

    解决:axios 全局配置响应拦截器、并且添加重定向

  3. 区别公开和加密队伍;加入有密码的队伍,要指定密码

  4. 展示已加入队伍人数

  5. 并发时,重复加入队伍的问题
    解决:加锁、分布式锁