我正在使用spring-boot-starter-data-redis 2.0.5.RELEASE。我用RestTemplate执行一个lua脚本。 脚本:
-- hold.lua
if redis.call('get', KEYS[1]) == ARGV[1] then
redis.call('pexpire', KEYS[1], ARGV[2])
return 1
end
return 0
Java代码:
@Override
public void executeHold(String lockKey, String lockValue, long expireInMillis) {
DefaultRedisScript<Boolean> holdScript = new DefaultRedisScript<>();
holdScript.setLocation(new ClassPathResource("lua/hold.lua"));
holdScript.setResultType(Boolean.class);
// CODE 1
Boolean result = redisTemplate.execute(holdScript, Collections.singletonList(lockKey), lockValue, expireInMillis);
// END of CODE 1
// // CODE 2
// String script = holdScript.getScriptAsString();
// Boolean result = redisTemplate.execute(new RedisCallback<Boolean>() {
// @Override
// public Boolean doInRedis(RedisConnection connection) throws DataAccessException {
// return connection.scriptingCommands()
// .eval(
// script.getBytes(),
// ReturnType.fromJavaType(Boolean.class),
// 1,
// lockKey.getBytes(),
// lockValue.getBytes(),
// String.valueOf(expireInMillis).getBytes()
// );
// }
// });
// // END of CODE 2
System.out.println(holdScript.getSha1());
LOGGER.debug("Execute holdScript, result={}, content=\n{}", result, holdScript.getScriptAsString());
}
我已将lockKey
设置为redis:
127.0.0.1:6379> set lockKey lockValue PX 600000 NX
运行上面的代码并使用CODE 1
时,我总是得到result = false
。
但是当我更改上面的代码并使用CODE 2
时,我可以预期得到正确的结果。
这真的让我感到困惑,有人可以帮助我找出问题所在吗?谢谢。
我想做的是Here。
答案 0 :(得分:0)
我正面临类似的问题。问题的根本原因是我在Redis模板中使用json序列化程序,并且在传递给脚本的字符串值中添加了额外的引号。将序列化程序更改为字符串序列化程序解决了我的问题。