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

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


加锁

java调用方式

    public void lock() {
        List 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 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])

参考文章

  • eval - redis命令参考
  • Redis和Lua初步整合使用

你可能感兴趣的:(redis分布式锁(幂等性处理),lua脚本实现,java调用(RedisTemplate))