介绍
通过 Redis 执行 Lua 脚本时,所有的操作都在服务器端完成,而不是多次通过网络进行请求。这可以显著减少网络延迟,尤其是在需要多次与 Redis 交互的场景中。多个操作可以在 Lua 脚本中组合成一个操作,而不是分多次请求,这减少了客户端与 Redis 之间的往返次数,从而提升了性能。脚本的执行是原子的。意味着整个 Lua 脚本会在 Redis 服务器中一次性执行,不会被中断,确保了操作的原子性。
创建Lua脚本
redis 脚本 键不存在就添加 不存在 就删除例子,
在资源文件中创建
resources/redis.lua
if redis.call('EXISTS', KEYS[1]) == 1 then -- 检查传入的键 (KEYS[1]) 是否存在
redis.call('DEL', KEYS[1]) -- 删除键 (KEYS[1])
else
redis.call('SET', KEYS[1], ARGV[1]) -- 如果键不存在,设置键 (KEYS[1]) 的值为 (ARGV[1])
end
return 1 -- 返回1,表示脚本成功执行
- KEYS[1] 是传入脚本的第一个键
- ARGV[1] 是传入脚本的第一个值
执行脚本
@RequiredArgsConstructor
public class RedisScript {
private static final DefaultRedisScript<Long> script ;
//Long为返回值类型
static {
script=new DefaultRedisScript<>();
//初始化脚本 resources\redis.lua
script.setLocation(new ClassPathResource("redis.lua"));
//设置返回值类型
script.setResultType(Long.class);
}
public static Long runScript(StringRedisTemplate redisTemplate){
// 传递多个参数
//List<String> keys = Arrays.asList("key1", "key2"); // 两个键
//List<String> args = Arrays.asList("value1", "value2"); // 两个值
return redisTemplate.execute(script,
Collections.singletonList("dpc"), //Key
UUID.randomUUID().toString() ); //Value
}
}
static 代码块是静态初始化块,它会在类加载时被执行一次。这里的 static 代码块用于初始化静态变量 script。
接口调用
private final StringRedisTemplate redisTemplate;
@GetMapping("/redis")
public Long redis(){
return RedisScript.runScript(redisTemplate);
}