学习目标
文章订阅 - 实现群发消息功能
文章点赞 - 实现点对点消息功能
一 文章订阅 - 实现群发消息功能
1.1 订阅文章作者
用户在登录十次方以后,可以查看文章。如果觉得文章好,可以订阅文章作者,从而可以收到这个作者发布的新文章的消息。所以需要完成根据文章id,订阅文章作者。
- 功能分析
- 用户之间的文章订阅关系的数据存放在redis中。
- 用户订阅文章作者,则系统将作者的id放入用户自己的订阅集合(set类型),同时系统将用户的id放入文章作者的订阅者集合中。
- 由于redis的set集合,其中的数据是不重复的,所以不用担心重复数据的问题。
- 代码实现
需要在tensquare_article微服务中添加根据文章id订阅文章作者的功能,在ArticleController中添加以下代码:
/**
* 订阅或者取消订阅文章作者
* @param map
* 测试数据
* {
* "userId":"1",
* "articleId":"2"
* }
* @return
*/
@PostMapping("/subscribe")
private Result subscribe(@RequestBody Map map){
//根据文章ID,订阅文章作者,返回订阅状态,true表示订阅成功,false表示取消订阅成功
Boolean flag = articleService.subscribe(map.get("userId").toString(),map.get("articleId").toString());
if(flag){
return new Result(true,StatusCode.OK,"订阅成功");
}else{
return new Result(true,StatusCode.OK,"订阅取消");
}
}
编写ArticleService
@Autowired
private RedisTemplate redisTemplate;//注入Redis
public Boolean subscribe(String userId, String articleId) {
//根据文章ID查询文章作者ID
String authorId = articleDao.selectById(articleId).getUserid();
//将订阅设置为redis中的集合
String userKey = "article_subscribe_"+userId;
String authorKey = "article_author_"+authorId;
//通过isMember(K key, Object o)方法检查给定的元素是否在变量中
Boolean flag = redisTemplate.boundSetOps(userKey).isMember(authorId);
//userKey和authorKey分别为用户集合和作者集合,存放的authorId和userId为Key,防止重复订阅
if(flag){
//如何flag为true,已经订阅,则取消
redisTemplate.boundSetOps(userKey).remove(authorId);
redisTemplate.boundSetOps(aut