網站首頁 編程語言 正文
一、Redis-Cell安裝如下
Redis-Cell限流插件安裝(Centos)_毅呀毅呀喲-CSDN博客一、下載wget https://github.com/brandur/redis-cell/releases/download/v0.3.0/redis-cell-v0.3.0-x86_64-unknown-linux-gnu.tar.gz二、解壓tar -zxvf redis-cell-v0.3.0-x86_64-unknown-linux-gnu.tar.gz三、得到如下四、復制.so文件的地址,在redis.conf文件中添加如下配置loadmodule /usr/l.https://blog.csdn.net/qq_39648029/article/details/121245348二、Redis-Cell指令介紹
CL.THROTTLE user123 15 30 60 1
?三、返回值
127.0.0.1:6379> CL.THROTTLE user123 15 30 60 1) (integer) 0 # 0允許,1拒絕 2) (integer) 16????# 容量,等于指令第二個參數 +1 3) (integer) 15 # 剩余量 4) (integer) -1 #-1表示正常放入,0表示已滿,正數表示幾秒可放入(單位:秒) 5) (integer) 2 # 多長時間漏斗完全漏空(單位:秒)
四、spring boot代碼
package com.zyweb.admin.utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.TimeUnit;
/**
* redis 工具類
* @Author ZhangYi
*/
@Component
public class RedisUtil {
private final Logger logger = LoggerFactory.getLogger(RedisUtil.class);
@Resource
private RedisTemplate redisTemplate;
/**
* lua 腳本
*/
public static final String LUA_SCRIPT = "return redis.call('cl.throttle',KEYS[1], ARGV[1], ARGV[2], ARGV[3], ARGV[4])";
/**
* 測試
*
* @param key
* @param maxBurst
* @param countPerPeriod
* @param period
* @param quantity
* @return
*/
public boolean redisCellDemo(String key, int maxBurst, int countPerPeriod, int period, int quantity) {
try {
DefaultRedisScript script = new DefaultRedisScript<>(LUA_SCRIPT, List.class);
/**
* KEYS[1]需要設置的key值,可以結合業務需要
* ARGV[1]參數是漏斗的大小 最大爆發
* ARGV[2]頻率次數,結合ARGV[3]一起使用
* ARGV[3]周期(秒),結合ARGV[2]一起使用
* 最后的速率就是ARGV[2]次/ARGV[3]秒
* ARGV[4]申請令牌數,默認是1
*/
List rst = redisTemplate.execute(script, Arrays.asList(key), maxBurst, countPerPeriod, period, quantity);
logger.info("限流{}返回:{}", key, rst);
/**
* 1. 動作是否受限:
* 0 表示允許該操作。
* 1 表示該操作受到限制/阻止。
* 2. 密鑰的總限制 (max_burst+1)。這相當于常見的X-RateLimit-Limit HTTP返回頭。
* 3. 密鑰的剩余限制。相當于X-RateLimit-Remaining。
* 4. 用戶應重試之前的秒數,-1如果允許操作,則始終如此。相當于Retry-After。
* 5. 限制將重置為其最大容量之前的秒數。相當于X-RateLimit-Reset。
*/
//這里只關注第一個元素0表示正常,1表示過載
return rst.get(0) == 0;
} catch (Exception e) {
logger.error("限流{}獲取拋錯:", key, e);
return false;
}
}
}
?五、測試
@GetMapping("/redisCell")
public void redisCell(){
// 模擬30次請求
for (int i = 0; i < 30; i++) {
boolean rst = redisUtil.redisCellDemo("user123 ", 5, 10, 30, 1);
if (!rst) {
logger.info("訪問{}過于頻繁,請稍后再試",i);
} else {
logger.info("訪問{}通過",i);
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
六、demo表示,每秒有1個請求進入,漏斗最大容量為5,漏水速率為10個/30秒,也就是3秒鐘漏掉一個
整合攔截器+自定義注解,可自定義對接口進行限流
原文鏈接:https://zhangyi520.blog.csdn.net/article/details/121249036
相關推薦
- 2023-11-25 優化計算屬性mapState、mapGetters和methods的mapActions、mapMu
- 2023-04-14 使用?React?hooks?實現類所有生命周期_React
- 2022-11-23 使用Xshell建立連接并操縱服務器的方法_Linux
- 2023-01-14 React項目中className運用及問題解決_React
- 2022-04-04 uni-app 數據上拉加載更多功能
- 2021-11-28 jQuery實現全部購物車功能實例_jquery
- 2022-12-27 刪除Helm使用時關于kubernetes文件的警告問題_云其它
- 2022-02-26 Uncaught RangeError: Maximum call stack size excee
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支