分布式限流:Redis

news2024/11/6 3:07:01

目录

1:如何实现分布式限流

2:限流的几种类别 

2.1:固定窗口限流

2.2:滑动窗口限流

2.3:漏桶限流

2.4:令牌桶限流

3:实现分布式限流:Redis

3.1:引入Redisson的依赖包

3.2:初始化Redisson

3.3:创建Redisson的限流类 


1:如何实现分布式限流

1:把统计用户的使用频率等这些数据放到一个集中的存储,比如redis,这样无论用户的请求落在了哪台服务器,都以集中存储的数据为准。(Redis)

2:限流的几种类别 

2.1:固定窗口限流

单位时间内,允许部分操作。 1小时,只允许10个用户操作。

优点:最简单

缺点:可能出现流量突刺

eg:前59分钟,第59分钟来了十个操作。第一小时01分钟又来了十个操作,就可能导致流量突刺,相当于2分钟实现了20个操作。

2.2:滑动窗口限流

单位时间内,允许部分操作,但是这个时间是滑动的  需要指定滑动单位

滑动单位: 1min

开始前:

0s  1h 2h

一分钟:

1min 1h1min

优点;能够解决上面流量突刺的问题,第59分钟,限流窗口59min到1h59min,这个时间段内接受10次请求,只要在这个窗口内,更多的操作就会被拒绝。

缺点:实现相对复杂。滑动单位越小,限效果越好。

2.3:漏桶限流

以固定的速率请求,当请求桶满后,拒绝请求。

每秒处理10个请求,桶的容量是10,每0.1秒处理1次请求(固定的),如果1秒内,来了10个都可以处理完,但如果一秒内来了11个请求,最后那个请求就会被拒绝。

优点:能够一定程度上应对流量突刺,能够以固定的速率处理请求,安全性高

缺点:速度是固定的,没有办法处理一批请求,只能一个一个来

2.4:令牌桶限流

管理员先生成一批令牌,每秒生成10个令牌,当用户操作前,先去拿到令牌,有令牌的人可以先执行,都能够同时执行。

优点:能够并发处理同时的请求,并发性高

缺点:时间单位选取的问题。

 以上漏桶限流和令牌桶限流最常用。

3:实现分布式限流:Redis

3.1:引入Redisson的依赖包

  <dependency>
            <groupId>org.redisson</groupId>
            <artifactId>redisson</artifactId>
            <version>3.17.5</version>
   </dependency>

3.2:初始化Redisson

@Configuration
@ConfigurationProperties(prefix = "spring.redis")

public class RedissonConfig {
    private Integer database;
    private String host;
    private String port;
    @Bean
    public RedissonClient getRedissonClient(){
        //配置Redis的配置类
        Config config=new Config();
        config.useSingleServer()
                .setDatabase(database)
                .setAddress("redis://"+host+":"+port);
        RedissonClient redisson= Redisson.create(config);
        return redisson;

    }
}

 

3.3:创建Redisson的限流类 

@Service
public class RedisLimiterManage {
    @Autowired
    private RedissonClient redissonClient;
    //key:区分不同的限流器:不同的用户id
    public void doRateLimit(String key){

        RRateLimiter rateLimiter=redissonClient.getRateLimiter(key);
        //将所有用户的访问次数放在同一个限流器上,1秒允许两次
        rateLimiter.trySetRate(RateType.OVERALL,2,1, RateIntervalUnit.SECONDS);
        //每当一个用户来了之后,请求一个令牌
        boolean result = rateLimiter.tryAcquire(1);
        if(!result){
            throw new BusinessException(ErrorCode.NO_AUTH_ERROR,"请求过于频繁");
        }
    }
}

当我们使用分布式限流Redis的时候,只需要让这个RedisLimiterManage调用doRateLimit方法,就可以进行分布式限流的操作。

 @Autowired
 private RedisLimiterManage redisLimiterManage;
