1. 程式人生 > 程式設計 >SpringBoot通過RedisTemplate執行Lua指令碼的方法步驟

SpringBoot通過RedisTemplate執行Lua指令碼的方法步驟

lua 指令碼

Redis 中使用 lua 指令碼,我們需要注意的是,從 Redis 2.6.0後才支援 lua 指令碼的執行。

使用 lua 指令碼的好處:

原子操作:lua指令碼是作為一個整體執行的,所以中間不會被其他命令插入。
減少網路開銷:可以將多個請求通過指令碼的形式一次傳送,減少網路時延。
複用性:lua指令碼可以常駐在redis記憶體中,所以在使用的時候,可以直接拿來複用,也減少了程式碼量。

1.RedisScript

首先你得引入spring-boot-starter-data-redis依賴,其次把lua指令碼放在resources目錄下。

@Bean public DefaultRedisScript<List> defaultRedisScript() { 
DefaultRedisScript<List> defaultRedisScript = new DefaultRedisScript<>(); 
defaultRedisScript.setResultType(List.class); 
defaultRedisScript.setScriptSource(new ResourceScriptSource(new 
ClassPathResource("redis/demo.lua"))); return defaultRedisScript; } 

在Spring Boot2.0的時候,上述配置沒有問題,但在Spring

Boot1.5測試會出錯,需要將List.class改為具體的返回型別(如Long.class)。

RedisScript的getSha1()方法可以獲取指令碼摘要。

2.呼叫指令碼

/** * List設定lua的KEYS */ List<String> keyList = new ArrayList(); 
keyList.add("count"); keyList.add("rate.limiting:127.0.0.1"); /** * 

用Mpa設定Lua的ARGV[1]

*/ Map<String,Object> argvMap = new HashMap<String,Object>(); argvMap.put("expire",10000); argvMap.put("times",10); /** * 

呼叫指令碼並執行

 */ List result = redisTemplate1.execute(redisScript,keyList,argvMap); 

System.out.println(result); 

若是出現序列化問題,可以指定序列化方式。

public <T> T execute(RedisScript<T> script,RedisSerializer<?> argsSerializer,RedisSerializer<T> resultSerializer,List<K> keys,Object... args) { return 
scriptExecutor.execute(script,argsSerializer,resultSerializer,keys,args); } 

3.Lua指令碼

--獲取KEY local key1 = KEYS[1] local key2 = KEYS[2] --

獲取ARGV[1],這裡對應到應用端是一個List<Map>. -- 注意,這裡接收到是的字串,所以需要用csjon庫解碼成table型別 local

receive_arg_json = cjson.decode(ARGV[1]) --獲取ARGV內的引數並列印 local expire = 
receive_arg_json.expire local times = receive_arg_json.times 

總結

以上所述是小編給大家介紹的SpringBoot通過RedisTemplate執行Lua指令碼的方法步驟,希望對大家有所幫助!