serviceImpl
public class SimpleRedisLock implements ILock {
//RedisScript:redis提供的lua脚本接口
private static final DefaultRedisScript UNLOCK_SCRIPT;
static {
UNLOCK_SCRIPT=new DefaultRedisScript();
//加载Resource下的 unlock.lua文件
UNLOCK_SCRIPT.setLocation(new ClassPathResource("unlock.lua"));
//返回值类型
UNLOCK_SCRIPT.setResultType(Long.class);
}
@Override
public void unLock() {
//调用lua脚本
stringRedisTemplate.execute(UNLOCK_SCRIPT,
Collections.singletonList(KEY_PREFIX + name),
ID_PREFIX+Thread.currentThread().getId());
}
}
unlock.lua
if (redis.call('get', KEYS[1]) == ARGV[1]) then
return redis.call('del', KEYS[1])
end
return 0
使用lua脚本,是为了保证redis操作的原子性
redis客户端执行lua脚本
redisTemplate执行lua脚本