Redis使用lua脚本

1. maven依赖


    org.springframework.boot
    spring-boot-starter-data-redis

2. 字符串形式使用lua脚本

定义字符串形式的lua脚本

// - 字符串形式的lua脚本
public static String LUR_SCRIPT_TEST = "local k = KEYS[1]\n"
            + "local n = ARGV[1] \n"
            + "local num = redis.call(\"DECRBY\", k, n)\n"
            + "local res = {}\n"
            + "res[\"code\"] = 0\n"
            + "res[\"num\"] = num\n"
            + "\n"
            + "if num < 0 then\n"
            + "  num = redis.call(\"INCRBY\", k, n)\n"
            + "  res[\"code\"] = -1 \n"
            + "  res[\"num\"] = num\n"
            + "end\n"
            + "\n"
            + "return cjson.encode(res)";

测试脚本执行,需要注意返回类型如果是String类型那么传入的参数也需要是String类型,否则会报类型转换错误的异常,另外就是需要使用stringRedisTemplate,如果使用RedisTemplate会出现异常。

@Test
public void testLuaString() {
    // 注意:返回String类型需要使用stringRedisTemplate,以及Object values参数需要是String类型
    // 1.构建默认的Redis脚本对象
    DefaultRedisScript redisScript = new DefaultRedisScript<>(LUR_SCRIPT_TEST);
    // 2.设置返回类型
    redisScript.setResultType(String.class);
    // 3.定义key集合
    List keys = Arrays.asList("GOODS:A1005");
    // 4.定义参数集合
    Object values[] = new Object[] { "2" };
    // 5.执行脚本
    String res = stringRedisTemplate.execute(redisScript, keys, values);
    log.info("测试testLuaString:{}", res);
}

3. 使用文件形式的lua脚本

在项目resources/lua目录下创建脚本文件decrbyJson.lua,文件如下:

-- 自减脚本,小于0返回[-1, 当前库存], key不存在会初始化为0.
local k = KEYS[1]
local n = ARGV[1] 
local num = redis.call("DECRBY", k, n)
local res = {}
res["code"] = 0
res["num"] = num

if num < 0 then
  num = redis.call("INCRBY", k, n)
  res["code"] = -1 
  res["num"] = num
end

return cjson.encode(res)

测试代码

@Test
public void testLua() {
    // 注意 返回String类型需要使用stringRedisTemplate,以及Object values参数需要是String类型
    // 1. 构建默认脚本对象
    DefaultRedisScript redisScript = new DefaultRedisScript<>();
    // 2. 加载脚本文件
    redisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("lua/decrbyJson.lua")));
    // 3. 设置返回类型
    redisScript.setResultType(String.class);
    // 4. 定义key集合
    List keys = Arrays.asList("GOODS:A1005");
    // 5. 定义参数集合
    Object values[] = new Object[] { "2" };
    String res = stringRedisTemplate.execute(redisScript, keys, values);
    log.info("测试testLua:{}", res);
}

代码仓库地址:https://gitee.com/zhouJ/zjun-demo

你可能感兴趣的:(Redis使用lua脚本)