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

news/2024/4/28 10:17:45/文章来源:https://blog.csdn.net/weixin_34080571/article/details/88755563
最近写了一个限流的插件,所以避免不了的接触到了一些限流算法。本篇文章就来分析一下这几种常见的限流算法

分析之前

依我个人的理解来说限流的话应该灵活到可以针对每一个接口来做。比如说一个类里面有5个接口,那么我的限流插件就应该能针对每一个接口就行不同的限流方案。所以呢,既然针对的每个接口所以就需要一个可以唯一标示这个接口的key(我取的是类名+方法名+入参)。分布式限流强烈推荐使用redis+lua或者nginx+lua来实现。

这里用2个限流条件来做示例讲一下常见的限流算法:1.  接口1它10秒钟最大允许访问100次2.  接口2它10秒钟最大允许每个人访问100次。

计数器算法

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

核心思想

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

1.接口(key)
2.时间单位(expire)
3.允许访问多少次(limit)
4.访问次数(value)

条件一

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

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

if(存在key){value--;if(value<=0){不能访问}}else{添加key,设置value为limit}

线程二:

while(过去interval时间){所有key的value-step}

条件二

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

算法升级

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

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)(参照漏桶算法需要注意的点)

条件一

线程一:

if(存在key){value++;if(value>=limit){不能访问}}else{添加key,设置value为limit}

线程二:

while(过去interval时间){所有key的value+step}

条件二

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

算法升级

参考漏桶算法升级实现。

代码

代码实现请参考我的限流组件 https://github.com/2388386839...

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

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

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

相关文章

网站搭建 (第17天) Celery定时刷新缓存

一、前言 当网站使用redis缓存时&#xff0c;就会涉及到缓存的过期时间&#xff0c;redis数据库中的内容就会消失。这个时候进行用户操作又会变慢&#xff0c;所以要采用一种办法&#xff0c;当缓存刚好要过期时&#xff0c;能够使得redis数据库自动对缓存内容进行更新。这个办…

修复网站漏洞对phpmyadmin防止被入侵提权的解决办法

2019独角兽企业重金招聘Python工程师标准>>> phpmyadmin是很多网站用来管理数据库的一个系统&#xff0c;尤其是mysql数据库管理的较多一些&#xff0c;最近phpmysql爆出漏洞&#xff0c;尤其是弱口令&#xff0c;sql注入漏洞&#xff0c;都会导致mysql的数据账号密…

动态加载图片网站爬虫基本操作

1判断动态加载 检查流程如下&#xff1a; 1.1 浏览器检查&#xff0c;观察network->XHR&#xff0c;确定是否是动态页面&#xff08;如果随着下拉页面&#xff0c;项目不断增加就说明是动态页面&#xff09;。 1.2. 确定是动态页面以后&#xff0c;观察任意几个请求项目&…

大型网站技术架构(五)网站高可用架构

2019独角兽企业重金招聘Python工程师标准>>> 网站的可用性&#xff08;Avaliability&#xff09;描述网站可有效访问的特性。 1、网站可用性的度量与考核 网站不可用时间&#xff08;故障时间&#xff09;故障修复时间点-故障发现&#xff08;报告&#xff09;时间点…

Apache配置多个网站的方法

Apache的虚拟主机是一种允许在同一台机器上&#xff0c;运行超过一个网站的解决方案。虚拟主机有两种&#xff0c;一种叫基于IP的&#xff08;IP-based&#xff09;&#xff0c;另一种叫基于名字的&#xff08;name-based&#xff09;。虚拟主机的存在&#xff0c;对用户来说是…

能够支持python开发的环境_百度排名:做SEO不能靠猜,需要观察数据的本质

很多人学会了一些SEO的常识&#xff0c;就觉得自己已经学会了SEO了&#xff0c;能够给很多网站提供意见&#xff0c;但是其实他们提出的意见&#xff0c;很多时候都是靠猜&#xff0c;靠感觉。至于实际上有没有效果&#xff0c;会不会给网站带来正面的影响&#xff0c;只能走一…

centos 设置本地域名_详解如何让自己的网站/APP/应用支持IPV6访问,从域名解析配置到服务器配置详细步骤完整。...

详解如何让自己的网站/APP/应用支持IPV6访问&#xff0c;从域名解析配置到服务器配置详细步骤完整。感谢阅读&#xff0c;本文依然和一颗优雅草科技毫无关系且不代表且不代表其观点和立场&#xff0c;由伊凡撰写&#xff0c;如有转载请注明来源&#xff0c;码字不易&#xff0c…

夺命雷公狗ThinkPHP项目之----企业网站1之快速搭建后台

我们还是老规矩照老方法&#xff0c;将框架里面多余的东西都干掉&#xff0c;然后在index.php里面将框架搭建起来 <?php//定义项目目录define(APP_PATH,./WEB/);//开启调试define(APP_DEBUG,True);//包含thinkphp项目入口文件require "Thinkphp/Thinkphp.php"; 然…

php5.4安装手册,网站新手指南:Win2003+Apache2.2.22+PHP5.4安装配置教程

