redis 系列(九)java結合redis+lua指令碼使用
阿新 • • 發佈:2018-12-30
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(); } }