使用jedis執行lua腳本


 

轉:

redis學習(十五) 使用jedis執行lua腳本(實現一個對IP的限流)

使用jedis執行lua腳本(實現一個對IP的限流)

上一篇學習了怎么安裝lua,這一篇學習編寫一個lua腳本用jedis執行,實現對一個IP的限流

LUA腳本如下,第一次使用incr對KEY(某個IP作為KEY)加一,如果是第一次訪問,使用expire設置一個超時時間,這個超時時間作為Value第一個參數傳入,如果現在遞增的數目大於輸入的第二個Value參數,返回失敗標記,否則成功。redis的超時時間到了,這個Key消失,又可以訪問啦。

package redis;

import java.util.Arrays;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;


public class LuaTest {

    public static void main(String[] args) {

        JedisPool jedisPool = new JedisPool("127.0.0.1", 6379);
        Jedis jedis = jedisPool.getResource();
        try {
             String lua = "local num = redis.call('incr', KEYS[1])\n" +
                        "if tonumber(num) == 1 then\n" +
                        "\tredis.call('expire', KEYS[1], ARGV[1])\n" +
                        "\treturn 1\n" +
                        "elseif tonumber(num) > tonumber(ARGV[2]) then\n" +
                        "\treturn 0\n" +
                        "else \n" +
                        "\treturn 1\n" +
                        "end\n";
             /**
                local num = redis.call('incr', KEYS[1])
                if tonumber(num) == 1 then
                    redis.call('expire', KEYS[1], ARGV[1])
                    return 1
                elseif tonumber(num) > tonumber(ARGV[2]) then
                    return 0
                else 
                    return 1
                end
             */
             
            Object result = jedis.evalsha(jedis.scriptLoad(lua), Arrays.asList("localhost"), Arrays.asList("10", "2"));
            System.out.println(result);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (jedis != null) {
                try {
                    jedis.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
        
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM