redis 的 Lua脚本
lua脚本是干什么的呢 他是一门脚本语言;
保证多条命令的原子性 交给redis执行。把一堆命令组合成一个逻辑。
(是不是有点像数据库里面的存储过程)
redis的调用函数
redis中调用脚本:
回到我们上一篇的背景:
public void unlock() {
String threadId = ID_PREFIX+Thread.currentThread().getId();
String id = stringRedisTemplate.opsForValue().get(KEY_PREFIX+name);
if (threadId.equals(id)){
stringRedisTemplate.delete(KEY_PREFIX+name);
}
}
}
释放锁的过程中 判断和释放 要保证他们原子性
lua脚本:
if(redis.call('get',KEYS[1]) == ARGV[1]) then
return redis.call('del',KEYS[1])
end
return 0
将这个脚本 放在resource下面 用:
private static final DefaultRedisScript<Long> UNLOCK_SCRIPT;
static {
UNLOCK_SCRIPT = new DefaultRedisScript<>();
UNLOCK_SCRIPT.setLocation(new ClassPathResource("unlock.lua"));
UNLOCK_SCRIPT.setResultType(Long.class);
}
引进来
代码就变成了一行
stringRedisTemplate.execute(
UNLOCK_SCRIPT,
Collections.singletonList(KEY_PREFIX+name),
ID_PREFIX+Thread.currentThread().getId());
这样就解决了原子性问题