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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章