6-Ai辅助开发点赞系统笔记-TIDB&压力测试
代码地址
Github地址:https://github.com/bbhhe/thumbs-backend.git
章节内容
- 引入分布式数据库
- 使用Jmeter进行压力测试
开发内容
引入分布式数据库
1. 部署TiDB集群
1.1 我使用本地安装一个vmware虚拟机,然后启动一个ubuntu系统,然后安装TiDB集群。

1.2 系统启动好了,下载安装脚本
▼bash复制代码curl --proto '=https' --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh
1.3 下载完之后启动
▼bash复制代码tiup playground --tag thumb --host 0.0.0.0
默认账户:root 无密码

2. 修改appliaction-dev.yml配置文件
改成TIDB数据库
▼yaml复制代码# 数据库配置 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:4000/thumbsdb username: root password: data: # Redis 配置 redis: database: 0 host: 127.0.0.1 port: 6379 timeout: 5000 password: bbhhe1 pulsar: client: service-url: pulsar://localhost:8089
启动测试
同步数据库,我重新执行创建脚本造的数据
启动项目,然后访问接口,测试点赞:

使用Jmeter进行压力测试
1. 安装Jmeter
直接在官网下载 Apache JMeter,地址:https://jmeter.apache.org/download_jmeter.cgi
启动完配置个点赞http请求

请求成功,安装成功
2. 开始测试1 - 基础实现
2.1 切换基础实现版本

2.2 开始测试
经过测试,我得电脑配置设置下面的参数:
线程数: 505个/组 启动时长:5s 循环次数: 10组
测试几次后,发现thumb表的数据不对,5000个用点赞应该有5000个,实际上只有1千多。 增加响应断言:

再次请求后发现点赞接口大部分返回的都是false

排查之后发现是代码问题:
▼java复制代码private final ReentrantLock lock = new ReentrantLock(); @Override public boolean doThumb(Long blogId, Long userId) { if (!lock.tryLock()) { log.info("尝试获取锁失败"); return false; } try { return transactionTemplate.execute(status -> { // 1. 判断是否已点赞 LambdaQueryWrapper<Thumb> queryWrapper = new LambdaQueryWrapper<Thumb>() .eq(Thumb::getBlogId, blogId) .eq(Thumb::getUserId, userId); long count = this.count(queryWrapper); if (count > 0) { return false; } // 2. 更新博客点赞数 Blog blog = blogMapper.selectById(blogId); if (blog == null) { log.info("博客ID不存在"); return false; } blog.setThumbCount(blog.getThumbCount() + 1); blogMapper.updateById(blog); // 3. 保存点赞记录 Thumb thumb = new Thumb(); thumb.setBlogId(blogId); thumb.setUserId(userId); return this.save(thumb); }); } finally { lock.unlock(); } }
代码中使用了ReentrantLock锁,导致每次只有一个线程可以获取锁,其他线程都会返回false。
在 ReentrantLock 中,tryLock() 方法默认是非阻塞的,即它会立即尝试获取锁,如果锁不可用,则立即返回 false,而不会等待。因此,默认情况下,tryLock() 的等待时间是 0。
▼java复制代码if (!lock.tryLock(5, TimeUnit.SECONDS)) { log.info("尝试获取锁失败"); return false; }
修改等待时间设置后,这次正常了

三次测试,接口响应平均9.1s,吞吐量平均为50个/s
3. 开始测试2 - Redis替换数据库
切换成Redis实现

内存速度果实快很多,接口平均响应0.1s,吞吐量平均为800个/s
验证数据的一致性,也没问题

4. 开始测试3 - Pular消息队列
切换成Pular消息队列实现

接口平均响应0.2s,吞吐量平均为600个/s
性能有所下降,但是消息队列的作用之一就是削峰填谷,保证系统的稳定性。
最后 祝大家五一快乐!
笔记本性能有限,只能测试到这么多了,后续有时间会继续通过调整 Tomcat 最大连接数、Redis 、MySQL 连接池、Pulsar 批量处理数等参数,测试点赞接口的最高 TPS。
