使用redis調用lua腳本的方式對接口進行限流


java端實現:

   //初始化一個redis可執行的lua
            DefaultRedisScript<List> defaultRedisScript = new DefaultRedisScript<List>();
            defaultRedisScript.setResultType(List.class);
            defaultRedisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("redis_limit.lua")));

            List<String> key = new ArrayList<>();//這里雖然使用List集合,但是暫時只存儲一個值(Key+時間戳)
            List<String> args = Lists.newArrayList("參數值可以是多個");
            //這里的StringRedisTemplate需要自己初始化並配置
            List<String> ret = new StringRedisTemplate().execute(defaultRedisScript, key, args);//返回也是一個List,就是在lua中的返回值,默認取出第一個即可

lua腳本執行代碼:

local key= KEYS[1] --獲取需要限流接口的key(每秒都會生成一個新的,當然key的過期時間也是1秒)
local limitRqNum= tonumber(ARGV[1]) --每秒上限訪問個數(獲取java調用腳本階段傳入的參數)
local currRqNum= tonumber(redis.call('get',key) or "0") --獲取當前redis中當前秒內已經存儲的請求總數
if currRqNum+1 > limitRqNum then --超出流量限制大小的話
   return 0
else --如果沒有超出限制請求大小則將redis中記錄的請求總數+1,並設置該key
   redis.call('INCRBY',key,"1") --將請求計數+1
   --設置過期時間2秒,這個設置主要是讓這個key既能自動失效刪除,又能保證在至少1秒內不過期仍舊可以看到當前秒內總請求記錄數
   redis.call('EXPIRE',key,"2")
   return 1
end

 


免責聲明!

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



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