redis执行Lua脚本

Lua 是一个小巧的脚本语言。该语言的设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。

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);
    	}
    }
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值