环境准备:
windows:jdk8+nginx+ab压测
centos7: redis+zookeeper3.3.6
ab下载链接:https://www.apachelounge.com/download/
测试思路:
windows下使用springboot编写秒杀接口,商品数据存在redis,运行三个服务,利用nginx做代理,使用ab分别测试单机锁,自实现zookeeper分布式锁和Curator框架提供的分布式锁区别。
代码如下:
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.17.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.yc</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>testSecKill</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.4.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.yml
server:
port: 8081
spring:
redis:
host: node1 #centos在windows中的hosts配置映射
port: 6379
jedis:
pool:
max-active: -1
logging:
level:
org.apache.zookeeper: off #关闭日志,可以更好观察控制台打印信息
controller
/**
* @author wong
* @date 2021/7/4 9:15
*/
@RestController
public class Controller {
@Autowired
private StringRedisTemplate redisTemplate;
// private ReentrantLock lock=new ReentrantLock();//单机锁
InterProcessMutex lock = new InterProcessMutex(getZkClient(), "/locks");//框架锁
@RequestMapping(value = "/secKill",method = RequestMethod.GET)
public String secKill() throws Exception {
//因为自实现的锁是不可重入锁,所以每个请求到来时都需要单独创建对象建立连接,性能低
// DistributedLock lock=new DistributedLock("node1:2181");//自实现锁
try{
//lock.lock();
lock.acquire();
int num=Integer.parseInt(redisTemplate.opsForValue().get("goods"));
if(num>0){
int realNum=num-1;
redisTemplate.opsForValue().set("goods",realNum+"");
System.out.println("抢购第"+num+"张票");
return "抢购成功";
}else{
System.out.println("库存不足");
return "库存不足";
}
} catch (Exception e) {
e.printStackTrace();
return "系统异常";
} finally {
lock.release();
//lock.unlock();
}
}
private static CuratorFramework getZkClient(){
//重试策略
ExponentialBackoffRetry policy = new ExponentialBackoffRetry(3000, 3);
CuratorFramework client = CuratorFrameworkFactory.builder()
.connectString("node1:2181")
.connectionTimeoutMs(2000)
.sessionTimeoutMs(2000)
.retryPolicy(policy)
.build();
client.start();
return client;
}
}
自实现锁在前面的文章中有,此处不贴代码
启动类没有其他配置
运行配置请勾选并行
nginx
ab测试时的接口
ab -n 100 -c 10 http://localhost:9090/secKill
-n代表总请求数
-c代表请求的并发数
然后分别对三个锁进行测试,可以发现单机锁存在超卖问题,自实现分布式锁存在严重的性能问题(建议这里测试时并发度调小,请求数也降低),而框架提供的性能高(每台主机只建立一次连接,并且可重入)。
原文地址:https://blog.csdn.net/weixin_45271492/article/details/118490722
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。