//引入依赖

 //进行限流判断
        redisLimiterManage.doRateLimit("genChartByAi_"+user.getId());
 //每个用户的限流器

 

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

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

相关文章

Springcloud介绍

1.基本介绍 Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发&#xff0c;如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等&#xff0c;都可以用Spring Boot的开发风格做到一键启动和部署。Spring …

欧拉图和哈密顿图

欧拉图 在连通图G中&#xff0c;经过G的每条边一次且仅一次的通路&#xff0c;称为欧拉通路若欧拉通路为回路&#xff0c;则称为欧拉回路含有欧拉回路的图称为欧拉图有欧拉通路则G可以一笔画出有欧拉回路则G是连通的且无奇点&#xff08;欧拉图无奇点&#xff09; 哈密顿图 …

2023了,是时候使用pnpm了!

2023了&#xff0c;是时候使用pnpm了&#xff01; Excerpt 2023了&#xff0c;是时候使用pnpm了&#xff01; 什么是pnpm pnpm代表performant npm&#xff08;高性能的npm&#xff09;&#xff0c;同npm和Yarn&#xff0c;都属于Javascript包管理安装工具&#xff0c;它较npm和…

树与二叉树(考研版)

文章目录 树与二叉树树的基本概念结点、树属性的描述树的性质 二叉树的概念二叉树的性质二叉树的构建二叉树的遍历先序遍历中序遍历后序遍历层次遍历 递归算法和非递归算法的转换源代码 线索二叉树二叉树的线索化线索二叉树 找前驱/后继 树和森林树的存储 树与二叉树的应用哈夫…

交换机基础(四):MSTP负载均衡配置案例

如图所示是某个企业内部核心网络的结构图&#xff0c;目前企业中有20个VLAN, 编号为VLAN1&#xff5e;VLAN20, 为了确保内部网络的可靠性&#xff0c;使用 了冗余链路和MSTP 协议。为了能更好地利用网络资源和带宽&#xff0c;现管理员希望通过配置MSTP 的负载均衡实现网络带宽…

【proteus】8086 写一个汇编程序并调试

参考书籍&#xff1a;微机原理与接口技术——基于8086和Proteus仿真&#xff08;第3版&#xff09;p103-105&#xff0c;p119-122. 参考程序是p70&#xff0c;例4-1 在上一篇的基础上&#xff1a; 创建项目和汇编文件 写一个汇编程序并编译 双击8086的元件图&#xff1a; …

2.1 向量与线性方程组

一、行图像与列图像 线性代数的中心问题是求解线性方程组。线性的意思是这些方程的未知数是一次的&#xff0c;即每个未知数只会乘数字&#xff0c;而不会出现 x x x 与 y y y 相乘的项。下面是一个由两个未知数组成的方程组&#xff1a; 两个方程 两个未知数 { x − 2 y 1…

Django学习笔记——文件上传(界面还怪好看得嘞)

定义文件上传函数 #文件上页面 def uploadFileIndex(request):return render(request, "uploadFile.html")#文件上传接口 def uploadFile(request):if request.method POST and request.FILES[file]:uploaded_file request.FILES[file]fs FileSystemStorage()# 选…

螺旋矩阵[中等]

优质博文&#xff1a;IT-BLOG-CN 一、题目 给你一个m行n列的矩阵matrix&#xff0c;请按照顺时针螺旋顺序&#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5] 示例 2&#xf…

vue如何使用冻结对象提升代码效率及其原理解析

先给大家伙整个实际工作中一定会碰到的问题 如下vue dome ,它的代码非常简单功能也1非常简单,就是一个按钮,点击后会显示有多少条数据 来看看源码, html部分就是一个按钮绑定了一个loadData事件,然后在p标签内展示了这个myData这个数据的长度 <template><div id&quo…

Txt病毒

