Spring Boot+MyBatis+Redis+ActiveMQ+MySQL+Thymeleaf实现简单的高并发点赞功能
1.项目概述
在社交网站或App中,点赞场景非常多,比如微信、微博、QQ空间、博客、抖音等软件都有点赞功能。别小看一个简单的点赞功能,里面要考虑的细节还是很多的。比如一些名人发的微博,由于其粉丝众多,一条微博可能在短时间内有上百万的点赞数。面对这种高并发点赞场景,如果项目没有设计好,必会导致后端服务器和数据库由于压力过大而出现异常。大型的互联网公司后端架构必回采取很多措施来解决这种高并发场景引发的问题。本项目虽然没有美观的前端页面和复杂的业务逻辑,但是能够把高并发访问场景使用到的小部分技术进行剖析与整合,形成一个小demo,并能应用到今后的工作中。由于我还是一名大三学生,因为疫情在家未参加实习,接触不到真实的高并发场景,但今后去找实习肯定也是需要到,所有特地做了这个小项目来联手。
2.数据库表和持久化类的设计
2.1 数据库设计
1.user表,用于存放用户的基本信息

为了应对在百万级数据的情况下,提高查询效率,建立索引如下:
CREATE INDEX idx_user_name ON user(name);
CREATE INDEX idx_user_account ON user(account);
2.mood表,用于存在微博消息

为了应对在百万级数据的情况下,提高查询效率,建立索引如下:
CREATE INDEX idx_mood_userId ON mood(userId);
3.user_mood表,用于建立用户与微博的关联,为了简化业务逻辑,此表省去了点赞者的用户名,即每当用户a点赞用户b的微博c时,会把b的用户名和c的id写入到user_mood表中。

同样的,为了应对在百万级数据的情况下,提高查询效率,建立索引如下:
CREATE INDEX idx_UM_userId ON user_mood(userID);
CREATE INDEX idx_UM_moodId ON user_mood(moodID);
2.2持久化类
1.User
package com.zhongger.highconcurrentpaise.domain;
import java.io.Serializable;
/**
* @Author Zhongger
* @Description User对象
* @Date 2020.2.28
*/
public class User implements Serializable {
private String id;
private String name;
private String account;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAccount() {
return account;
}
public void setAccount(String account) {
this.account = account;
}
@Override
public String toString() {
return "User{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", account='" + account + '\'' +
'}';
}
}
2.Mood
package com.zhongger.highconcurrentpaise.domain;
import java.io.Serializable;
import java.util.Date;
/**
* @Author Zhongger
* @Description 微博内容对象
* @Date 2020.2.28
*/
public class Mood implements Serializable {
private String id;
private String content;
private String userId;
private Date publishTime;
private Integer praiseNum;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public Date getPublishTime() {
return publishTime;
}
public void setPublishTime(Date publishTime) {
this.publishTime = publishTime;
}
public Integer getPraiseNum() {
return praiseNum;
}
public void setPraiseNum(Integer praiseNum) {
this.praiseNum = praiseNum;
}
@Override
public String toString() {
return "Mood{" +
"id='" + id + '\'' +
", content='" + content + '\'' +
", userId='" + userId + '\'' +
", publishTime=" + publishTime +
", praiseNum=" + praiseNum +
'}';
}
}
3.UserMood
package com.zhongger.highconcurrentpaise.domain;
import java.io.Serializable;
/**
* @Author Zhongger
* @Description 用户与朋友圈的关联类
* @Date 2020.2.28
*/
public class UserMood implements Serializable {
private String id;
private String userId;
private String moodId;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getMoodId() {
return moodId;
}
public void setMoodId(String moodId) {
this.moodId = moodId;
}
@Override
public String toString() {
return "UserMood{" +
"id='" + id + '\'' +
", userId='" + userId + '\'' +
", moodId='" + moodId + '\'' +
'}';
}
}
3.Dao层对象
由于本项目较小,采用注解版本的MyBatis来开发。
1.UserMapper:
package com.zhongger.highconcurrentpaise.Mapper;
import com.zhongger.highconcurrentpaise.domain.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
/**
* @Author Zhongger
* @Description 用户管理接口
* @Date 2020.2.28
*/
@Mapper
public interface UserMapper {
//查询用户
@Select("select id,name,account from user where id=#{id}")
User findUserById(@Param("id") String id);
}
2.MoodMapper
package com.zhongger.highconcurrentpaise.Mapper;
import com.zhongger.highconcurrentpaise.domain.Mood;
import org.apache.ibatis.annotations.Mapper

本文介绍了使用Spring Boot、MyBatis、Redis、ActiveMQ和MySQL实现高并发点赞功能的步骤,包括数据库设计、Redis缓存和ActiveMQ消息队列的集成,旨在解决并发场景下的服务器压力。
最低0.47元/天 解锁文章
1464





