美文网首页
redis分布式锁(幂等性处理),lua脚本实现,java调用(

redis分布式锁(幂等性处理),lua脚本实现,java调用(

作者: 不敢预言的预言家 | 来源:发表于2018-11-05 15:54 被阅读0次

    关于redis分布式锁的理论不做赘述。


    加锁

    java调用方式

        public void lock() {
            List<String> keyList = new ArrayList<>();
            keyList.add("seer");
            keyList.add("yuyanjia");
            keyList.add("600");
    
            // 加载脚本文件
            ScriptSource scriptSource = new ResourceScriptSource(new ClassPathResource("redis_lock.lua"));
            DefaultRedisScript defaultRedisScript = new DefaultRedisScript();
            defaultRedisScript.setScriptSource(scriptSource);
            // 设置脚本返回类型
            defaultRedisScript.setResultType(Long.class);
    
            // 只用了KEYS[i] 传值,但是 args 不能为空,忘了哪个方法里注释的了,随便给个值,反正用不到
            Long result = (Long) redisTemplate.execute(defaultRedisScript, keyList, keyList);
    
            /*
                1   成功
                0   失败
             */
            System.out.println(result);
        }
    

    redis_lock.lua

    ---
    --- redis分布式锁加锁
    --- Created by seer.
    --- DateTime: 2018/11/5 10:45
    ---
    local result = redis.call('set', KEYS[1], KEYS[2], 'ex', KEYS[3], 'nx')
    if result == false then
        return 0
    elseif type(result) == 'table' and result['ok'] == 'OK' then
        return 1
    end
    return 0
    

    解锁

    java调用方式

        public void unlock() {
            List<String> keyList = new ArrayList<>();
            keyList.add("seer");
            keyList.add("yuyanjia");
    
            ScriptSource scriptSource = new ResourceScriptSource(new ClassPathResource("redis_unlock.lua"));
            DefaultRedisScript defaultRedisScript = new DefaultRedisScript();
            defaultRedisScript.setScriptSource(scriptSource);
            defaultRedisScript.setResultType(Long.class);
    
            Long result = (Long) redisTemplate.execute(defaultRedisScript, keyList, keyList);
            System.out.println(result);
        }
    

    redis-unlock.lua

    ---
    --- redis分布式锁解锁
    --- Created by seer.
    --- DateTime: 2018/11/5 10:45
    ---
    local getValue = redis.call('get', KEYS[1])
    if getValue == false then
        return 1
    end
    if getValue ~= KEYS[2] then
        return 0
    end
    return redis.call('del', KEYS[1])
    

    参考文章

    相关文章

      网友评论

          本文标题:redis分布式锁(幂等性处理),lua脚本实现,java调用(

          本文链接:https://www.haomeiwen.com/subject/xapsxqtx.html