BBS论坛项目相关-18:热帖排行模块
热帖排行
根据帖子是否加精,评论数,点赞数,收藏数以及发布时间等进行计算加分然后排名
Log(精华分+评论数10+点赞数2+收藏数*2)+(发布时间-纪元)
用log让前期评论点赞等权重较重,后期影响较小。
为了效率较高,每次点赞评论等不立即进行算分,而是放入redis中进行缓存,之后定时进行计算。
设计一个帖子分数的key,当发生点赞评论等操作时就存入redis中。
redis中只是存储帖子分数发生变化的帖子id,所以使用redis的set存储,去重,防止重复计算。对帖子点赞,评论等行为,把帖子id放在redis。
发帖
@RequestMapping(path = "/add", method = RequestMethod.POST)
@ResponseBody
public String addDiscussPost(String title, String content) {
User user = hostHolder.getUser();
if (user == null) {
return CommunityUtil.getJSONString(403, "你还没有登录哦!");
}
DiscussPost post = new DiscussPost();
post.setUserId(user.getId());
post.setTitle(title);
post.setContent(content);
post.setCreateTime(new Date());
discussPostService.addDiscussPost(post);
// 触发发帖事件
Event event = new Event()
.setTopic(TOPIC_PUBLISH)
.setUserId(user.getId())
.setEntityType(ENTITY_TYPE_POST)
.setEntityId(post.getId());
eventProducer.fireEvent(event);
// 计算帖子分数
String redisKey = RedisKeyUtil.getPostScoreKey();
redisTemplate.opsForSet().add(redisKey, post.getId());
// 报错的情况,将来统一处理.
return CommunityUtil.getJSONString(0, "发布成功!");
}
加精
// 加精
@RequestMapping(path = "/wonderful", method = RequestMethod.POST)
@ResponseBody
public String setWonderful(int id) {
discussPostService.updateStatus