关于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])