【本文版權歸微信公衆號"代碼藝術"(ID:onblog)全部,如果轉載請務必保留本段原創聲明,違者必究。】redis
若是你對Redis和Lua的關係不太清楚,請先閱讀:Redis進階之使用Lua腳本開發spring
首先你得引入spring-boot-starter-data-redis依賴,其次把lua腳本放在resources目錄下。json
@Bean public DefaultRedisScript<List> defaultRedisScript() { DefaultRedisScript<List> defaultRedisScript = new DefaultRedisScript<>(); defaultRedisScript.setResultType(List.class); // defaultRedisScript.setScriptText(""); defaultRedisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("redis/demo.lua"))); return defaultRedisScript; }
在Spring Boot2.0的時候,上述配置沒有問題,但在Spring Boot1.5測試會出錯,須要將List.class改成具體的返回類型(如Long.class)。微信
RedisScript的getSha1()方法能夠獲取腳本摘要。ide
/** * 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);
如果出現序列化問題,能夠指定序列化方式。spring-boot
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); }
【本文版權歸微信公衆號"代碼藝術"(ID:onblog)全部,如果轉載請務必保留本段原創聲明,違者必究。】測試
--獲取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
【本文版權歸微信公衆號"代碼藝術"(ID:onblog)全部,如果轉載請務必保留本段原創聲明,違者必究。】lua