SpringBoot 执行Lua脚本 服务端执行 减少性能损耗 优化性能 优化连接性能
介绍
通过 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])elseredis.call('SET', KEYS[1], ARGV[1]) -- 如果键不存在,设置键 (KEYS[1]) 的值为 (ARGV[1])endreturn 1 -- 返回1,表示脚本成功执行
- KEYS[1] 是传入脚本的第一个键
- ARGV[1] 是传入脚本的第一个值
执行脚本
@RequiredArgsConstructor
public class RedisScript {private static final DefaultRedisScript<Long> script ;//Long为返回值类型static {script=new DefaultRedisScript<>();//初始化脚本 resources\redis.luascript.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"), //KeyUUID.randomUUID().toString() ); //Value}}
static 代码块是静态初始化块,它会在类加载时被执行一次。这里的 static 代码块用于初始化静态变量 script。
接口调用
private final StringRedisTemplate redisTemplate;@GetMapping("/redis")
public Long redis(){return RedisScript.runScript(redisTemplate);
}