乙個安全的介面限流肯定少不了,登入尤其如此。比如驗證碼傳送,驗證碼驗證試錯,密碼登入試錯,這些雖然是不同的業務,但是目的都是乙個就是,對於某些使用者的某種行為在一段時間內的的允許次數進行限制
對於此我們抽象出來四個東西
接下來我們借助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...