1. 程式人生 > >SpringBoot通過RedisTemplate執行Lua腳本

SpringBoot通過RedisTemplate執行Lua腳本

spring ash count blog object rate ces star map

如果你對Redis和Lua的關系不太清楚,請先閱讀:Redis進階之使用Lua腳本開發

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

SpringBoot通過RedisTemplate執行Lua腳本