成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > 基于Redis+Lua腳本實現(xiàn)分布式限流組件封裝的方法

基于Redis+Lua腳本實現(xiàn)分布式限流組件封裝的方法

熱門標簽:四川穩(wěn)定外呼系統(tǒng)軟件 一個地圖標注多少錢 臺灣電銷 地圖標注工廠入駐 高碑店市地圖標注app 南京手機外呼系統(tǒng)廠家 廊坊外呼系統(tǒng)在哪買 b2b外呼系統(tǒng) 400電話辦理的口碑

創(chuàng)建限流組件項目

pom.xml文件中引入相關依賴

 dependencies>
 dependency>
 groupId>org.springframework.boot/groupId>
 artifactId>spring-boot-starter-data-redis/artifactId>
 /dependency>
 
 dependency>
 groupId>org.springframework.boot/groupId>
 artifactId>spring-boot-starter-aop/artifactId>
 /dependency>
 
 dependency>
 groupId>com.google.guava/groupId>
 artifactId>guava/artifactId>
 version>18.0/version>
 /dependency>
 
 /dependencies>

在resources目錄下創(chuàng)建lua腳本  ratelimiter.lua

--
-- Created by IntelliJ IDEA.
-- User: 寒夜
--
 
-- 獲取方法簽名特征
local methodKey = KEYS[1]
redis.log(redis.LOG_DEBUG, 'key is', methodKey)
 
-- 調用腳本傳入的限流大小
local limit = tonumber(ARGV[1])
 
-- 獲取當前流量大小
local count = tonumber(redis.call('get', methodKey) or "0")
 
-- 是否超出限流閾值
if count + 1 > limit then
 -- 拒絕服務訪問
 return false
else
 -- 沒有超過閾值
 -- 設置當前訪問的數(shù)量+1
 redis.call("INCRBY", methodKey, 1)
 -- 設置過期時間
 redis.call("EXPIRE", methodKey, 1)
 -- 放行
 return true
end

創(chuàng)建RedisConfiguration 類

package com.imooc.springcloud;
 
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;
 
/**
 * @author 寒夜
 */
@Configuration
public class RedisConfiguration {
 
 @Bean
 public RedisTemplateString, String> redisTemplate(
 RedisConnectionFactory factory) {
 return new StringRedisTemplate(factory);
 }
 
 @Bean
 public DefaultRedisScript loadRedisScript() {
 DefaultRedisScript redisScript = new DefaultRedisScript();
 redisScript.setLocation(new ClassPathResource("ratelimiter.lua"));
 redisScript.setResultType(java.lang.Boolean.class);
 return redisScript;
 }
 
}

創(chuàng)建一個自定義注解 

package com.hy.annotation;
 
import java.lang.annotation.*;
 
/**
 * @author 寒夜
 */
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface AccessLimiter {
 
 int limit();
 
 String methodKey() default "";
 
}

創(chuàng)建一個切入點

package com.hy.annotation;
 
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.script.RedisScript;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
 
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.stream.Collectors;
 
/**
 * @author 寒夜
 */
@Slf4j
@Aspect
@Component
public class AccessLimiterAspect {
 
 private final StringRedisTemplate stringRedisTemplate;
 
 private final RedisScriptBoolean> rateLimitLua;
 
 public AccessLimiterAspect(StringRedisTemplate stringRedisTemplate, RedisScriptBoolean> rateLimitLua) {
 this.stringRedisTemplate = stringRedisTemplate;
 this.rateLimitLua = rateLimitLua;
 }
 
 
 
 @Pointcut(value = "@annotation(com.hy.annotation.AccessLimiter)")
 public void cut() {
 log.info("cut");
 }
 
 @Before("cut()")
 public void before(JoinPoint joinPoint) {
 // 1. 獲得方法簽名,作為method Key
 MethodSignature signature = (MethodSignature) joinPoint.getSignature();
 Method method = signature.getMethod();
 
 AccessLimiter annotation = method.getAnnotation(AccessLimiter.class);
 if (annotation == null) {
 return;
 }
 
 String key = annotation.methodKey();
 int limit = annotation.limit();
 
 // 如果沒設置methodkey, 從調用方法簽名生成自動一個key
 if (StringUtils.isEmpty(key)) {
 Class[] type = method.getParameterTypes();
 key = method.getClass() + method.getName();
 
 if (type != null) {
 String paramTypes = Arrays.stream(type)
  .map(Class::getName)
  .collect(Collectors.joining(","));
 log.info("param types: " + paramTypes);
 key += "#" + paramTypes;
 }
 }
 
 // 2. 調用Redis
 boolean acquired = stringRedisTemplate.execute(
 rateLimitLua, // Lua script的真身
 Lists.newArrayList(key), // Lua腳本中的Key列表
 Integer.toString(limit) // Lua腳本Value列表
 );
 
 if (!acquired) {
 log.error("your access is blocked, key={}", key);
 throw new RuntimeException("Your access is blocked");
 }
 }
 
}

