热门定义:最近内容+热度值比较高
根据上面的描述,需要去判断是不是最近的内容,热度值是否达到要求。
下面将根据具体步骤给出简单的伪代码逻辑,希望可以帮助你完成热门推送的设计。
定义定时任务定时扫描
- 定义根据时间范围查询出内容的方法
//根据给定的时间范围查询出对应的内容集合
public List<Content> selectVedioByDay(Date start,Date end);
- 查询在定义为最近时间的内容,比如配置中定义了最近3天才算最近内容,所以查询时也只查询最近三天的内容
// 当天内容
List<Content> oneContent = selectVedioByDay(oneStart,oneEnd);
// 昨天内容
List<Content> twoContent = selectVedioByDay(twoStart,twoEnd);
// 前天内容
List<Content> threeContent = selectVedioByDay(threeStart,threeEnd);
- 查询出的内容进行遍历,判断其热度值是否达到了配置的热度值阈值,如果达到了,则将其放入到Redis的Set类型的集合中,key为
特定字符+内容发布日期
,设置3天的ttl过期时间
1. 热度值,可以通过视频播放量,点赞量,收藏量等权重计算得分
// 筛选出当天的热度视频id
List<Long> oneContentHotId = oneContent.stream()
.filter(a -> a.getCollect()*5 + a.getLike()*6 + a.getView()*2 > 阈值)
.map(Content::getId).collect(Collectors.toList());
// 将id集合放入当天的热度Set集合中
RedisCacheUtil.mset(RedisConstant.HOT_CONTENT + 今日日期字符串,oneContentHotId)
// 昨天和前天和当天的逻辑一样
查询最近的热门视频
- 查询时获取当前日期,将下面三个命令分别发送,目的是将日期也作为权重的一部分
- 从今天日期的set中随机获取10个内容
- 从昨天日期的set中随机获取3个内容
- 从前天日期的set中随机获取2个内容
这里从不同的日期取的内容数量不同是从业务角度去理解热度内容的定义,最近的内容它的热度高才有意义,否则前几天的高热度视频只是前几天热度比较高并不代表当天的热度高。
// 从今天日期的set中随机获取10个内容
List<Long> oneContentHotId = RedisCacheUtil.randomSet(RedisConstant.HOT_CONTENT + 今日日期字符串,10);
// 从今天日期的set中随机获取10个内容
List<Long> twoContentHotId =RedisCacheUtil.randomSet(RedisConstant.HOT_CONTENT + 昨天日期字符串,3);
// 从今天日期的set中随机获取10个内容
List<Long> threeContentHotId =RedisCacheUtil.randomSet(RedisConstant.HOT_CONTENT + 前天日期字符串,2);
- 获取到对应的内容id后,组装其其他信息返回
// 这里就是拿到今、昨、前天的高热度视频的id去库,或者其他数据存储的地方获取前端需要的内容信息返回集合即可