redis使用lua脚本实现锁,jmeter测试,值总比预想的值少,请求丢失还是别的什么问题???

 通过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得到的值:

直接手动释放锁都不会出问题,而且请求次数也多了很多,但是使用lua脚本就出问题了。。。。。。

// 释放锁,只能释放自己的锁
String lockUUID = (String) redisTemplate.opsForValue().get(lockKey);
if (uuid.equals(lockUUID)) {
    redisTemplate.delete(lockKey);
}

 

你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答

本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。

​​​​因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。