Skip to content

RenhaoX/LikeSystem

Repository files navigation

高并发点赞系统

项目概述

这是一个基于 Spring Boot + Redis + MySQL 实现的高并发点赞系统,具备以下能力:

  • 点赞(支持幂等)
  • 取消点赞(支持幂等)
  • 查询用户是否点赞
  • 查询点赞总数

技术栈

  • Java 21
  • Spring Boot 3.2.0
  • Maven
  • MySQL 8.0
  • Redis 6.x
  • MyBatis-Plus 3.5.5
  • Druid 连接池
  • Lombok

项目目录结构

LikeSystem/
├── src/
│   ├── main/
│   │   ├── java/com/amts/likesystem/
│   │   │   ├── common/                    # 通用模块
│   │   │   │   ├── exception/            # 异常处理
│   │   │   │   │   ├── BusinessException.java
│   │   │   │   │   └── GlobalExceptionHandler.java
│   │   │   │   ├── response/             # 统一返回结构
│   │   │   │   │   └── Result.java
│   │   │   │   └── util/                 # 工具类
│   │   │   │       └── RedisKeyUtil.java
│   │   │   ├── config/                   # 配置类
│   │   │   │   ├── MyMetaObjectHandler.java
│   │   │   │   └── RedisConfig.java
│   │   │   ├── controller/               # 接口层
│   │   │   │   └── LikeController.java
│   │   │   ├── manager/                  # 缓存与数据库协调层
│   │   │   │   └── LikeManager.java
│   │   │   ├── mapper/                   # 数据访问层
│   │   │   │   ├── LikeStatisticsMapper.java
│   │   │   │   └── UserLikeMapper.java
│   │   │   ├── model/                    # 数据模型
│   │   │   │   ├── dto/                  # 数据传输对象
│   │   │   │   │   └── LikeDTO.java
│   │   │   │   ├── entity/               # 实体类
│   │   │   │   │   ├── LikeStatistics.java
│   │   │   │   │   └── UserLike.java
│   │   │   │   └── vo/                   # 视图对象
│   │   │   │       ├── LikeCountVO.java
│   │   │   │       └── LikeStatusVO.java
│   │   │   ├── service/                  # 业务逻辑层
│   │   │   │   ├── LikeService.java
│   │   │   │   └── impl/
│   │   │   │       └── LikeServiceImpl.java
│   │   │   └── LikeSystemApplication.java  # 启动类
│   │   └── resources/
│   │       ├── application.yml           # 应用配置
│   │       └── schema.sql                # 数据库脚本
│   └── test/
├── pom.xml                                # Maven 配置
├── nginx.conf                             # Nginx 配置
└── API文档.md                             # API 文档

数据库设计

Redis Key 设计

  1. 点赞数 Key: like:count:{targetType}:{targetId}

    • 存储类型: String
    • 存储值: 点赞总数
  2. 用户点赞状态 Key: like:user:{userId}:{targetType}:{targetId}

    • 存储类型: String
    • 存储值: true/false

MySQL 表设计

user_like(用户点赞记录表)

字段 类型 说明
id bigint 主键ID
user_id bigint 用户ID
target_type tinyint 点赞对象类型:1-文章,2-评论,3-动态
target_id bigint 点赞对象ID
status tinyint 点赞状态:1-已点赞,0-已取消
create_time datetime 创建时间
update_time datetime 更新时间
deleted tinyint 逻辑删除:0-未删除,1-已删除

索引:

  • 主键索引: id
  • 唯一索引: uk_user_target (user_id, target_type, target_id)
  • 普通索引: idx_target (target_type, target_id), idx_create_time (create_time)

like_statistics(点赞统计表)

字段 类型 说明
id bigint 主键ID
target_type tinyint 点赞对象类型:1-文章,2-评论,3-动态
target_id bigint 点赞对象ID
like_count int 点赞总数
create_time datetime 创建时间
update_time datetime 更新时间
deleted tinyint 逻辑删除:0-未删除,1-已删除

索引:

  • 主键索引: id
  • 唯一索引: uk_target (target_type, target_id)

如何运行项目

前置要求

  1. Java 21+
  2. Maven 3.6+
  3. MySQL 8.0+
  4. Redis 6.x+
  5. Nginx(可选,用于反向代理)

