用户浏览信息时根据分类给用户推不重复的数据

367 阅读1分钟

背景


随着社区发展,用户对于浏览视频类型的文章(沉浸式阅读)的需求越来越来大,并且视频也能更直观得展示内容。

需求


  • 用户点击视频类型的文章时,接口只返回视频文章
  • 每个视频有分类,优先返回当前分类的文章
  • 用户每次看到的视频不重复

思路


  • 分类id 代码中为 category_id ;用户id为 user_id

  • 期望不重复 => 需要记录下用户看过哪些视频

  • 希望访问速度能快 => 考虑将用户看过的视频记录在redis中

  • 文章的分类信息已经在 MySQL 中记录。将视频再记录到redis中

  • 不同分类的文章可以用 redis 的list来存储 list:{$category_id}

  • 用户看视频的记录用redis 的zset来存储

    ​ 记录看到了 key_list 的哪个offset(只有这个需求的话,也可以不用zset,用hash)

    ​ 还需要当该分类看完时,找出未看完的分类,继续向后找。(将看完的置为负数之后,可以zrangebyscore找出没看完的)

实现


  • 设计两类 redis的key。一个是视频的list,一个category_id 的zset,每发一篇视频文章就往对应的list:{category_id)中 push 文章id;另一个是 user_id 的zsetmember 为 category_id, score 为 用户看过的 list:{category_id} 的 offset。用户每次请求视频文章接口,先拿offset,再lrange key offset expectedCount
  • 用户每次请求接口,从redis 的 list:{category_id}中取出10个,并且记录下用户看到了哪里(offset),已看完的置为负数。(没有取够10个时,会用zrangebyscore,找出未看完的offset最小那个category_id,递归继续取。如果全部取完了。就将所有category_id的zset重置回初始状态)