背景
随着社区发展,用户对于浏览视频类型的文章(沉浸式阅读)的需求越来越来大,并且视频也能更直观得展示内容。
需求
- 用户点击视频类型的文章时,接口只返回视频文章
- 每个视频有分类,优先返回当前分类的文章
- 用户每次看到的视频不重复
思路
-
分类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 的zset,member为 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重置回初始状态)