开门见山,首先定义一个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; }