这是一个基于 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 文档
-
点赞数 Key:
like:count:{targetType}:{targetId}- 存储类型: String
- 存储值: 点赞总数
-
用户点赞状态 Key:
like:user:{userId}:{targetType}:{targetId}- 存储类型: String
- 存储值: true/false
| 字段 | 类型 | 说明 |
|---|---|---|
| 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)
| 字段 | 类型 | 说明 |
|---|---|---|
| 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)
- Java 21+
- Maven 3.6+
- MySQL 8.0+
- Redis 6.x+
- Nginx(可选,用于反向代理)
执行数据库脚本:
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='点赞统计表';编辑 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: 0mvn clean packagemvn spring-boot:run或者运行打包后的jar文件:
java -jar target/like-system-1.0.0.jar使用提供的 nginx.conf 配置文件启动Nginx:
nginx -c /path/to/nginx.conf查看 API文档.md 获取详细的接口说明和测试示例。
Client → Nginx → Spring Boot → Redis + MySQL
- Controller: 接口层,处理HTTP请求和响应
- Service: 业务逻辑层,处理业务逻辑
- Manager: 缓存与数据库协调层,统一管理Redis和MySQL操作
- Mapper: 数据访问层,直接操作数据库
- 幂等性: 点赞和取消点赞操作都支持幂等
- 缓存优先: 查询优先从Redis获取数据
- 双写: 写操作同时更新Redis和MySQL,保证数据一致性
- 异步处理: Redis操作快速响应,MySQL操作作为最终存储
- QPS: 1000+
- 查询响应时间: < 20ms
- 写操作响应时间: < 50ms
详细接口文档请查看 API文档.md
- POST /api/like/like - 点赞
- POST /api/like/cancel - 取消点赞
- GET /api/like/status - 查询点赞状态
- GET /api/like/count - 查询点赞总数
- 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格式响应。
- 确保MySQL和Redis服务正常运行
- 修改配置文件中的连接信息
- 执行数据库脚本创建表结构
- 建议在生产环境中使用连接池和缓存配置
- 高并发场景下建议使用Redis集群