版权声明:如有侵权,请联系[email protected]。 https://blog.csdn.net/cs373616511/article/details/82561585
项目使用springboot,定义成员变量private int num = 20,测试对公共资源的抢占,只有20个号码,26个字母去抢,并发的去请求接口操作num,请求时,如果num大于0,给该请求分配号码,即抢占成功,否则失败。(注意:本次单机测试,有时间可以用nginx部署测试)
条件:1号码只允许被20个人得到;2多个人号码不能出现重复。
1.结果图
没有加锁的情况,号码出现重复分配的情况,显然不是想要的结果
加锁情况,结果正确
2.设置jmeter参数
jmeter设置
使用CSV Data Set Config读取txt文档参数
3.springboot源码
加锁和释放锁的代码来源于
https://blog.csdn.net/u012158623/article/details/80169692
controller
num 是类的成员变量初始化是20
@RequestMapping("/jmeter")
@ResponseBody
public String jmeter(Model model, HttpServletRequest request, String test) {
String requestId = UUID.randomUUID().toString();
Jedis j = new Jedis("127.0.0.1", 6379);
//获取分布式锁
boolean lock = RedisDistributeLock.getLock(requestId, j);
String s = Thread.currentThread().getName() + "=====================" + test;
if (num > 0 && lock) {
System.out.println(s + "排号成功,号码是:" + num);
num--;
} else {
System.out.println(s + "排号失败,号码已经被抢光");
}
//释放分布式锁
RedisDistributeLock.closeLock(requestId, j);
return s;
}
getLock
public static boolean getLock(String requestId, Jedis j) {
boolean lock = false;
//此处一直等待,可以设置条件,不再等待,例如资源已经被抢光,时间超时等等..。
while (!lock) {
lock = RedisTool.tryGetDistributedLock(j, "lock", requestId, 10000);
if (!lock) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
return true;
}
public static boolean tryGetDistributedLock(Jedis jedis, String lockKey, String requestId, int expireTime) {
String result = jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);
if (LOCK_SUCCESS.equals(result)) {
return true;
}
return false;
}
closeLock
public static void closeLock(String requestId, Jedis j) {
RedisTool.releaseDistributedLock(j, "lock", requestId);
}
public static boolean releaseDistributedLock(Jedis jedis, String lockKey, String requestId) {
String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
Object result = jedis.eval(script, Collections.singletonList(lockKey), Collections.singletonList(requestId));
if (RELEASE_SUCCESS.equals(result)) {
return true;
}
return false;
}