SpringBoot經過RedisTemplate執行Lua腳本

【本文版權歸微信公衆號"代碼藝術"(ID:onblog)全部,如果轉載請務必保留本段原創聲明,違者必究。】redis

若是你對Redis和Lua的關係不太清楚,請先閱讀:Redis進階之使用Lua腳本開發spring

1.RedisScript

首先你得引入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

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);

如果出現序列化問題,能夠指定序列化方式。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);
}

3.Lua腳本

【本文版權歸微信公衆號"代碼藝術"(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

相關文章
相關標籤/搜索