使用Aop Redis lua限流,優化高併發問題

2021-10-23 08:10:21 字數 1473 閱讀 1771

限流的方式有很多:

1、單機模式下,可以使用atomicinteger、ratelimiter、semaphore。

2、分布式下,可以使用佇列(如kafka等),但是編碼比較繁雜;也可以使用nginx限流,但是屬於閘道器層面,不能解決所有問題(如內部服務介面)。

所以,應用層也是需要做限流操作的。這裡簡單結合aop+redis+lua來實現。注:如果是需要接入層先流的話,建議還是要使用nginx自帶的連線數限流模組和請求限流模組。

lua指令碼:

/**

* 限流指令碼

*/private string buildluascript()

1、keys[1]獲取傳入的keys引數,(這裡為redis的鍵key)

2、ar**[1]獲取到傳入的limit引數,(這裡為請求的token數量,也可以理解為次數)

3、ar**[2]獲取到傳入的limit引數,(這裡為使用的限流key的過期時間)

限流註解,limit

@target

(elementtype.method)

@retention

(retentionpolicy.runtime)

public @inte***ce

limit

切面aspect

@aspect

@component

public

class

limitaspect

@pointcut

("@annotation(com.xx.xx.limit)"

)public

void

pointcut()

@around

("pointcut()"

)public object around

(proceedingjoinpoint joinpoint)

throws throwable 次訪問key為 {},描述為 [{}] 的介面"

}

測試

/**

* @author shamee

* 限流測試

*/@restcontroller

("/api/limit"

)public

class

limitcontroller

}

簡單備註,以便日後查閱。

使用Redis進行限流

通過使用註解 提供介面形式與引數形式2種方式 針對性的對介面進行限流,底層使用redis配合lua指令碼實現令牌桶。public class redisratelimiter public boolean tryacquire string flag,int maxpermits,int addra...

使用Nginx實現限流

1.http限流配置 限制請求 請求單個ip,每秒讀50次,寫10次 limit req zone uri zone api read 20m rate 50r s 讀 limit req zone uri zone api write 20m rate 10r s 寫 按ip配置乙個連線 zone...

限流和限流演算法

目錄 一 什麼是限流 二 為什麼需要限流 三 那些場景需要用到限流 3.1 對外服務 3.2 對內服務 四 限流演算法 4.1 計數器演算法 4.2 漏桶演算法 4.3 令牌桶演算法 限流其實是指當系統資源不夠,不足以應對大量請求,即系統資源與訪問量出現矛盾的時候,我們為了保證有限的資源能夠正常服務...