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 基于redis使用令牌桶算法 计数器 漏桶算法 实现流量控制的更多相关文章
- coding++:RateLimiter 限流算法之漏桶算法、令牌桶算法--简介
		
RateLimiter是Guava的concurrent包下的一个用于限制访问频率的类 <dependency> <groupId>com.google.guava</g ...
 - 基于redis实现的四种常见的限流策略
		
引言 在web开发中功能是基石,除了功能以外运维和防护就是重头菜了.因为在网站运行期间可能会因为突然的访问量导致业务异常.也有可能遭受别人恶意攻击 所以我们的接口需要对流量进行限制.俗称的QPS也是对 ...
 - ASP.NET Core中使用漏桶算法限流
		
漏桶算法是限流的四大主流算法之一,其应用场景各种资料中介绍的不多,一般都是说应用在网络流量控制中.这里举两个例子: 1.目前家庭上网都会限制一个固定的带宽,比如100M.200M等,一栋楼有很多的用户 ...
 - 漏桶、令牌桶限流的Go语言实现
		
限流 限流又称为流量控制(流控),通常是指限制到达系统的并发请求数. 我们生活中也会经常遇到限流的场景,比如:某景区限制每日进入景区的游客数量为8万人:沙河地铁站早高峰通过站外排队逐一放行的方式限制同 ...
 - Sentinel限流之快速失败和漏桶算法
		
距离上次总结Sentinel的滑动窗口算法已经有些时间了,原本想着一口气将它的core模块全部总结完,但是中间一懒就又松懈下来了,这几天在工作之余又重新整理了一下,在这里做一个学习总结. 上篇滑动窗口 ...
 - 使用Redis实现令牌桶算法
		
在限流算法中有一种令牌桶算法,该算法可以应对短暂的突发流量,这对于现实环境中流量不怎么均匀的情况特别有用,不会频繁的触发限流,对调用方比较友好. 例如,当前限制10qps,大多数情况下不会超过此数量, ...
 - 基于Redis的分布式锁和Redlock算法
		
1 前言 前面写了4篇Redis底层实现和工程架构相关文章,感兴趣的读者可以回顾一下: Redis面试热点之底层实现篇-1 Redis面试热点之底层实现篇-2 Redis面试热点之工程架构篇-1 Re ...
 - php 基于redis计数器类
		
本文引自网络 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. 本文将使用其incr(自增),get(获取), ...
 - 身为一枚优秀的程序员必备的基于Redis的分布式锁和Redlock算法
		
1 前言 今天开始来和大家一起学习一下Redis实际应用篇,会写几个Redis的常见应用. 在我看来Redis最为典型的应用就是作为分布式缓存系统,其他的一些应用本质上并不是杀手锏功能,是基于Redi ...
 
随机推荐
- Mybatis Mapper 映射文件(xxxMapper.xml)
			
什么是 Mapper 映射文件 Mapper 映射文件是 Mybatis 用于实现 ORM 映射规则的配置文件,Mybatis 通过映射文件可将数据库查询结构映射为 Java 对象. 创建 Mappe ...
 - 第7讲 | ICMP与ping:投石问路的侦察兵
			
第7讲 | ICMP与ping:投石问路的侦察兵 ping 是基于 ICMP 协议工作的.ICMP 全称 Internet Control Message Protocol,就是互联网控制报文协议. ...
 - 20192113 2020-2021-2 《Python程序设计》实验三报告
			
20192113 2020-2021-2 <Python程序设计>实验三报告 课程:<Python程序设计> 班级: 1921 姓名: 衣丽莎 学号:20192113 实验教师 ...
 - Linux资源监控工具 glances
			
使用资源监控工具 glances 前言 glances 可以为 Unix 和 Linux 性能专家提供监视和分析性能数据的功能,其中包括: CPU 使用率 内存使用情况 内核统计信息和运行队列信息 磁 ...
 - spring IOC DI AOP MVC 事务, mybatis 源码解读
			
demo https://gitee.com/easybao/aop.git spring DI运行时序 AbstractApplicationContext类的 refresh()方法 1: pre ...
 - NX二次开发-将3X3矩阵修正为正交且长度为单位长度的矩阵
			
函数:UF_MTX3_ortho_normalize() 函数说明:将矩阵修正为正交且xyz长度为单位长度的矩阵.下图中输入的矩阵为三条线段的端点,经过修正后,生成一个坐标系. 1 #include ...
 - 会点自动化就要25k?   现在年轻人这么浮躁吗
			
面试中一问元素定位就对答如流.一问实际项目框架如何搭建就避重就轻.含糊其辞,这样的自动化实战能力也能拿25K?静待下文: 一.为什么现在自动化测试工资那么高呢? 结合现在的职场环境与企业用人需求,自动 ...
 - 谷歌:python速成课程笔记
			
1.从用户那里获取信息 name = "Alex" print("hello" + name) 2.让python成为你的计算器 1 print(4+5) 2 ...
 - spring boot 并发请求,其他系统接口,丢失request的header信息【多线程、线程池、@Async 】
			
场景:一次迭代在灰度环境发版时,测试反馈说我开发的那个功能,查询接口有部分字段数据是空的,后续排查日志,发现日志如下: feign.RetryableException: cannot retry d ...
 - 面试官:如何在分布式场景下生成全局唯一 ID?
			
在分布式系统中,有一些场景需要使用全局唯一 ID ,可以和业务场景有关,比如支付流水号,也可以和业务场景无关,比如分库分表后需要有一个全局唯一 ID,或者用作事务版本号.分布式链路追踪等等,好的全局唯 ...