Jedis Lua 脚本

Redis 脚本使用 Lua 解释器来执行脚本。 Redis 2.6 版本通过内嵌支持 Lua 环境。执行脚本的常用命令为 EVAL。本文将介绍怎样使用 jedis 去执行我们提供的 Lua 脚本片段或者 Lua 脚本文件。

Lua脚本片段

脚本片段值将脚本直接写入到 Java 代码中,这种模式适合脚本不多的情况。如果 Lua 脚本较大,则不建议使用这种方式,因为 Lua 脚本较大不便进行维护。

示例1:直接返回传递给 eval() 方法的参数

Object result = jedis.eval("return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}",
       2, "key1", "key2", "first", "second");
System.out.println(result); // [key1, key2, first, second]

示例2:使用 lua 脚本返回 Redis 中指定键的值

// 准备数据
jedis.set("title", "hello! jedis");
// 使用 lua 脚本返回指定键的值
Object result = jedis.eval("return redis.call('get',KEYS[1])", 1, "title");
System.out.println(result); // hello! jedis

示例3:使用 eval 执行一个 Lua 脚本,用来比较给定的键的值是否为给定的值

// 准备数据
jedis.set("count", "100");

// 使用 lua 脚本,比较 count 是否等于 100
Object result = jedis.eval("return redis.call('get', KEYS[1]) == ARGV[1]", 1, "count", "100");
System.out.println(result); // 1  等于

// 使用 lua 脚本,比较 count 是否等于 200
result = jedis.eval("return redis.call('get', KEYS[1]) == ARGV[1]", 1, "count", "200");
System.out.println(result); // null  不等于

Lua脚本文件

当我们编写的 Lua 脚本非常大时,此时使用脚本片段方式去执行 Lua 脚本就不再合适,我们通常需要将 Lua 脚本保存到 *.lua 脚本中,程序运行时去加载脚本即可。

示例:将 Lua 脚本保存到 resources/demo.lua 脚本文件,使用 IO 读取脚本内容,然后通过 eval() 方法执行脚本。代码如下:

BufferedInputStream inputStream = null;
try {
   // 获取脚本内容
   inputStream = new BufferedInputStream(this.getClass().getResourceAsStream("/demo.lua"));
   byte[] bytes = new byte[inputStream.available()];
   int len = inputStream.read(bytes);
   String luaScript = new String(bytes, 0, len);
   System.out.println(luaScript); // return redis.call('get', KEYS[1]) == ARGV[1]

   // 准备数据
   jedis.set("count", "100");

   // 使用 EVAL 执行一个 Lua 脚本,用来比较给定的键的值是否为给定的值
   Object result = jedis.eval(luaScript, 1, "count", "100");
   System.out.println(result); // 1

   result = jedis.eval(luaScript, 1, "count", "200");
   System.out.println(result); // null
} catch (Exception e) {
   e.printStackTrace();
} finally {
   if(null != inputStream) {
       try {
           // 释放资源
           inputStream.close();
       } catch (Exception e) {}
   }
}

运行程序,输出如下:

return redis.call('get', KEYS[1]) == ARGV[1]
1
null
说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号