使用脚本的好处:
1. 减少网络开销,在Lua脚本中可以把多个命令放在同一个脚本中运行
2. 原子操作,redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。换句话说,编写脚本的过程中无需担心会出现竞态条件
3. 复用性,客户端发送的脚本会永远存储在redis中,这意味着其他客户端可以复用这一脚本来完成同样的逻辑
使用:
1. 根据业务编写lua脚本 XX.lua,语法请自行百度 (idea可以安装lua plugin)
local current = redis.call('GET', KEYS[1])
if (current == ARGV[1]) then
redis.call('SET', KEYS[1], ARGV[2])
redis.call('EXPIRE', KEYS[1], ARGV[3])
return true
end
return false
2.实例化
@Configuration
public class RedisLuaScriptConfig {
/**
* 实例化lua 脚本 cas 操作
* @return
*/
@Bean
public RedisScript<Boolean> compereAndSetAndExpire() {
return RedisScript.of(new ClassPathResource("redis/compereAndSetAndExpire.lua"), Boolean.class);
}
}
3.调用
public class XX{
@Resource(name = "compereAndSetAndExpire")
RedisScript<Boolean> compereAndSetAndExpire;
@Autowired
private RedisTemplate<String, String> redisTemplate;
public void XX {
// 1脚本,2, key 3, 期望值, 4, 要设置值 5过期时长 单位秒
Boolean red = Optional.ofNullable(redisTemplate.execute(compereAndSetAndExpire, Lists.newArrayList(key), "8", "10",60000)).orElse(false);
}
}