轉:
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(); } } } } }