iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >大型网站限流算法的实现和改造
  • 833
分享到

大型网站限流算法的实现和改造

2023-06-05 05:06:42 833人浏览 安东尼
摘要

最近写了一个限流的插件,所以避免不了的接触到了一些限流算法。本篇文章就来分析一下这几种常见的限流算法分析之前依我个人的理解来说限流的话应该灵活到可以针对每一个接口来做。比如说一个类里面有5个接口,那么我的限流插件就应该能针对每一个接口就行不

最近写了一个限流的插件,所以避免不了的接触到了一些限流算法。本篇文章就来分析一下这几种常见的限流算法

分析之前

  1. 依我个人的理解来说限流的话应该灵活到可以针对每一个接口来做。比如说一个类里面有5个接口,那么我的限流插件就应该能针对每一个接口就行不同的限流方案。所以呢,既然针对的每个接口所以就需要一个可以唯一标示这个接口的key(我取的是类名+方法名+入参)。

  2. 分布式限流强烈推荐使用redis+lua或者Nginx+lua来实现。

  3. 这里用2个限流条件来做示例讲一下常见的限流算法:

    1. 接口1它10秒钟最大允许访问100次

    2. 接口2它10秒钟最大允许每个人访问100次。

计数器算法

这个算法可以说是限流算法中最简单的一种算法了。

核心思想

计数器算法的意思呢就是当接口在一个时间单位中被访问时,我就记下来访问次数,直到它访问的次数到达上限。

涉及变量
  1. 接口(key)

  2. 时间单位(expire)

  3. 允许访问多少次(limit)

  4. 访问次数(value)

条件一

当一个请求过来时,我们就会得到这个key。

1
2
3
4
5
6
7
8
9
if(存在key){
  value++;
  if(value>=limit){
  不能访问
  }
  }else{
  添加key,value为1
      设置key过期时间为expire
  }
条件二

既然条件一已经实现了,那条件二会复杂么 ?

相比于条件一来说就是同一个key对应了多个用户。那么我们只需要把key加上用户的信息就可以了。比如说 key_用户1、key_用户2。

漏桶算法

核心思想

漏桶算法的意思呢就是一个接口在一个时间单位中允许被访问次数是动态变化的(假如一分钟允许访问60次,那么从开始计时时不管有没有被访问第59秒只允许访问59次,30秒只允许30次)。为什么这样呢,因为有另外一个线程在进行递减操作

涉及变量
  1. 接口(key)

  2. 时间单位(expire)

  3. 允许访问多少次(limit)

  4. 递减间隔时间(interval)

  5. 递减步长(step)

  6. 剩余可访问次数(value)

  7. key的访问时间(lastUpdateTime)

  8. 当前时间(nowTime)(注意nowTime的取值应为应用取得的时间而不是Redis或者nginx取得的时间)

条件一

线程一:

1
2
3
4
5
6
7
8
if(存在key){
  value--;
  if(value<=){
  不能访问
  }
  }else{
  添加key,设置value为limit
  }

线程二:

1
2
3
while(过去interval时间){
  所有key的value-step
  }
条件二

参考计数器算法条件二实现。

算法升级

可以看到实现漏桶算法的话需要每隔interval时间都要另外一条线程去遍历所key的value去做递减操作,那么有没有什么办法可以省略这一步呢。答案是肯定有。

1
2
3
4
5
6
7
8
9
10
11
12
13
if(存在key){
  value--;
  if((nowTime-lastUpdateTime)>interval){
  value=value-(nowTime-lastUpdateTime)/interval*step;
      lastUpdateTime=nowTime;
  }
  if(value<=0){
  不能访问
  }
  }else{
  添加key,设置value为limit;
      lastUpdateTime=nowTime;
  }

令牌桶算法

核心思想

令牌桶算法呢,恰恰是和漏桶算法相反的一个算法,不过还是推荐你使用这个。这个算法的原理我不讲,我觉得聪明的你看了伪代码就明白了。

涉及变量
  1. 接口(key)

  2. 时间单位(expire)

  3. 允许访问多少次(limit)

  4. 递增间隔时间(interval)

  5. 递增步长(step)

  6. 当前可访问次数(value)

  7. key的访问时间(lastUpdateTime)

  8. 当前时间(nowTime)(参照漏桶算法需要注意的点)

条件一

线程一:

1
2
3
4
5
6
7
8
if(存在key){
  value++;
  if(value>=limit){
  不能访问
  }
  }else{
  添加key,设置value为limit
  }

线程二:

1
2
3
while(过去interval时间){
  所有key的value+step
  }
条件二

参考计算器算法条件二实现。

算法升级

参考漏桶算法升级实现。

代码

代码实现请参考我的限流框架https://GitHub.com/shiyujun/syj-ratelimit

本文出自Http://zhixiang.org.cn,转载请保留。

--结束END--

本文标题: 大型网站限流算法的实现和改造

