1. 程式人生 > >redis 系列(九)java結合redis+lua指令碼使用

redis 系列(九)java結合redis+lua指令碼使用

java 結合 redis + lua 獲取資料

單機版

package bhz.redis01;

import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisShardInfo;
import redis.clients.jedis.ShardedJedis;
import redis.clients.jedis.ShardedJedisPool;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class TestRedisAndLua {
 
    private static Jedis jedis;		//單例項[]
    private static ShardedJedis shard;		//分片[]
    private static ShardedJedisPool pool;	//池化[apache common - pool2]


    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
        //單個節點
        jedis = new Jedis("192.168.1.115", 6379);
        //分片
        List<JedisShardInfo> shards = Arrays.asList(
                new JedisShardInfo("192.168.1.115",6379));

        shard = new ShardedJedis(shards);
        //池化
        GenericObjectPoolConfig goConfig = new GenericObjectPoolConfig();
        goConfig.setMaxTotal(100);
        goConfig.setMaxIdle(20);
        goConfig.setMaxWaitMillis(-1);
        goConfig.setTestOnBorrow(true);
        pool = new ShardedJedisPool(goConfig, shards);
    }

    @AfterClass
    public static void tearDownAfterClass() throws Exception {
        jedis.disconnect();
        shard.disconnect();
        pool.destroy();
    }


    
    /**
     * <B>方法名稱:</B>Redis使用Lua執行應用程式<BR>
     * <B>概要說明:</B>
     * 我們可以使用Redis+Lua的方式,實現一個完整的事務、保證事務的原子性。
     * 如何使用Redis+Lua?
     * 我們使用scriptLoad方法,把我們寫好的lua指令碼載入到Redis的記憶體中(注意是記憶體,每次重啟則失效)。
     * scriptLoad方法會返回一個索引Key,我們只需要通過這個索引Key就可以找到我們之前放到Redis裡的指令碼。
     * 呼叫evalsha方法,傳入索引key,以及操作鍵、引數值。進行返回 <BR>
     */
    /**
     * lua script:
	 *		local t1 = redis.call('hgetall',KEYS[1]);
	 *		if type(t1) == 'table' then 
	 *			return t1;
	 *		end;
     */
    public static final String SCRIPT = 
    		"local t1 = redis.call('hgetall',KEYS[1]);" + "\n" +
    		"if type(t1) == 'table' then" + "\n" +
    		"return t1;" + "\n" +
    		"end;" + "\n" ;
    @Test
    public void  testLua(){
    	String shakey = jedis.scriptLoad(SCRIPT);//載入指令碼,獲取sha索引 
    	System.out.println("shakey: " + shakey);
    	//要獲取的key值
    	List<String> keys = new ArrayList<>();
    	keys.add("myhash");
    	//傳入的引數
    	List<String> args = new ArrayList<>();
    	// /usr/local/bin/redis-cli -h 192.168.1.115 -p 6379 --eval /usr/local/luadir/03.lua name age , baihezhuo
    	List<String> ret = (List<String>)jedis.evalsha(shakey, keys, args);
    	
    	System.out.println(ret);
    	jedis.close();
    }
   
    
    
    
    
    
 
}