通常java运行lua脚本,采用的也是相似上述表达式,后面描述java
(2)对于一段长的lua脚本,能够将脚本放在一个文件中,经过以下命令执行lua脚本redis
$ redis-cli --eval path/to/redis.lua KEYS[1] KEYS[2] , ARGV[1] ARGV[2] ...apache
--eval,告诉redis-cli读取并运行后面的lua脚本
path/to/redis.lua,是lua脚本的位置
KEYS[1] KEYS[2],是要操做的键,能够指定多个,在lua脚本中经过KEYS[1], KEYS[2]获取
ARGV[1] ARGV[2],参数,在lua脚本中经过ARGV[1], ARGV[2]获取。数组
注意: KEYS和ARGV中间的 ',' 两边的空格,不能省略。浏览器
看下面例子:缓存
在以下文件夹中以一个lua脚本 jedisCallLuaTest.lua服务器
local key=KEYS[1] local args=ARGV
//说明:设置一个key = userName,value=Jack,20s过时时间 return redis.call("setex",key,unpack(args))
去客户端获取:网络
过时了。。。。ide
EVALSHA命令
将脚本 script 添加到脚本缓存中,但并不当即执行这个脚本。
语法以下:
redis 127.0.0.1:6379> EVALSHA sha1 numkeys key [key ...] arg [arg ...]
参数说明:函数
eg:
整合Jedis + lua
public class RedisClient { private static JedisPool jedisPool = null; private static String addr = "127.0.0.1"; private static int port = 6379; static { try { JedisPoolConfig config = new JedisPoolConfig(); // 链接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true config.setBlockWhenExhausted(true); // 设置的逐出策略类名, 默认DefaultEvictionPolicy(当链接超过最大空闲时间,或链接数超过最 大空闲链接数) config.setEvictionPolicyClassName("org.apache.commons.pool2.impl.DefaultEvictionPolicy"); // 是否启用pool的jmx管理功能, 默认true config.setJmxEnabled(true); // MBean ObjectName = new // ObjectName("org.apache.commons.pool2:type=GenericObjectPool,name=" // + "pool" + i); 默认为"pool", JMX不熟,具体不知道是干啥的...默认就好. config.setJmxNamePrefix("pool"); // 是否启用后进先出, 默认true config.setLifo(true); // 最大空闲链接数, 默认8个 config.setMaxIdle(8); // 最大链接数, 默认8个 config.setMaxTotal(8); // 获取链接时的最大等待毫秒数(若是设置为阻塞时BlockWhenExhausted),若是超时就抛异常, 小于零:阻塞不肯定的时间, // 默认-1 config.setMaxWaitMillis(-1); // 逐出链接的最小空闲时间 默认1800000毫秒(30分钟) config.setMinEvictableIdleTimeMillis(1800000); // 最小空闲链接数, 默认0 config.setMinIdle(0); // 每次逐出检查时 逐出的最大数目 若是为负数就是 : 1/abs(n), 默认3 config.setNumTestsPerEvictionRun(3); // 对象空闲多久后逐出, 当空闲时间>该值 且 空闲链接>最大空闲数 // 时直接逐出,再也不根据MinEvictableIdleTimeMillis判断 (默认逐出策略) config.setSoftMinEvictableIdleTimeMillis(1800000); // 在获取链接的时候检查有效性, 默认false config.setTestOnBorrow(false); // 在空闲时检查有效性, 默认false config.setTestWhileIdle(false); // 逐出扫描的时间间隔(毫秒) 若是为负数,则不运行逐出线程, 默认-1 config.setTimeBetweenEvictionRunsMillis(-1); jedisPool = new JedisPool(config, addr, port, 3000); } catch (Exception e) { e.printStackTrace(); } } public synchronized static Jedis getJedis() { try { if (jedisPool != null) { Jedis resource = jedisPool.getResource(); return resource; } else { return null; } } catch (Exception e) { e.printStackTrace(); return null; } } public static void close(final Jedis jedis) { if (jedis != null) { jedis.close(); } } /*---------------------测试---------------------------*/ public static void main(java.lang.String[] args) { Jedis jedis = RedisClient.getJedis(); // do something RedisClient.testCallLua(jedis); RedisClient.close(jedis); } public static void testCallLua(Jedis jedis){ String luaStr = "return {KEYS[1],KEYS[1],ARGV[1],ARGV[2]}"; Object result = jedis.eval(luaStr, Lists.newArrayList("userName","age"), Lists.newArrayList("Jack","20")); System.out.println(result); } }
运行结果:
[userName, userName, Jack, 20]
java: 该段代码图个方便,引用了guava.jar包
/** * 调用lua脚本 * @param jedis */ public static void testCallLuaFile(Jedis jedis){ String luaStr = null; //带反斜杠,路径为classPath,不带反斜杠,路径为类的同一目录 Reader r = new InputStreamReader(RedisClient.class.getResourceAsStream("/jedisCallLuaTest.lua")); try { luaStr = CharStreams.toString(r); Object result = jedis.eval(luaStr, Lists.newArrayList("userName"), Lists.newArrayList("20","Tom")); System.out.println(result); } catch (IOException e) { e.printStackTrace(); } }
注意:getResourceAsStream()这但是好帮手,用到将文件内容加载成String,必定要想到他。CharStreams是guava.jar中的对象。
Reader转String还有以下两种伎俩:(发散。。。。)
@Test public void apcheIo() throws IOException{ String luaStr=null; //带反斜杠,路径为classPath,不带反斜杠,路径为类的同一目录 Reader r= new InputStreamReader(Reader2StrDemo.class.getResourceAsStream("/jedisCallLuaTest.lua")); luaStr = org.apache.commons.io.IOUtils.toString(r); System.out.println(luaStr); } @Test public void java8() throws IOException{ String luaStr=null; String path = "F:\\xxxx\\ideaProjects\\java8-pro\\resource\\jedisCallLuaTest.lua"; luaStr = Files.lines(Paths.get(path),Charset.defaultCharset()).collect(Collectors.joining()); System.out.println(luaStr); }
运行结果: