开门见山,首先定义一个lua脚本文件

redis cluster 脚本 redistemplate lua脚本_redis cluster 脚本

 脚本文件内容:

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;
}

 

知止而后有定;定而后能静;静而后能安;安而后能虑;虑而后能得。