SpringBoot 执行Lua脚本 服务端执行 减少性能损耗 优化性能 优化连接性能

介绍

通过 Redis 执行 Lua 脚本时,所有的操作都在服务器端完成,而不是多次通过网络进行请求。这可以显著减少网络延迟,尤其是在需要多次与 Redis 交互的场景中。多个操作可以在 Lua 脚本中组合成一个操作,而不是分多次请求,这减少了客户端与 Redis 之间的往返次数,从而提升了性能。脚本的执行是原子的。意味着整个 Lua 脚本会在 Redis 服务器中一次性执行,不会被中断,确保了操作的原子性。

创建Lua脚本

redis 脚本 键不存在就添加 不存在 就删除例子,

在资源文件中创建

resources/redis.lua

java 复制代码
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] 是传入脚本的第一个值

执行脚本

java 复制代码
@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。

接口调用

java 复制代码
 private final StringRedisTemplate redisTemplate;

@GetMapping("/redis")
public Long redis(){
    return  RedisScript.runScript(redisTemplate);
}
相关推荐
东阳马生架构6 分钟前
订单初版—5.售后退货链路中的技术问题说明文档
java
小小寂寞的城11 分钟前
JAVA策略模式demo【设计模式系列】
java·设计模式·策略模式
志辉AI编程26 分钟前
别人还在入门,你已经精通!Claude Code进阶必备14招
后端·ai编程
JAVA学习通29 分钟前
图书管理系统(完结版)
java·开发语言
代码老y33 分钟前
Spring Boot项目中大文件上传的高级实践与性能优化
spring boot·后端·性能优化
abigalexy36 分钟前
深入Java锁机制
java
paishishaba36 分钟前
处理Web请求路径参数
java·开发语言·后端
神仙别闹38 分钟前
基于Java+MySQL实现(Web)可扩展的程序在线评测系统
java·前端·mysql
程序无bug40 分钟前
Java中的8中基本数据类型转换
java·后端
雨落倾城夏未凉44 分钟前
8.Qt文件操作
c++·后端·qt