創(chuàng)建測試項目

pom.xml中引入組件

application.yml配置

spring:
 redis:
 host: 192.168.0.218
 port: 6379
 password: 123456
 database: 0
 application:
 name: ratelimiter-test
server:
 port: 10087

創(chuàng)建controller

package com.hy;
 
import com.hy.annotation.AccessLimiter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
 
/**
 * @author 寒夜
 */
@RestController
@Slf4j
public class Controller {
 
 private final com.hy.AccessLimiter accessLimiter;
 
 public Controller(com.hy.AccessLimiter accessLimiter) {
 this.accessLimiter = accessLimiter;
 }
 
 @GetMapping("test")
 public String test() {
 accessLimiter.limitAccess("ratelimiter-test", 3);
 return "success";
 }
 
 // 提醒! 注意配置掃包路徑(com.hy路徑不同)
 @GetMapping("test-annotation")
 @AccessLimiter(limit = 1)
 public String testAnnotation() {
 return "success";
 }
 
}

開始測試,快速點擊結果如下

到此這篇關于基于Redis+Lua腳本實現(xiàn)分布式限流組件封裝的方法的文章就介紹到這了,更多相關Redis+Lua腳本實現(xiàn)分布式限流組件內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • springboot+redis 實現(xiàn)分布式限流令牌桶的示例代碼
  • Redis和Lua實現(xiàn)分布式限流器的方法詳解
  • 基于Redis實現(xiàn)分布式應用限流的方法
  • Redis分布式限流組件設計與使用實例

標簽:畢節(jié) 河源 南寧 伊春 甘南 定州 拉薩 泰州