一.txt病毒原理 利用翻转字符串的方法 混淆伪装 &#xff08;jpg 、doc、ppt 等&#xff09; &#xff08;1&#xff09;更改程序图标 &#xff08;2&#xff09;将程序重命名 readtxt.exe 鼠标放到 read 与 txt 中间 设置格式为 RLO // 这个“RLO”是一个转义字符&#xf…

交互式 Web 应用 0 基础入门

初探 Gradio&#xff1a;轻松构建交互式 Web 应用 文章目录 初探 Gradio&#xff1a;轻松构建交互式 Web 应用Why Gradio?安装 Gradio创建交互式界面1. gr.Interface2. gr.Blocks 强大的组件库输入输出组件控制组件布局组件 示例交互式数据可视化多组件同时&#xff08;嵌套&a…

Netty框架详解

一、Netty简介 Netty是一款基于Java NIO的网络编程、高性能、异步事件驱动的网络应用框架。它的设计目标是提供简单易用、高性能、可扩展的网络编程框架。 二、Netty主要特点 高并发&#xff1a;Netty使用异步的、非阻塞的I/O模型&#xff0c;通过事件驱动的方式处理网络操作…

回归预测 | MATLAB实现BO-LSTM贝叶斯优化长短期神经网络多输入单输出回归预测

回归预测 | MATLAB实现BO-LSTM贝叶斯优化长短期神经网络多输入单输出回归预测 目录 回归预测 | MATLAB实现BO-LSTM贝叶斯优化长短期神经网络多输入单输出回归预测效果一览基本介绍模型搭建程序设计参考资料 效果一览 基本介绍 MATLAB实现BO-LSTM贝叶斯优化长短期神经网络多输入…

潮流玩具演绎城市文化,泡泡玛特入选2023“上海礼物”

每一座城市都有其独特的文化氛围和历史背景&#xff0c;“城市礼物”承载着地域特色、文化内涵和人文精神&#xff0c;不断复制和传递着城市文化。近年来&#xff0c;上海市文旅局会同有关各方&#xff0c;从旅游商品的研发设计、品牌塑造、展售渠道等方面&#xff0c;创建“上…

【软件教程】如何用C++交叉编译出能在Android运行的ELF程序或so动态库

一、配置NDK交叉编译平台 1. 打开Android的官方ndk下载链接https://developer.android.com/ndk/downloads?hlzh-cn&#xff0c;下载windows 64位ndk环境包。 2. 解压后将具有以下文件的路径加入到系统环境变量。 3. 配置好环境变量&#xff0c;如下图所示&#xff0c;Path中存…

mysql 数据库 表结构生成word文档

1、背景 我们在做项目时&#xff0c;表设计文档都是非常重要的&#xff0c;可以让开发人员快速了解表与业务的关系、表之间的关系。 产品在不停迭代的过程中&#xff0c;表的结构也会有相应的变化&#xff0c;我们需要将变化更新的表设计文档中。以前我们是人工方式更新文档&…

C++ 虚函数详解:多态性实现原理及其在面向对象编程中的应用

在面向对象的编程中&#xff0c;多态性是一个非常重要的概念。多态性意味着在不同的上下文中使用同一对象时&#xff0c;可以产生不同的行为。C是一种面向对象的编程语言&#xff0c;在C中&#xff0c;虚函数是实现多态性的关键 什么是虚函数 虚函数是一个在基类中声明的函数&…

基于SpringBoot的时间管理系统

基于SpringBoot的时间管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatis工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 登录界面 管理员界面 用户界面 摘要 基于Spring Boot的时间管理系统是一款功能丰富…

【Redis安装】Ubuntu和Centos

此处安装的是 Redis5 在 Ubuntu 系统上 切换到 root 用户下&#xff0c;su 命令切换使用 apt 可以搜索 redis 相关软件包 apt search redis使用 apt 命令安装 redis apt install redis手动修改配置文件 redis.conf cd /etc/redis/ vim redis.conf修改以下两处 重启服务器 …