SpringBoot通過RedisTemplate執行Lua指令碼的方法步驟
阿新 • • 發佈:2020-02-11
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指令碼的方法步驟,希望對大家有所幫助!