RedisTemplate 實現通用限流器

2021-10-23 22:20:34 字數 664 閱讀 8682

乙個安全的介面限流肯定少不了,登入尤其如此。比如驗證碼傳送,驗證碼驗證試錯,密碼登入試錯,這些雖然是不同的業務,但是目的都是乙個就是,對於某些使用者某種行為一段時間內的的允許次數進行限制

對於此我們抽象出來四個東西

接下來我們借助redis來實現這功能

redis中有一種資料型別 zset ,簡單來說一種set,值唯一,除此之外還多了乙個特性,zset結構還有乙個score欄位,可以對插入的值根據score進行排序,我們可以以此做文章。

首先可以以時間作為score的值,配合設定的時間週期period 來形成乙個滑動視窗,然後統計視窗內的key數量,如果數量超過最大限制次數,則進行限制訪問;如果小於最大限制次數,則可以繼續訪問。

@component

public

class

******ratelimiter})

;// 獲取第三步返回的結果

long count =

(long) result.

get(2)

;return count <= maxcount;

}}

RedisTemplate實現分布式鎖

component public class redisdistributedlockutils private static redistemplateredistemplate autowired public void setredistemplate redistemplate redist...

redisTemplate實現分布式鎖

其他操作 setnx 和expire分開實現上鎖和超時的話存在問題,如果加鎖後設定超時 未執行時,服務掛掉,將會死鎖 解鎖時使用getset判斷之後再刪除key,可能存在在getset之後,此時鎖超時被其他人占有,再刪就把別人的鎖刪了。參考各大神部落格,超時時間的設定延時使用守護執行緒,還沒搞,有空...

RedisTemplate操作Redis常用

redistemplate中定義了對5種資料結構操作 redistemplate.opsforvalue 操作字串 redistemplate.opsforhash 操作hash redistemplate.opsforlist 操作list redistemplate.opsforset 操作se...