开门见山,首先定义一个lua脚本文件
脚本文件内容:
local key = KEYS[1]
local val = redis.call("get", key)
if val == false or tonumber(val) < 1 then
return false
else
redis.call("decr", key)
return true
end
脚本只是做了一个查询和递减的操作,在项目中用于防止查询和递减操作之间发生并发。
再定义一个Redis配置文件:
@Configuration
public class RedisLuaConfig {
@Bean
public DefaultRedisScript<Boolean> getAndDecr() {
DefaultRedisScript<Boolean> redisScript = new DefaultRedisScript<>();
redisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("lua/getAndDecr.lua")));
redisScript.setResultType(Boolean.class);
return redisScript;
}
}
在项目中使用:
@Autowired
private DefaultRedisScript<Boolean> getAndDecr;
private boolean getAndDecr(String key) {
List<String> key = Collections.singletonList(key);
Boolean execute = redisTemplate.execute(getAndDecr, key);
if (null == execute) {
return false;
}
return execute;
}
知止而后有定;定而后能静;静而后能安;安而后能虑;虑而后能得。