Spring Boot+MyBatis+Redis+ActiveMQ+MySQL+Thymeleaf实现简单的高并发点赞功能

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

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
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值