本文链接: https://www.lsjlt.com/news/241573.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 大型网站限流算法的实现和改造
    最近写了一个限流的插件,所以避免不了的接触到了一些限流算法。本篇文章就来分析一下这几种常见的限流算法分析之前依我个人的理解来说限流的话应该灵活到可以针对每一个接口来做。比如说一个类里面有5个接口,那么我的限流插件就应该能针对每一个接口就行不...
    99+
    2023-06-05
  • 大型网站正确改版的方法有哪些
    这篇文章主要介绍“大型网站正确改版的方法有哪些”,在日常操作中,相信很多人在大型网站正确改版的方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”大型网站正确改版的方法有哪些”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-10
  • Java常见的限流算法怎么实现
    这篇“Java常见的限流算法怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java常见的限流算法怎么实现”文章吧。为...
    99+
    2023-06-29
  • 四种分布式限流算法和代码实现
    带着问题走近限流为什么要限流呢?就像我上面说的,流量多,的确是一件好事,但是如果过载,把系统打挂了,那大家都要吃席了。没逝吧所以,在各种大促活动之前,要对系统进行压测,评估整个系统的峰值QPS,要做一些限流的设置,超过一定阈值,就拒绝处理或...
    99+
    2023-08-15
  • Golang怎么实现常见的限流算法
    本篇内容介绍了“Golang怎么实现常见的限流算法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!固定窗口每开启一个新的窗口,在窗口时间大小内...
    99+
    2023-07-05
  • Java服务限流算法的6种实现
    目录固定窗口算法滑动窗口算法漏桶算法令牌桶算法中间件限流网关限流总结服务限流,是指通过控制请求的速率或次数来达到保护服务的目的,在微服务中,我们通常会将它和熔断、降级搭配在一起使用,...
    99+
    2023-05-20
    Java服务限流 服务限流
  • Java高并发系统限流算法的实现
    目录1 概述2 计数器限流2.1 概述2.2 实现2.3 结果分析2.4 优缺点2.5 应用3 漏桶算法3.1 概述3.2 实现3.3 结果分析3.4 优缺点4 令牌桶算法4.1 概...
    99+
    2024-04-02
  • Golang实现常见的限流算法的示例代码
    目录固定窗口滑动窗口漏桶算法令牌桶滑动日志总结限流是项目中经常需要使用到的一种工具,一般用于限制用户的请求的频率,也可以避免瞬间流量过大导致系统崩溃,或者稳定消息处理速率 这个文章主...
    99+
    2023-05-14
    Golang常见限流算法 Golang限流算法 Go 限流算法
  • 大型网站的HTTPS实践(一)——HTTPS协议和原理
    前言百度于2015年上线了全站HTTPS的安全搜索,默认会将HTTP请求跳转成HTTPS。从今天开始,我们将会分享多篇系列文章,为大家重点介绍和解析百度的HTTPS最佳实践。HTTPS协议概述HTTPS可以认为是HTTP+TLS。HTTP协...
    99+
    2023-06-03
  • Go+Redis实现常见限流算法的示例代码
    目录固定窗口滑动窗口hash实现list实现漏桶算法令牌桶滑动日志总结限流是项目中经常需要使用到的一种工具,一般用于限制用户的请求的频率,也可以避免瞬间流量过大导致系统崩溃,或者稳定消息处理速率。并且有时候我们还需要使用...
    99+
    2023-04-02
    Go Redis实现限流算法 Go Redis限流算法 Go 限流算法
  • Java常见的限流算法详细分析并实现
    目录为什么要限流限流算法计数器限流漏桶限流令牌桶限流为什么要限流 在保证可用的情况下尽可能多增加进入的人数,其余的人在排队等待,或者返回友好提示,保证里面的进行系统的用户可以正常使用...
    99+
    2024-04-02
  • 算法介绍及实现——基于遗传算法改进的BP神经网络算法(附完整Python实现)
    目录 一、算法介绍 1.1 遗传算法 1.2 为什么要使用遗传算法进行改进 二、算法原理 三、算法实现 3.1 算子选择 3.2 代码实现 一、算法介绍 1.1 遗传算法         遗传算法是受启发于自然界中生物对于自然环境 “...
    99+
    2023-09-04
    神经网络 pytorch
  • web开发中分布式系统中的限流器实现算法怎么用
    本篇文章给大家分享的是有关web开发中分布式系统中的限流器实现算法怎么用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一般限流器有五种算法,分...
    99+
    2024-04-02
  • ASP 同步响应编程算法:您是否知道它对于大型网站的重要性?
    ASP(Active Server Pages)是一种基于服务器端的动态网页技术,它可以让开发者在网页中嵌入动态的内容和交互式元素。ASP 的同步响应编程算法是其核心功能之一,它可以使网站在处理大量请求时更加高效和稳定。本文将详细介绍 A...
    99+
    2023-10-13
    同步 响应 编程算法
  • Python和Apache能否实现更快的大数据编程算法?
    随着数据量的不断增长,越来越多的企业需要处理大数据,但是传统的编程语言处理大数据的速度很慢,难以满足实时处理的需求。Python和Apache是两个备受关注的工具,它们是否能够协同工作来实现更快的大数据编程算法呢?本文将探讨这个问题。 P...
    99+
    2023-08-26
    apache 大数据 编程算法
  • 使用Python实现树的遍历算法和类型的树的遍历
    树遍历意味着访问树中的每个节点。和线性数据结构单一的遍历方式不同,二叉树是分层式数据结构可以以不同的方式遍历。 树遍历结构特点 1、每个树的节点都承载一个数据 2、每个树下都有2个子树 树遍历有三种类型 1、中序遍历 先遍历左子树...
    99+
    2024-01-23
  • 贪心算法之如何实现K次取反后最大化的数组和
    本篇内容主要讲解“贪心算法之如何实现K次取反后最大化的数组和”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“贪心算法之如何实现K次取反后最大化的数组和”吧!很多录...
    99+
    2024-04-02
  • PHP国家历史文物网站的设计与实现 63653 (免费领源码、附论文)可做计算机毕业设计JAVA、PHP、爬虫、APP、小程序、C#、C++、python、数据可视化、大数据、全套文案
     目    录 摘  要 Abstract 第1章  绪论 1 1.1  研究背景 1 1.2  研究现状 1 1.3  系统开发目标 1 第2章  系统开发环境 3 2.1开发技术 2.2 MVVM模式介绍 3 ...
    99+
    2023-10-19
    php 课程设计 java spring boot 爬虫 小程序
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作