令牌桶算法PHP简单实现,php 基于redis使用令牌桶算法 计数器 漏桶算法 实现流量控制...
通常在高并发和大流量的情况下,一般限流是必须的。为了保证服务器正常的压力。那我们就聊一下几种限流的算法。
计数器
计数器是一种最常用的一种方法,在一段时间间隔内,处理请求的数量固定的,超的就不做处理。
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.2 ...
- 令牌桶算法和漏桶算法有什么区别_高并发之限流,到底限的什么鬼 (精品长文)...
你可能知道高并发系统需要限流这个东西,但具体是限制的什么,该如何去做,还是模凌两可.我们接下来系统性的给它归个小类,希望对你有所帮助. google guava中提供了一个限流实现: RateLimi ...
- 高并发系统限流-漏桶算法和令牌桶算法
参考: https://www.cnblogs.com/xuwc/p/9123078.html http://www.cnblogs.com/LBSer/p/4083131.html https:// ...
- 高可用系统设计 | 分布式限流策略:计数器算法、漏桶算法、令牌桶算法
文章目录 限流 什么是限流? 分布式限流 限流算法 计数器算法 固定窗口计数器 滑动窗口计数器 漏桶算法 令牌桶算法 限流 什么是限流? 限流可以认为服务降级的一种,限流就是限制系统的输入和输出流量已 ...
- 限流-漏桶算法、令牌桶算法
1.问题 系统的某个接口访问量突然激增,没多久接口崩溃,形成连锁反应,导致整个系统崩溃. 如何应对这种情况呢? 为我们的接口加上"保险丝",预防这种突发情况,接口压力过大,造成整个 ...
- 限流的4种策略--固定窗口、滑动窗口、漏桶、令牌桶
01 Why 分布式系统中,由于接口API无法控制上游调用方的行为,因此当瞬时请求量突增时,会导致服务器占用过多资源,发生响应速度降低.超时.乃至宕机,甚至引发雪崩造成整个系统不可用. 限流,Rate ...
- 基于Redis的分布式限流详解
前言 Redis除了能用作缓存外,还有很多其他用途,比如分布式锁,分布式限流,分布式唯一主键等,本文将和大家分享下基于Redis分布式限流的各种实现方案. 一.为什么需要限流 用最简单的话来说:外部请 ...
- SpringBoot基于guava集成令牌桶算法
SpringBoot基于guava集成令牌桶算法 一.什么是令牌桶 1.令牌桶 2.功能图 二.Guava 1.简单介绍 2.pom引入 3.限速器 4.浅析重载方法 三.系统应用 1.单个接口应用 ...
- 简单介绍4种限流算法!(固定窗口计数器算法、滑动窗口计数器算法、漏桶算法、令牌桶算法)...
作者:架构小菜 链接:https://www.jianshu.com/p/7987bf427b5b 简单介绍 4 种非常好理解并且容易实现的限流算法! 一.固定窗口计数器算法 规定我们单位时间处理的请 ...
最新文章
- 如何看待年仅28岁却亿万身家的码农郭宇宣布从字节跳动退休?
- 基于 WPF 模块化架构下的本地化设计实践
- 标准库类型String
- 从拉格朗日乘子法到SVM
- 【离散数学】集合的划分与覆盖
- OpenJudge NOI 1.16 08:石头剪刀布
- STM32F405 标准库 SHT20温湿度传感器
- 网页中加载flash的方法
- eml文件可以转换为html,eml格式转换成word eml文件转换word
- lisp绘制直齿圆柱齿轮_直齿圆柱齿轮的知识及其画法
- freyja 将引入“分组”概念进一步提高维护缓存时的效率
- 湛江景点旅游攻略!究竟有哪些你不容错过的景点?
- ECNUOJ 2616 游黄山
- 微信小程序注册完整教程
- NAS自回血方案介绍
- python unit test什么意思_Pycharm上python和unittest两种姿势傻傻分不清楚
- Mybatis-plus的自动填充功能
- 按键判断之GetKeyState 和 GetAsyncKeyState 区别
- 容器性能测验 调研报告
- 全套C C++ 编程视频课程收录
热门文章
- php超小免杀大马_php最新php大马免杀过狗最小1kB吗?
- flash制作图文教程!!!
- Lucene之中文庖丁解牛(mmseg)分词器-yellowcong
- 第一章、计算机基础知识(全部内容阅读版)
- 明解C语言入门篇_第5章_数组
- 源码分析 Sentinel 实时数据采集实现原理
- 实时监听文本框输入 oninput、onchange与onpropertychange事件的用法和区别
- MATLAB——FFT(快速傅里叶变换)
- 一种高分辨率高灵敏度的巨磁阻抗效应非晶丝微磁传感器研制
- MT7688学习笔记(1)——搭建环境、编译烧写