网站新手指南&#xff1a;Win2003Apache2.2.22PHP5.4安装配置教程作者&#xff1a;迅美网 发布日期&#xff1a;2012/12/15 21:14:48 浏览次数&#xff1a;4705 复制服务器环境:Windows2003Apache2.2.22PHP5.4MySql5.5所需软件包:1)httpd-2.2.22-win32-x86-openssl-0.9.8t.zip2…

买网站服务器需要什么软件有哪些东西,建网站的软件有哪些,哪些常用?

建网站必须的不仅是专用软件&#xff0c;也要申请注册域名&#xff0c;购买网络服务器(或云虚拟主机)&#xff0c;随后在网络服务器内构建网站。下面我们就来说说建网站的软件有哪些&#xff0c;哪些常用。1、DreamweaverDreamweaver集网页页面bai制做和管理方法网站建站于一身…

vs2015发布网站至azure web应用服务

进入www.azure.cn管理门户 1&#xff0c;左下角新建web应用&#xff0c;实例如下&#xff0c;url设置为demo(有防止重名判断) 2&#xff0c;进入demo配置页&#xff08;左侧web应用下点击demo&#xff09; 3&#xff0c;demo首页&#xff0c;下载配置文件 4&#xff0c;进入vs2…

rmse多少算效果好_关键词SEO优化带来流量有多少?如何做SEO优化效果好?

随着行业之间的竞争激烈&#xff0c;企业为了获得更多的利润空间&#xff0c;都是以用户的使用体验为前提&#xff0c;争取能获得更多的收益。然而&#xff0c;网站优化的目的就是能满足用户的搜索习惯&#xff0c;让用户能通过关键词找到自己心仪的产品&#xff0c;让企业获得…

服务器网站拒绝显示此网页,iis 网站拒绝显示此网页

iis 网站拒绝显示此网页 内容精选换一换Web基础防护开启后&#xff0c;可防范SQL注入、XSS跨站脚本、远程溢出攻击、文件包含、Bash漏洞攻击、远程命令执行、目录遍历、敏感文件访问、命令/代码注入等常规的Web攻击&#xff0c;以及可支持Webshell检测、深度反逃逸检测等Web基础…

PHP建站通过服务器架构及实战的方法

PHP的环境搭建 PHP的帮助使用和配置文件 PHP的Hello World PHP的库函数调用 PHP的Web程序 PHP的函数和面向对象使用 PHP的数据库访问 Nginx安装和配置访问 WordPress的安装和配置实用 推进资料&#xff1a;图书&#xff0c;视频&#xff0c;代码等 总述 PHP基础环境准备 安装虚…

黑帽seo 模板生成php,2020最新黑帽SEO技术中排名稳定方法,万能采集模板CMS

我计划在3个月内建30个网站&#xff0c;所有30个网站都需要使用旧域名&#xff0c;因为旧域名在建网站时更有优势。事实上&#xff0c;30个网站是不需要的&#xff0c;但黑帽技术有点冒险&#xff0c;所以第一个挂第二个&#xff0c;第二个挂第三个&#xff0c;如果做得好&…

百度seo排名规则_网址命名规则,如何有利于百度收录与SEO排名?

根据以往的SEO工作经验&#xff0c;另搜索引擎头痛的问题&#xff0c;往往是来自过于复杂的网址结构&#xff0c;它让SEO的效果大打折扣&#xff0c;往往事倍功半。当你试图运营一个站点的时候&#xff0c;合理的设计网址结构&#xff0c;看起来十分重要&#xff0c;为此&#…

python最新官网图片_初学Python-只需4步,爬取网站图片

很多人学习Python很重要的一个原因是&#xff0c;可以很简单的把一个网站的数据爬下来。 尤其是做我们这一行&#xff0c;产品经理&#xff0c;电商行业。 领导&#xff1a;弄一个买卖游戏周边商品的交易APP出来。我&#xff1a;行&#xff0c;那我们卖什么呀&#xff1f;领导&…

dnf压爆服务器挑战网站,dnf手游压爆服务器挑战在哪里?地下城与勇士压爆挑战体验时间介绍[多图]...

dnf手游压爆服务器挑战是前两天很多玩家都在讨论的一个招募&#xff0c;关于这个招募小编这里也要给大家分享一些信息&#xff0c;招募之后的体验时间相信各位也都想要知道&#xff0c;那么下面就让小编给大家介绍一下吧&#xff0c;感兴趣的都可以来看看。dnf手游压爆服务器挑…

新闻网站项目静态页面--首页

外联CSS index.css: .ui.red.basic.segment.topmenu{height: 100px;padding-left:140px;padding-right: 140px;border-bottom: 1px solid rgb(189, 189, 189); } .ui.borderless.menu.container > .item > a{color: black;font-weight: bold; } .ui.horizontal.basic.seg…

百度seo排名规则_百度SEO排名优化哪家好?做SEO优化网站安全吗?

在竞争日益激烈的互联网平台中&#xff0c;每个企业都会使用有效的方法来优化网站&#xff0c;让自己的网站成为同行中的佼佼者&#xff0c;提升自己的知名度及影响力。然而&#xff0c;做SEO优化不像建站&#xff0c;可以随便找个模版套用就行&#xff0c;而是需要找专业的百度…