通常在高并发和大流量的情况下,一般限流是必须的。为了保证服务器正常的压力。那我们就聊一下几种限流的算法。

计数器

计数器是一种最常用的一种方法,在一段时间间隔内,处理请求的数量固定的,超的就不做处理。

demo

public function SpeedCounter()

{

$redis = new \Redis();

$redis->connect('127.0.0.1', 6379);

// 最大请求数量

$maxCount = 100;

//每分钟内,一个用户只能访问10次

$interval =60;

//请求总数量

$zcount = $redis->incr('zcont');

//判断是否超过最大值

if ($zcount<=$maxCount) {

//业务处理

$user = [

11,21,31,41,51,61

];

foreach ($user as $val) {

$key = $val;

$check = $redis->exists($key);

if ($check) {

$sum = $redis->incr($key);

if ($sum<=5){

//业务处理

echo "每个用户在规定的时间内只能访问5次 $sum";

} else {

echo "你已经购买过 $sum";

}

} else {

//print_r($redis->get($key)) ;

///请购买

echo "请购买";

$sum = $redis->incr($key);

$redis->Expire($key,$interval);

}

}

} else {

//超过请求数量

$redis->Expire('zcont',$interval);

echo '超出请求'.$zcount;

}

漏桶算法

漏桶的大小是固定的,处理速度也是固定的,但是请求的速率的不固定的。在突发的情况下,会丢弃很多请求。

/**

* **漏桶的大小是固定的,处理速度也是固定的,但是请求的速率的不固定的。在突发的情况下,会丢弃很多请求。**

*/

function LeackBucket() {

$redis = new \Redis();

$redis->connect('127.0.0.1', 6379);

//桶的容量

$maxCount = 1000;

//时间

$interval = 10;

//每分钟流出的数量

$speed = 20;

//用户

$time = $redis->time();

$key = $time[0].$time[1];

//时间判断

//$redis->del('outCount');

$check = $redis->exists('outCount');

// echo $check;

if ($check){

//出桶的速率的请求数量

$outCount = $redis->incr('outCount');

if ($outCount<=$speed){

//业务处理

echo "规定的时间内只能访问20次 $outCount";

} else {

echo "你已经超过每分钟的访问 $outCount";

}

} else {

$outCount = $redis->incr('outCount');

// echo $outCount;

$redis->Expire('outCount',$interval);

echo "时间过了";exit;

}

}

令牌桶

令牌桶算法(Token Bucket)和 Leaky Bucket 效果一样但方向相反的算法,更加容易理解.随着时间流逝,系统会按恒定1/QPS时间间隔(如果QPS=100,则间隔是10ms)往桶里加入Token(想象和漏洞漏水相反,有个水龙头在不断的加水),如果桶已经满了就不再加了.新请求来临时,会各自拿走一个Token,如果没有Token可拿了就阻塞或者拒绝服务.

令牌桶的另外一个好处是可以方便的改变速度. 一旦需要提高速率,则按需提高放入桶中的令牌的速率. 一般会定时(比如100毫秒)往桶中增加一定数量的令牌, 有些变种算法则实时的计算应该增加的令牌的数量.

/**

* 令牌

*/

function TrafficShaper(){

$redis = new \Redis();

$redis->pconnect('127.0.0.1', 6379);

//桶的容量

$maxCount = 10;

//当前容量

$curnum = $maxCount-$redis->get('token')-1;

echo $curnum;

if ($curnum>0){

//业务逻辑

//成功后

$token = $redis->incr('token');

echo "===$token";

} else {

echo "没有令牌了";

$redis->set('token',0);

}

}

令牌桶算法PHP简单实现,php 基于redis使用令牌桶算法 计数器 漏桶算法 实现流量控制...相关推荐

  1. 什么是限流?为什么会限流呢?常见的限流算法【固定窗口限流、滑动窗口限流、漏桶限流、令牌桶限流】是什么呢?

    什么是限流?为什么会限流呢?常见的限流算法[固定窗口限流.滑动窗口限流.漏桶限流.令牌桶限流]是什么呢? 什么是限流? 为什么会限流? 1. 固定窗口限流算法 1.1 什么是固定窗口限流算法 1.2 ...

  2. 令牌桶算法和漏桶算法有什么区别_高并发之限流,到底限的什么鬼 (精品长文)...

    你可能知道高并发系统需要限流这个东西,但具体是限制的什么,该如何去做,还是模凌两可.我们接下来系统性的给它归个小类,希望对你有所帮助. google guava中提供了一个限流实现: RateLimi ...

  3. 高并发系统限流-漏桶算法和令牌桶算法

    参考: https://www.cnblogs.com/xuwc/p/9123078.html http://www.cnblogs.com/LBSer/p/4083131.html https:// ...

  4. 高可用系统设计 | 分布式限流策略:计数器算法、漏桶算法、令牌桶算法

    文章目录 限流 什么是限流? 分布式限流 限流算法 计数器算法 固定窗口计数器 滑动窗口计数器 漏桶算法 令牌桶算法 限流 什么是限流? 限流可以认为服务降级的一种,限流就是限制系统的输入和输出流量已 ...

  5. 限流-漏桶算法、令牌桶算法

    1.问题 系统的某个接口访问量突然激增,没多久接口崩溃,形成连锁反应,导致整个系统崩溃. 如何应对这种情况呢? 为我们的接口加上"保险丝",预防这种突发情况,接口压力过大,造成整个 ...

  6. 限流的4种策略--固定窗口、滑动窗口、漏桶、令牌桶

    01 Why 分布式系统中,由于接口API无法控制上游调用方的行为,因此当瞬时请求量突增时,会导致服务器占用过多资源,发生响应速度降低.超时.乃至宕机,甚至引发雪崩造成整个系统不可用. 限流,Rate ...

  7. 基于Redis的分布式限流详解

    前言 Redis除了能用作缓存外,还有很多其他用途,比如分布式锁,分布式限流,分布式唯一主键等,本文将和大家分享下基于Redis分布式限流的各种实现方案. 一.为什么需要限流 用最简单的话来说:外部请 ...

  8. SpringBoot基于guava集成令牌桶算法

    SpringBoot基于guava集成令牌桶算法 一.什么是令牌桶 1.令牌桶 2.功能图 二.Guava 1.简单介绍 2.pom引入 3.限速器 4.浅析重载方法 三.系统应用 1.单个接口应用 ...

  9. 简单介绍4种限流算法!(固定窗口计数器算法、滑动窗口计数器算法、漏桶算法、令牌桶算法)...

    作者:架构小菜 链接:https://www.jianshu.com/p/7987bf427b5b 简单介绍 4 种非常好理解并且容易实现的限流算法! 一.固定窗口计数器算法 规定我们单位时间处理的请 ...

最新文章

  1. 如何看待年仅28岁却亿万身家的码农郭宇宣布从字节跳动退休?
  2. 基于 WPF 模块化架构下的本地化设计实践
  3. 标准库类型String
  4. 从拉格朗日乘子法到SVM
  5. 【离散数学】集合的划分与覆盖
  6. OpenJudge NOI 1.16 08:石头剪刀布
  7. STM32F405 标准库 SHT20温湿度传感器
  8. 网页中加载flash的方法
  9. eml文件可以转换为html,eml格式转换成word eml文件转换word
  10. lisp绘制直齿圆柱齿轮_直齿圆柱齿轮的知识及其画法
  11. freyja 将引入“分组”概念进一步提高维护缓存时的效率
  12. 湛江景点旅游攻略!究竟有哪些你不容错过的景点?
  13. ECNUOJ 2616 游黄山
  14. 微信小程序注册完整教程
  15. NAS自回血方案介绍
  16. python unit test什么意思_Pycharm上python和unittest两种姿势傻傻分不清楚
  17. Mybatis-plus的自动填充功能
  18. 按键判断之GetKeyState 和 GetAsyncKeyState 区别
  19. 容器性能测验 调研报告
  20. 全套C C++ 编程视频课程收录

热门文章

  1. php超小免杀大马_php最新php大马免杀过狗最小1kB吗?
  2. flash制作图文教程!!!
  3. Lucene之中文庖丁解牛(mmseg)分词器-yellowcong
  4. 第一章、计算机基础知识(全部内容阅读版)
  5. 明解C语言入门篇_第5章_数组
  6. 源码分析 Sentinel 实时数据采集实现原理
  7. 实时监听文本框输入 oninput、onchange与onpropertychange事件的用法和区别
  8. MATLAB——FFT(快速傅里叶变换)
  9. 一种高分辨率高灵敏度的巨磁阻抗效应非晶丝微磁传感器研制
  10. MT7688学习笔记(1)——搭建环境、编译烧写