热帖排行
- 实现,在发帖、点赞、加精时将发生变化的帖子存入Redis中。再通过定时任务,每隔一定的时间,计算帖子的分数进行更新
- 新建PostScoreRefreshJob类进行处理
1.RedisKeyUtil
//帖子分数
public static String getPostScoreKey(){
return PREFIX_POST + SPLIT + "score";
}
2.处理Controller
DiscussPostController
//发布帖子
@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);
//在发布帖子时,异步地将帖子存到es中
//使用生产者生产事件
Event event = new Event()
.setTopic(TOPIC_PUBLISH)
.setEntityType(ENTITY_TYPE_POST)
.setEntityId(post.getId())
.setUserId(user.getId());
eventProducer.fireEvent(event);
//发布帖子时,也会有初始的分数,将其存在Redis
String redisKey = RedisKeyUtil.getPostScoreKey();
//选择set的原因:set中没有重复的数据,因此可保证我们不会存入多个重复的帖子,减少后面的计算量
redisTemplate.opsForSet().add(redisKey, post.getId());
//报错的情况,将来统一处理.
return CommunityUtil.getJSONString(0, "发布成功!");
}
//加精
@RequestMapping(path = "/wonderful", method = RequestMethod.POST)
@ResponseBody
public String setWonderful(int id) {
discussPostService.updateStatus(id, 1);
// 触发发帖事件
Event event = new Event()
.setTopic(TOPIC_PUBLISH)
.setUserId(hostHolder.getUser().getId())
.setEntityType(ENTITY_TYPE_POST)
.setEntityId(id);
eventProducer.fireEvent(event);
//帖子加精,会改变其分数,将其存在Redis
String redisKey = RedisKeyUtil.getPostScoreKey();
//选择set的原因:set中没有重复的数据,因此可保证我们不会存入多个重复的帖子,减少后面的计算量
redisTemplate.opsForSet().add(redisKey, id);
return CommunityUtil.getJSONString(0);
}
CommentController
//添加评论
@RequestMapping(path = "/add/{discussPostId}", method = RequestMethod.POST)
public String addComment(@PathVariable("discussPostId") int discussPostId, Comment comment){
//客户端表单中向服务器需要提交以下内容
/*
private int id;
private int userId;
private int entityType; //评论的类型,比如帖子的评论,评论用户评论的评论
private int entityId; //评论的帖子的id
private int targetId; //记录评论指向的人
private String content; //评论的内容
private int status; //表明状态,是否被拉黑
private Date createTime; //创建的时间*/
//其中 entityType entityId targetId content 需要表单中进行提交
/* comment.setId(user.getId());
String username = user.getUsername();
System.out.println(username);
model.addAttribute("username",username);*/
comment.setUserId(hostHolder.getUser().getId());
comment.setStatus(0);