Redis Lua Java實現限流

2021-09-11 22:26:16 字數 1427 閱讀 7335

local key = keys[1] --限流key(一秒乙個)

local limit = tonumber(ar**[1]) --限流大小

local current = tonumber(redis.call('get', key) or "0")

if current + 1 > limit then --如果超出限流大小

return 0

else --請求數+1,並設定2秒過期

redis.call("incrby", key, "1")

redis.call("expire", key, "2")

endreturn 1

public static void main(string args) throws ioexception 

}

111

00

相比redis事務來說,lua指令碼有以下優點:

減少網路開銷: 不使用 lua 的**需要向 redis 傳送多次請求, 而指令碼只需一次即可, 減少網路傳輸;

原子操作: redis 將整個指令碼作為乙個原子執行, 無需擔心併發, 也就無需事務;

復用: 指令碼會永久儲存 redis 中, 其他客戶端可繼續使用.

分布式限流:

分布式限流最關鍵的是要將限流服務做成原子化,而解決方案可以使使用redis+lua或者nginx+lua技術進行實現,通過這兩種技術可以實現的高併發和高效能。

首先我們來使用redis+lua實現時間窗內某個介面的請求數限流,實現了該功能後可以改造為限流總併發/請求數和限制總資源數。lua本身就是一種程式語言,也可以使用它實現複雜的令牌桶或漏桶演算法。

如下操作因是在乙個lua指令碼中(相當於原子操作),又因redis是單執行緒模型,因此是執行緒安全的。

另附ip限流lua指令碼:

local key = "rate.limit:" .. keys[1]

local limit = tonumber(ar**[1])

local expire_time = ar**[2]

local is_exists = redis.call("exists", key)

if is_exists == 1 then

if redis.call("incr", key) > limit then

return 0

else

return 1

endelse

redis.call("set", key, 1)

redis.call("expire", key, expire_time)

return 1

end

android editText 輸入字數限制

方法一 輸入框限制輸入字數 edittext.addtextchangedlistener new textwatcher override public void ontextchanged charsequence s,int arg1,int arg2,int arg3 override pu...

android edittext進行字元限制

根據需求,對暱稱進行20個字元的限制,乙個漢字佔兩個字元,乙個字母佔乙個字元,當已經輸入19個字元的時候,不可以輸入漢字,但是還可以輸入乙個字母。如果輸入超過20個字元,進行擷取20個字元。以下是網上大神的工具類,我這邊根據自己需求修改。其中的20個可以隨意的修改 1.這是個工具類 public c...

兩限房申請攻略

房子問題是大問題,解決了房子問題,其它問題相對小一些。希望看過本文的朋友能夠有所幫助。目前北京的兩限房申請相對容易下面就介紹一些攻略。一 申請流程 1 到居委會領取兩限房申請 這個表一共三份,按照裡面的內容進行填寫。申請條件 1 北京市戶口,單身必須30歲以上,個人收入不超過8.8萬。2 如果超過2...