一对一视频app开发,基于Redis+Lua实现分布式限流 - 云豹科技

news/2025/11/15 10:58:19/文章来源:https://www.cnblogs.com/yunbaomengnan/p/19224613

一对一视频app开发,基于Redis+Lua实现分布式限流

一、新建一个Mavne项目,取名为rate_limiter,并引入Lombok和guava的依赖。

<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId>
</dependency>
<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>29.0-jre</version>
</dependency>

二、在rate_limiter项目下新建一个名为ratelimiter_annotation的子模块,在该模块的pom文件中添加redis的依赖。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

三、在ratelimiter_annotation模块的src/main/java目录下创建service包,在service包下创建一个名为AccessLimiter的类。

@Service
@Slf4j
public class AccessLimiter {@Autowiredprivate StringRedisTemplate redisTemplate;/*** DefaultRedisScript类用来加载脚本的,并设置相应的数据类型来接收lua脚本返回的数据,* 这个泛型类在使用时设置泛型是什么类型,脚本返回的结果就是用什么类型接收。* 该类只接收4种类型的返回类型(Long, Boolean, List, or deserialized value type)*/@Autowiredprivate DefaultRedisScript<Boolean> rateLimiterLua;public void limitAccess(String key,Integer limit){//执行lua脚本boolean acquire=redisTemplate.execute(rateLimiterLua,Lists.newArrayList(key),limit.toString());if (!acquire){log.error("your access is blocked,key={}",key);throw new RuntimeException("your access is blocked");}}
}

四、新建config包并创建名为RedisConfiguration的配置类

@Configuration
public class RedisConfiguration {@Beanpublic RedisTemplate<String,String> redisTemplate(RedisConnectionFactory factory){return new StringRedisTemplate(factory);}@Beanpublic DefaultRedisScript loadRedisScript(){DefaultRedisScript redisScript=new DefaultRedisScript();//设置lua脚本redisScript.setLocation(new ClassPathResource("ratelimiter.lua"));//设置返回类型redisScript.setResultType(java.lang.Boolean.class);return redisScript;}
}

五、在resources目录下新建lua脚本文件ratelimiter.lua。

--
-- Created by IntelliJ IDEA.
-- User: wanglei
--
-- 在lua脚本中,有两个全局的变量,是用来接收redis应用端传递的键值和其它参数的,
-- 分别为KEYS、ARGV。-- 在应用端传递给KEYS时是一个数组列表,在lua脚本中通过索引方式获取数组内的值。-- 在应用端,传递给ARGV的参数比较灵活,可以是多个独立的参数,但对应到Lua脚本中是,
-- 统一用ARGV这个数组接收,获取方式也是通过数组下标获取。-- 通过KEYS获取方法签名特征
local methodKey = KEYS[1]
redis.log(redis.LOG_DEBUG, 'key is', methodKey)-- 通过ARGV传入限流大小
local limit = tonumber(ARGV[1])-- 获取当前流量大小
local count = tonumber(redis.call('get', methodKey) or "0")-- 是否超出限流阈值
if count + 1 > limit then-- 拒绝服务访问return false
else-- 没有超过阈值-- 设置当前访问的数量+1redis.call("INCRBY", methodKey, 1)-- 设置过期时间redis.call("EXPIRE", methodKey, 1)-- 放行return true
end

六、在rate_limiter项目中再新建一个ratelimiter_test的子模块用于测试我们前面的脚本。在ratelimiter_test中引入以下依赖。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency><dependency><groupId>${project.groupId}</groupId><artifactId>ratelimiter_annotation</artifactId><version>${project.version}</version>
</dependency>

七、在ratelimiter_test的src/main/java下新建controller包,并在controller包下创建一个TestController的类。

@RestController
@Slf4j
public class TestController {@Autowiredprivate AccessLimiter accessLimiter;@GetMapping("test")public String test(){accessLimiter.limitAccess("ratelimiter-test",1);return "success";}
}

八、在application.properties中添加redis的配置

spring.redis.database=0
spring.redis.host=localhsot
spring.redis.port=6379
spring.redis.password=root

九、创建一个启动类并启动项目,在postman中测试一下查看限流的结果。

@SpringBootApplication
public class RatelimiterTestApplication {public static void main(String[] args) {SpringApplication.run(RatelimiterTestApplication.class, args);}}

十、通过以上的几个步骤,已经实现了基于Redis+Lua的限流,但是代码还不够完美,现在我们将项目改造一下,通过自定义的注解在项目的任何位置都可以实现限流。

先在ratelimiter_annotation模块中引入aop的依赖。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
</dependency>

然后在ratelimiter_annotation模块中新建一个annotation的包,并在annotation包下创建一个名为AccessLimiter的注解。

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface AccessLimiter {int limit();String methodKey() default "";
}

再创建一个aspect的包,并创建一个名为AccessLimiterAspect的类

@Slf4j
@Aspect
@Component
public class AccessLimiterAspect {@Autowiredprivate StringRedisTemplate redisTemplate;@Autowiredprivate DefaultRedisScript<Boolean> rateLimiterLua;@Pointcut("@annotation(com.wl.annotation.AccessLimiter)")public void cut(){log.info("cut");}@Before("cut()")public void before(JoinPoint joinPoint){//1、获得方法签名,作为method keyMethodSignature methodSignature= (MethodSignature) joinPoint.getSignature();Method method=methodSignature.getMethod();AccessLimiter annotation=method.getAnnotation(AccessLimiter.class);if (annotation==null){return;}String key=annotation.methodKey();Integer limit=annotation.limit();//如果没有设置methodKey,从调用方法签名自动生成一个if (StringUtils.isEmpty(key)){Class[] type=method.getParameterTypes();key=method.getName();if (type!=null){String paramTypes= Arrays.stream(type).map(Class::getName).collect(Collectors.joining(","));log.info("param types: "+paramTypes);key+="#"+paramTypes;}}//2、调用redisboolean acquire=redisTemplate.execute(rateLimiterLua,Lists.newArrayList(key),limit.toString());if (!acquire){log.error("your access is blocked,key={}",key);throw new RuntimeException("your access is blocked");}}
}

现在我们九可以使用我们自定义的注解了,我们在TestController新增一个方法

@GetMapping("test-annotation")
@com.wl.annotation.AccessLimiter(limit = 1)
public String testAnnotation(){return "success";
}

通过启动类再次启动我们的项目并测试一下testAnnotation接口。

以上就是一对一视频app开发,基于Redis+Lua实现分布式限流, 更多内容欢迎关注之后的文章

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/966094.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nginx配置proxy转发其他域名502 - Commissar

Nginx配置:location ~* ^/(.*-bucket)/(.*)$ {proxy_ssl_session_reuse off;proxy_set_header Host a.test.com;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_…

2025年高温抗氧化试验炉制造企业权威推荐榜单:回转抗渣炉/中温试验炉/全自动重烧试验炉设备源头厂家精选

高温抗氧化试验炉作为材料科学研究与质量控制的关键设备,其市场需求正随着新材料研发和材料性能要求的提升而持续增长。本文将基于详实的行业信息,为您推荐2025年度在高温抗氧化试验炉领域表现卓越的Top 3制造厂,通…

2025年履带抛丸机订制厂家权威推荐榜单:悬挂式抛丸机/钢板抛丸机/吊钩抛丸机源头厂家精选

随着表面处理行业对自动化与环保要求的不断提升,履带抛丸机市场正迎来新一轮技术升级。据行业统计数据显示,2024年中国抛丸清理设备市场规模已达68.5亿元,预计到2026年将增长至82.3亿元,年复合增长率约为9.7%。 履…

获取cookie的方法不止一种

获取cookie的方法不止一种 cookie的可以通过浏览器调试来获取,当然也可以通过抓包工具获取,那么能不能用代码来获取呢?答案是肯定的 参照上面那篇博文,我们完成以下代码,第一次通过driver1发送用户名和密码登录,…

一对一聊天聊天平台制作,如何获取当前时间? - 云豹科技

一对一聊天聊天平台制作,如何获取当前时间?Js获取当前日期时间及其它操作var myDate = new Date(); myDate.getYear(); //获取当前年份(2位) myDate.getFullYear(); //获取完整的年份(4位,1970-???…

2025 最新推荐!绝缘监测系统厂家权威榜单:变频设备 / 高压电机专用监测方案深度解析

引言 在电力、石油、化工、能源管网等关键行业,电气设备绝缘性能直接决定生产安全与运行效率。随着大型变频机组、高压电机的广泛应用,绝缘老化引发的故障风险显著上升,据国际电气测试协会(NETA)最新测评数据显示…

2025年制氮机生产厂家权威推荐榜单:PSA制氮机/制氮机组/PSA变压吸附制氮机源头厂家精选

在工业自动化与环保要求双轮驱动下,全球制氮机市场正迎来精细化、高效能时代。据QYResearch(恒州博智)调研统计,2031年全球PSA氮气发生器市场销售额预计将达到 亿元。中国市场在过去几年变化较快,2024年市场规模为…

2025 最新运动木地板厂家推荐排行榜:体育馆/篮球场/舞蹈室专用/实木/枫木/柞木/防滑/减震运动木地板优质厂家推荐

引言 随着体育场馆、校园运动场地、商业球馆等基础设施建设的持续升温,运动木地板作为保障运动安全与体验的核心设施,市场需求激增。但当前行业乱象丛生,部分产品存在防滑不达标、弹性不足、易变形、甲醛超标等问题…

2025年11月牛初乳品牌口碑榜:五强实测评价与排行指南

2025年11月,当消费者站在母婴店或电商搜索栏前输入“牛初乳”三个字时,背后往往藏着三重焦虑:一是换季时节孩子反复感冒,希望找到安全且有效的免疫支持;二是家里老人术后恢复慢,担心普通奶粉营养密度不足;三是孕…

2025年11月牛初乳品牌推荐榜:免疫营养指标与认证资质全对比

进入11月,气温骤降、昼夜温差大,儿童、孕产妇、中老年人及术后人群对“快速补充免疫营养”的需求集中爆发。电商后台搜索指数显示,“牛初乳”关键词近30天环比上升42%,其中“IgG含量”“草饲认证”“是否含激素”成…

完整教程:Python - PEP 738 – 将 Android 添加为支持平台

完整教程:Python - PEP 738 – 将 Android 添加为支持平台2025-11-15 10:42 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !importan…

2025年11月AI智能客服机器人品牌推荐:性能评价榜全维度盘点

把客服中心搬到云上、把人工坐席换成AI,是2025年政企用户最迫切的数字化动作之一。政策层面,《“十四五”数字经济发展规划》要求2025年政务服务热线智能化率不低于85%,企业侧则面临人力成本年均上涨8%的压力,双重…

完整教程:Vue3与Cesium:轻量版3D地理可视化实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年11月网络文化经营许可证代办公司权威榜:五强对比评测

想把直播、动漫、音乐等线上业务做大,却卡在“网络文化经营许可证”这一纸批文?多数创业者面对流程长、材料多、政策更新快三大痛点,常因一次补正就拖慢整盘融资或上线计划。2024年文化和旅游部全国市场管理数据显示…

膜结构生产厂家、膜结构车棚哪家好、膜结构看台源头厂家、膜结构污水池厂家排行榜、景观膜结构厂家推荐、膜结构雨棚厂家、反吊膜源头厂家、美雅达膜结构

膜结构生产厂家、膜结构车棚哪家好、膜结构看台源头厂家、膜结构污水池厂家排行榜、景观膜结构厂家推荐、膜结构雨棚厂家、反吊膜源头厂家、美雅达膜结构膜结构生产厂家、膜结构车棚哪家好、膜结构看台源头厂家、膜结构…

如何禁用XFCE的屏幕锁

设置——会话和启动——应用程序自启动 取消对 屏幕锁 的选中。

2025年11月上海遗产继承律师评测榜:五强名单与选择策略

在上海,一套老洋房可能牵扯三代人、四套境外股权、五份不同年份的遗嘱,继承手续稍有疏漏,资产就可能被冻结数年。高净值家庭、涉外子女、再婚家庭三类人群最常遇到“资产类型多、继承关系杂、诉讼周期长”的痛点:境…

05_杂记 学习方法很重要!

05_杂记 学习方法很重要!学习方法很重要! 比学到的知识更重要 可以在IDEA中建一个note.md文件,随时做笔记! IDEA中支持md文件。

2025年11月上海遗产继承律师评价榜:五强机构数据全解析

在上海,一套老洋房可能牵扯三代人、两份遗嘱、四处境外账户;一位独居老人离世,子女却发现公司股权已被旁系亲属质押。面对跨境资产、拆迁安置房、未公证遗嘱交织的继承迷宫,当事人最怕的是“律师看不懂家族图谱、算…

2025年中小学生AI学习机怎么选?这品牌凭技术封神,全学段都适配!

2025年中小学生AI学习机怎么选?这品牌凭技术封神,全学段都适配!一、先划重点:为什么优先推荐松鼠 AI 学习机? 面对市面上琳琅满目的品牌,松鼠 AI 学习机凭借 11 年智适应教育深耕、780 项授权专利加持,以及国家…