1. 数据库初始化

执行数据库脚本:

CREATE DATABASE IF NOT EXISTS like_system DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

USE like_system;

CREATE TABLE `user_like` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `target_type` tinyint NOT NULL COMMENT '点赞对象类型:1-文章,2-评论,3-动态',
  `target_id` bigint NOT NULL COMMENT '点赞对象ID',
  `status` tinyint NOT NULL DEFAULT 1 COMMENT '点赞状态:1-已点赞,0-已取消',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `deleted` tinyint NOT NULL DEFAULT 0 COMMENT '逻辑删除:0-未删除,1-已删除',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_user_target` (`user_id`, `target_type`, `target_id`),
  KEY `idx_target` (`target_type`, `target_id`),
  KEY `idx_create_time` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户点赞记录表';

CREATE TABLE `like_statistics` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `target_type` tinyint NOT NULL COMMENT '点赞对象类型:1-文章,2-评论,3-动态',
  `target_id` bigint NOT NULL COMMENT '点赞对象ID',
  `like_count` int NOT NULL DEFAULT 0 COMMENT '点赞总数',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `deleted` tinyint NOT NULL DEFAULT 0 COMMENT '逻辑删除:0-未删除,1-已删除',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_target` (`target_type`, `target_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='点赞统计表';

2. 修改配置

编辑 src/main/resources/application.yml,修改数据库和Redis连接信息:

spring:
  datasource:
    url: jdbc:mysql://192.168.139.135:3306/like_system?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false&allowPublicKeyRetrieval=true
    username: amts
    password: your_password

  data:
    redis:
      host: 192.168.139.135
      port: 6379
      database: 0

3. 编译项目

mvn clean package

4. 启动应用

mvn spring-boot:run

或者运行打包后的jar文件:

java -jar target/like-system-1.0.0.jar

5. 启动Nginx(可选)

使用提供的 nginx.conf 配置文件启动Nginx:

nginx -c /path/to/nginx.conf

6. 测试接口

查看 API文档.md 获取详细的接口说明和测试示例。

架构设计

访问链路

Client → Nginx → Spring Boot → Redis + MySQL

分层架构

  • Controller: 接口层,处理HTTP请求和响应
  • Service: 业务逻辑层,处理业务逻辑
  • Manager: 缓存与数据库协调层,统一管理Redis和MySQL操作
  • Mapper: 数据访问层,直接操作数据库

核心设计

  1. 幂等性: 点赞和取消点赞操作都支持幂等
  2. 缓存优先: 查询优先从Redis获取数据
  3. 双写: 写操作同时更新Redis和MySQL,保证数据一致性
  4. 异步处理: Redis操作快速响应,MySQL操作作为最终存储

性能指标

  • QPS: 1000+
  • 查询响应时间: < 20ms
  • 写操作响应时间: < 50ms

接口说明

详细接口文档请查看 API文档.md

主要接口

  1. POST /api/like/like - 点赞
  2. POST /api/like/cancel - 取消点赞
  3. GET /api/like/status - 查询点赞状态
  4. GET /api/like/count - 查询点赞总数
  5. GET /api/like/health - 健康检查

监控和日志

应用集成了 Spring Boot Actuator,可以监控应用健康状态:

  • 健康检查: http://localhost:8080/api/actuator/health
  • 应用信息: http://localhost:8080/api/actuator/info
  • 指标信息: http://localhost:8080/api/actuator/metrics

日志级别在 application.yml 中配置:

  • Root: INFO
  • 应用包: DEBUG
  • MyBatis-Plus: DEBUG

异常处理

系统使用全局异常处理器统一处理异常:

  • BusinessException: 业务异常
  • IllegalArgumentException: 参数异常
  • MethodArgumentNotValidException: 参数校验异常
  • Exception: 系统异常

所有异常都返回统一的JSON格式响应。

注意事项

  1. 确保MySQL和Redis服务正常运行
  2. 修改配置文件中的连接信息
  3. 执行数据库脚本创建表结构
  4. 建议在生产环境中使用连接池和缓存配置
  5. 高并发场景下建议使用Redis集群

About

高并发场景下的点赞系统,自制demo

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors