通过jmeter测试线程为50,循环2次,总共100请求,预计结果为100,但是得到的是98...,有没有大佬帮我看看问题在哪.
监控表格得到的请求都是成功的
接口的代码:
/**
* 使用lua脚本,防止误删,不能解决业务未执行完成的锁过期问题.
* @return
*/
@ApiOperation(value = "redis-使用lua脚本防止误删-set")
@GetMapping("/noErrorDelLock")
public Result testNoErrorDelLock() {
// 上锁,set,设置唯一值
String uuid = UUID.randomUUID().toString();
// 访问的数据,预先在redis设置num的值,num必定存在
// num的初始在redis设置为0。
String str = "num";
String lockKey = "lock:" + str; // 锁住的是访问的数据。
// 获取锁
Boolean lock = redisTemplate.opsForValue().setIfAbsent(lockKey, uuid,10, TimeUnit.SECONDS);
// 获取锁成功、查询num的值
if (lock) {
// 获取数据
redisTemplate.opsForValue().increment(str);
// 释放锁,只能释放自己的锁
// lua脚本
String script = "if redis.call('get',KEYS[1]) == ARGV[1] then return redis.call('del',KEYS[1]) else return 0 end";
// 使用redis执行lua脚本
DefaultRedisScript<Long> redisScript = new DefaultRedisScript<>();
redisScript.setScriptText(script);
// 设置一下返回值类型 为long
// 因为删除判断的时候返回的0,给其封装为数据类型,如果不封装那么默认返回String类型。
// 那么返回字符串与0会有发生错误。
redisScript.setResultType(Long.class);
// 第一个要是script,第二个需要判断的key,第三个就是key所对应的值
redisTemplate.execute(redisScript, Arrays.asList(lockKey), uuid);
}else{
// 获取锁失败、每隔0.1s再获取
try{
Thread.sleep(100);
testLock();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return RestResult.success(ResultCodeEnum.SUCCESS, redisTemplate.opsForValue().get(str));
}
最后redis得到的值: