Redis 脚本使用 Lua 解释器来执行脚本。 Redis 2.6 版本通过内嵌支持 Lua 环境。执行脚本的常用命令为 EVAL。本文将介绍怎样使用 jedis 去执行我们提供的 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 脚本保存到 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