巨人網絡通訊聲明:本文標題《基于Redis+Lua腳本實現(xiàn)分布式限流組件封裝的方法》,本文關鍵詞  基于,Redis+Lua,腳本,實現(xiàn),;如發(fā)現(xiàn)本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《基于Redis+Lua腳本實現(xiàn)分布式限流組件封裝的方法》相關的同類信息!
  • 本頁收集關于基于Redis+Lua腳本實現(xiàn)分布式限流組件封裝的方法的相關信息資訊供網民參考!
  • 推薦文章
    亚洲欧美天堂网| 日韩精品免费综合视频在线播放| 亚洲成a人v欧美综合天堂下载| 色999韩欧美国产综合俺来也| 亚洲精选一二三| 91精品国产免费久久综合| 在线免费观看亚洲| 成人在线一区二区三区| 东方aⅴ免费观看久久av| 中文一区一区三区免费在线观看| 蓝色福利精品导航| 韩国av电影免费观看| 麻豆视频免费看| 在线免费观看黄色网址| 人人妻人人澡人人爽人人欧美一区| 久久网站免费视频| 中文字幕av在线播放| 久久精彩免费视频| 亚洲成av人片在www色猫咪| 亚洲美女久久久| 中国人体摄影一区二区三区| 136国产福利精品导航网址应用| 2023国产精品久久久精品双| 久久久久网址| 欧美gay囗交囗交| 欧美精品久久久久久久久| 亚洲wwwwww| 欧美jizzhd精品欧美满| 国产精品成人免费一区久久羞羞| 婷婷丁香一区二区三区| 欧美亚日韩国产aⅴ精品中极品| 亚洲国产美国国产综合一区二区| 麻豆网站在线| 噜噜噜噜噜久久久久久91| www.成人网.com| 久久国产精品免费| 国产素人视频在线观看| 久草在线视频福利| 最新av番号| 久久久国产精品无码| 天天爱天天操天天干| 91久久偷偷做嫩草影院| 亚洲精品18在线观看| 国产精品色呦呦| 国产女主播喷水高潮网红在线| 国产a级片免费看| 蜜桃视频久久一区免费观看入口| 免费在线观看a视频| 久久久久久人妻一区二区三区| 欧美不卡123| 韩国三级hd两男一女| 欧美成a人片免费观看久久五月天| 伊人精品成人久久综合软件| 久久先锋影音av| 亚洲手机在线观看| 在线观看免费视频污| 手机看片福利永久国产日韩| 日本中文字幕在线视频| 天堂在线中文字幕| 黄网在线观看| 欧美日韩一区综合| 亚洲免费成人av在线| av在线不卡免费观看| 精品国内自产拍在线观看视频| 国产日韩欧美亚洲一区| 91精品国产色综合久久不卡粉嫩| 成人狠狠色综合| 国产精品一二三视频| 天天插天天操天天射| 日本网站在线免费观看| 国产精品视频xxx| 日夜干在线视频| 91社区视频在线观看| 亚洲国产成人精品久久久国产成人一区| 精品视频一二三区| 影音先锋5566资源网| 7777精品久久久大香线蕉小说| 中午字幕在线观看| 欧美综合一区二区三区| 韩国精品一区二区三区六区色诱| 色婷婷精品大在线视频| 欧美毛片免费观看| 1stkiss在线漫画| 熟女性饥渴一区二区三区| 免费av在线播放| 九色国产蝌蚪| 国产亚洲精久久久久久无码77777| 91丝袜美腿高跟国产极品老师| 午夜国产精品影院在线观看| 国产免费叼嘿网站免费| 奇米777影视成人四色| 久久99久久| 精品中文字幕一区二区| 国产日韩在线| 人人妻人人澡人人爽人人欧美一区| 欧美大片在线看| 黄色软件在线| 欧美在线一级va免费观看| www免费在线观看| 免费在线激情视频| 99国产欧美另类久久久精品| 波多野结衣亚洲一区二区| 久久精品伊人| 久草在线资源网站| 国产成人久久777777| 久久久久久噜噜噜久久久精品| 国内老熟妇对白xxxxhd| 一区二区三区|亚洲午夜| 午夜精品在线观看| 久久午夜国产精品| 91成人国产在线观看| xxxxx日韩| 黄色工厂在线观看| 精品亚洲一区二区三区四区五区| 97人人爽人人| 91av亚洲| 日韩黄色碟片| 亚洲国产影院| 欧美日韩在线视频免费播放| 国内不卡的一区二区三区中文字幕| 51成人做爰www免费看网站| 欧美一级片免费观看| 男人添女人下面高潮视频| 超碰成人免费| 人妻互换一区二区激情偷拍| 精品少妇一区二区三区在线播放| 亚洲免费一级片| 久久久久亚洲精品中文字幕| 国产永久免费高清在线观看| 成人做爰高清视频网站| 最新天堂资源在线| jizz18女人高潮| 一区二区三区区四区播放视频在线观看| 91在线视频免费看| 国产精品呻吟久久| 精品日本一区二区三区在线观看| 中文字幕超清在线免费观看| 成人在线高清免费| 亚洲国产精品悠悠久久琪琪| 国产66精品| 亚欧洲精品视频在线观看| 久久精品最新地址| 亚洲第一成人在线| 国产95亚洲| 亚洲熟女一区二区| 91超碰rencao97精品| 亚洲丝袜一区在线| 精产国品一区二区三区| 国产精品久久久影院| 国产免费一区二区| 国产精品久久久久福利| 国产午夜久久久久| 日韩不卡一区二区| 91视频国产一区| 国产美女免费看| 在线观看亚洲国产| 666av成人影院在线观看| 国产在线一二三区| 国产黄色激情视频| 美脚丝袜一区二区三区在线观看| 日本不卡一二三区| 日韩精品久久久久久久玫瑰园| 亚洲做受高潮| 中文字幕一区二区三区蜜月| 99国精产品一二二线| 美女黄毛**国产精品啪啪| 亚洲色图综合图区| 亚洲第一视频在线| 久久久久久电影| 在线免费观看欧美| 国产精品一区二区av白丝下载| 欧美三级 欧美一级| 懂色av粉嫩av蜜乳av| 亚洲一区中文字幕永久在线| 在线播放不卡| 亚洲精品欧美一区二区三区| 久久国产精品1区2区3区网页| 在线免费观看欧美| 亚洲色成人www永久网站| 97精品国产一区二区三区| 一区二区三区福利视频| 2020中文字幕在线播放| 国产日韩精品视频| 伊人久久大香线蕉av不卡| 91社影院在线观看| 久久精品国产精品亚洲毛片| 91麻豆精品久久久久蜜臀| 91亚洲一线产区二线产区| а√天堂中文在线资源bt在线| 欧美日韩中文字幕日韩欧美| av片在线观看永久免费| 欧美色老头old∨ideo| 国产99午夜精品一区二区三区| 国产av无码专区亚洲av麻豆| 日韩一区亚洲二区| 亚洲天堂一区在线观看| 国产亚洲精品美女久久久| 亚洲大胆视频| 欧美精品人人做人人爱视频| 亚洲精品永久视频| 激情内射人妻1区2区3区| 国产精品88av| 99re6在线视频精品免费| 精品欧美一区二区三区在线观看| 羞羞色国产精品网站| 又嫩又硬又黄又爽的视频| 色婷婷精品大视频在线蜜桃视频| 亚洲免费在线视频观看| 好吊妞视频这里有精品| 亚洲欧美在线另类| 欧美性猛交xxxx乱大交91| 国产精品久久看| 日本一区二区高清不卡| 欧洲杯什么时候开赛| 欧美三级欧美成人高清www| 亚洲第一天堂无码专区| www.99热| 成人久久一区| 蝴蝶中文综合娱乐网| 一本二本三本亚洲码| 中国女人做爰视频| 亚洲 中文字幕 日韩 无码| 9久久9毛片又大又硬又粗| 国产老熟妇精品观看| 国产真人无码作爱视频免费| 久久亚洲国产精品| 国产精品白丝jk喷水视频一区| 毛片网站免费哦| 1区2区3区在线观看| 先锋影音av在线资源| 丁香六月婷婷| 国产不卡在线播放| 亚洲午夜精品一区二区| 欧美xxxxx在线视频| 星空大象在线观看免费播放| 欧美大电影免费观看| 超碰91人人草人人干| 成人免费一级视频| 天天av导航| 黄色大片在线播放| 久久人人爽人人爽人人| 97视频在线观看免费高清完整版在线观看| 欧美久久综合性欧美| 午夜影院网站| 日韩欧美中文一区| 在线不卡免费欧美| 国产一级做a爰片久久| 国产伦精品一区二区三区妓女下载| 在线视频欧美区| 日本五十路在线| 可以免费观看av的网站| 欧美福利网址| 美女扒开腿让男人桶爽久久动漫| 欧美黄色成人| 自拍偷拍亚洲综合| 亚洲成人av免费| 久久久久久91| 欧美黄色录像片| 久草视频视频在线播放| 九九爱免费视频在线观看| 免费网站观看www在线观看| 国产精品久久久av| 亚洲人成网站在线观看播放| 免费高清视频在线一区| 国产在线观看你懂的| 久久久久一本一区二区青青蜜月| 国产精品美女久久久久av爽| 免费在线观看污视频| 中文字幕在线观看国产| 黄网站在线观看高清免费| 日韩av免费在线播放| 日韩电影免费在线观看中文字幕| 日韩av成人在线| 又爽又大又黄a级毛片在线视频| 欧美日韩免费一区二区| 在线欧美亚洲| 樱花草www在线| 亚洲精品成人| 久久精品国产68国产精品亚洲| 欧美精品国产白浆久久久久| 国产一区二区三区免费不卡| 亚洲bt天天射| 欧美激情免费观看| 国产又黄又猛又粗又爽的视频| 国产一区久久精品| 少妇无套内谢久久久久| ,亚洲人成毛片在线播放| 国产三区在线观看| 精品一区免费| 国产精品乱码一区二区| 国产精品入口麻豆原神| 中文字幕免费在线视频| 国内偷拍精品视频| 96日本xxxxxⅹxxx17| 亚洲国产美女精品久久久久∴| 国产一区二区主播在线| 成人免费看片视频| 色片在线免费观看| 中文字幕网av| 精品动漫一区二区| 在线成人超碰| 久久久无码一区二区三区| 99热在线观看免费精品| 亚洲欧洲国产一区| 动漫av一区| 91av网站在线播放| 亚洲欧美日韩国产中文专区| 粉嫩av一区二区三区免费野| 免费在线观看你懂的| 一区二区三区电影大全| 国产日产精品一区二区三区| 日日夜夜精品视频| 国产黄色片在线| 免费看欧美一级片| 在线播放的av| 欧美色图另类图片| 中文字幕2022永久在线| 日本在线视频中文字幕| 在线观看日韩av电影| 最近中文字幕mv免费高清视频8| 伊人亚洲综合网| 精品国产乱码久久久久软件| 国偷自产一区二区免费视频| 日韩成人免费在线| 美女扒开内裤让男人桶| 亚洲人成网站免费播放| 亚洲人成在线免费观看| 三级视频在线播放|