今天在使用LUA脚本解决Redis全局分布式锁的原子性,当调用lua脚本释放锁的时候,程序报出IllegalStateException异常。一开始以为是LUA脚本的问题,仔细检查之后并未发现问题。对此百思不得其解。
直到看到了一个博文,其中提到可能是返回值类型设定的问题。先来看一下最初的静态代码块中的初始化代码:
static {
UNLOCK_SCRIPT = new DefaultRedisScript<>();
UNLOCK_SCRIPT.setLocation(new ClassPathResource("unlock.lua"));
}
其中少了一个语句,即指定返回值类型。修正过后代码如下:
static {
UNLOCK_SCRIPT = new DefaultRedisScript<>();
UNLOCK_SCRIPT.setLocation(new ClassPathResource("unlock.lua"));
UNLOCK_SCRIPT.setResultType(Long.class);
}
在此使用setResultType方法来指定返回的类型为Long。但是有个问题,为什么教学视频之中的代码并未指定返回类型?这个还不太清楚具体的原因,待以后探究一下。