Lua脚本可以很容易的被C/C++代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用。不仅仅作为扩展脚本,也可以作为普通的配置文件,代替XML,Ini等文件格式,并且更容易理解和维护。
redis在2.6推出了脚本功能,允许开发者使用Lua语言编写脚本传到redis中执行。
使用脚本的好处如下:
1:减少网络开销:本来多次网络请求的操作,可以用一个请求完成,原先多次请求的逻辑放在redis服务器上完成。使用脚本,减少了网络往返时延。
2:原子操作:redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。
3:复用:客户端发送的脚本会永久存储在redis中,意味着其他客户端可以复用这一脚本而不需要使用代码完成同样的逻辑。
首先安装redis,我这里安装的是redis-3.0.7
编写如下lua脚本
/tmp/test.lua
local count = redis.call('get', 'product_count')
local a = tonumber(count)
local b = tonumber(ARGV[1])
if a >= b then
redis.call('set', 'product_count', count-b)
return 1
end
return 0
脚本的意思是,用数据库里面的product_count对应的值减去传入的参数值,当够减的时候,就执行减的操作,并返回1,否则返回0
redis-cli --eval /tmp/test.lua , 10
--eval参数是告诉redis-cli读取并运行后面的Lua脚本,/tmp/test.lua是脚本的位置,后面跟着是传给Lua脚本的参数。
其中","前的是要操作的键,可以再脚本中用KEYS[index]获取,","后面的10是参数,在脚本中能够使用ARGV[index]获得。注:","两边的空格不能省略,否则会出错
注意:index是从1开始。多个key或者参数,用空格隔开
二:使用redis的java客户端执行lua脚本
首先新建maven项目,添加redis的java客户端依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.8.1</version>
</dependency>
java代码如下:
package com.redis.lua;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Arrays;
import java.util.Collections;
import redis.clients.jedis.Jedis;
public class App {
public static void main( String[] args ) throws Exception {
try(Jedis jedis = new Jedis("127.0.0.1",6379) ;
InputStream input = new FileInputStream("/tmp/test.lua")) {
byte[] by = new byte[input.available()];
input.read(by);
String script = new String(by);
Object obj = jedis.eval(script, Collections.emptyList(), Arrays.asList("10"));
System.out.println(obj);
}
}
}