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

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

demo

  1. public function SpeedCounter()
  2. {
  3. $redis = new \Redis();
  4. $redis->connect('127.0.0.1', 6379);
  5. // 最大请求数量
  6. $maxCount = 100;
  7. //每分钟内,一个用户只能访问10次
  8. $interval =60;
  9. //请求总数量
  10. $zcount = $redis->incr('zcont');
  11. //判断是否超过最大值
  12. if ($zcount<=$maxCount) {
  13. //业务处理
  14. $user = [
  15. 11,21,31,41,51,61
  16. ];
  17. foreach ($user as $val) {
  18. $key = $val;
  19. $check = $redis->exists($key);
  20. if ($check) {
  21. $sum = $redis->incr($key);
  22. if ($sum<=5){
  23. //业务处理
  24. echo "每个用户在规定的时间内只能访问5次 $sum";
  25. } else {
  26. echo "你已经购买过 $sum";
  27. }
  28. } else {
  29. //print_r($redis->get($key)) ;
  30. ///请购买
  31. echo "请购买";
  32. $sum = $redis->incr($key);
  33. $redis->Expire($key,$interval);
  34. }
  35. }
  36. } else {
  37. //超过请求数量
  38. $redis->Expire('zcont',$interval);
  39. echo '超出请求'.$zcount;
  40. }
  1. 漏桶算法

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

  1. /**
  2. * **漏桶的大小是固定的,处理速度也是固定的,但是请求的速率的不固定的。在突发的情况下,会丢弃很多请求。**
  3. */
  4. function LeackBucket() {
  5. $redis = new \Redis();
  6. $redis->connect('127.0.0.1', 6379);
  7. //桶的容量
  8. $maxCount = 1000;
  9. //时间
  10. $interval = 10;
  11. //每分钟流出的数量
  12. $speed = 20;
  13. //用户
  14. $time = $redis->time();
  15. $key = $time[0].$time[1];
  16. //时间判断
  17. //$redis->del('outCount');
  18. $check = $redis->exists('outCount');
  19. // echo $check;
  20. if ($check){
  21. //出桶的速率的请求数量
  22. $outCount = $redis->incr('outCount');
  23. if ($outCount<=$speed){
  24. //业务处理
  25. echo "规定的时间内只能访问20次 $outCount";
  26. } else {
  27. echo "你已经超过每分钟的访问 $outCount";
  28. }
  29. } else {
  30. $outCount = $redis->incr('outCount');
  31. // echo $outCount;
  32. $redis->Expire('outCount',$interval);
  33. echo "时间过了";exit;
  34. }
  35. }
  1. 令牌桶
    令牌桶算法(Token Bucket)和 Leaky Bucket 效果一样但方向相反的算法,更加容易理解.随着时间流逝,系统会按恒定1/QPS时间间隔(如果QPS=100,则间隔是10ms)往桶里加入Token(想象和漏洞漏水相反,有个水龙头在不断的加水),如果桶已经满了就不再加了.新请求来临时,会各自拿走一个Token,如果没有Token可拿了就阻塞或者拒绝服务.

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

  1. /**
  2. * 令牌
  3. */
  4. function TrafficShaper(){
  5. $redis = new \Redis();
  6. $redis->pconnect('127.0.0.1', 6379);
  7. //桶的容量
  8. $maxCount = 10;
  9. //当前容量
  10. $curnum = $maxCount-$redis->get('token')-1;
  11. echo $curnum;
  12. if ($curnum>0){
  13. //业务逻辑
  14. //成功后
  15. $token = $redis->incr('token');
  16. echo "===$token";
  17. } else {
  18. echo "没有令牌了";
  19. $redis->set('token',0);
  20. }
  21. }

php 基于redis使用令牌桶算法 计数器 漏桶算法 实现流量控制的更多相关文章

  1. coding++:RateLimiter 限流算法之漏桶算法、令牌桶算法--简介

    RateLimiter是Guava的concurrent包下的一个用于限制访问频率的类 <dependency> <groupId>com.google.guava</g ...

  2. 基于redis实现的四种常见的限流策略

    引言 在web开发中功能是基石,除了功能以外运维和防护就是重头菜了.因为在网站运行期间可能会因为突然的访问量导致业务异常.也有可能遭受别人恶意攻击 所以我们的接口需要对流量进行限制.俗称的QPS也是对 ...

  3. ASP.NET Core中使用漏桶算法限流

    漏桶算法是限流的四大主流算法之一,其应用场景各种资料中介绍的不多,一般都是说应用在网络流量控制中.这里举两个例子: 1.目前家庭上网都会限制一个固定的带宽,比如100M.200M等,一栋楼有很多的用户 ...

  4. 漏桶、令牌桶限流的Go语言实现

    限流 限流又称为流量控制(流控),通常是指限制到达系统的并发请求数. 我们生活中也会经常遇到限流的场景,比如:某景区限制每日进入景区的游客数量为8万人:沙河地铁站早高峰通过站外排队逐一放行的方式限制同 ...

  5. Sentinel限流之快速失败和漏桶算法

    距离上次总结Sentinel的滑动窗口算法已经有些时间了,原本想着一口气将它的core模块全部总结完,但是中间一懒就又松懈下来了,这几天在工作之余又重新整理了一下,在这里做一个学习总结. 上篇滑动窗口 ...

  6. 使用Redis实现令牌桶算法

    在限流算法中有一种令牌桶算法,该算法可以应对短暂的突发流量,这对于现实环境中流量不怎么均匀的情况特别有用,不会频繁的触发限流,对调用方比较友好. 例如,当前限制10qps,大多数情况下不会超过此数量, ...

  7. 基于Redis的分布式锁和Redlock算法

    1 前言 前面写了4篇Redis底层实现和工程架构相关文章,感兴趣的读者可以回顾一下: Redis面试热点之底层实现篇-1 Redis面试热点之底层实现篇-2 Redis面试热点之工程架构篇-1 Re ...

  8. php 基于redis计数器类

    本文引自网络 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. 本文将使用其incr(自增),get(获取), ...

  9. 身为一枚优秀的程序员必备的基于Redis的分布式锁和Redlock算法

    1 前言 今天开始来和大家一起学习一下Redis实际应用篇,会写几个Redis的常见应用. 在我看来Redis最为典型的应用就是作为分布式缓存系统,其他的一些应用本质上并不是杀手锏功能,是基于Redi ...

随机推荐

  1. python基础之包、模块、命名空间和作用域

    一.模块介绍 模块就是一组功能的集合体,我们的程序可以导入模块来复用模块里的功能. 模块的作用: (1)从文件级别组织程序,更方便管理:随着程序的发展,功能越来越多,为了方便管理,我们通常将程序分成一 ...

  2. 端口映射(socket应用)

    # coding=gb2312 import sys import time import socket import thread import subprocess ############### ...

  3. 抓住异步编程async/await语法糖的牛鼻子: SynchronizationContext

    长话短说,本文带大家抓住异步编程async/await语法糖的牛鼻子: SynchronizationContext 引言 C#异步编程语法糖async/await,使开发者很容易就能编写异步代码. ...

  4. .NET平台系列15 .NET5的吊炸天性能改进

    系列目录     [已更新最新开发文章,点击查看详细] .NET5的性能改进测试功能 Benchmark.NET现在是衡量.NET代码性能的规范工具,可轻松分析代码段的吞吐量和分配. .NET5的性能 ...

  5. Django学习之完成数据库主从复制、读写分离和一主多从情况下的使用办法

    1.首先配置多个数据库,在settings配置文件中配置以下内容: DATABASES = { 'default': { #默认数据库,配置多个mysql数据也是ok的,混用数据库也是ok的 'ENG ...

  6. 异步编程CompletableFuture

    多线程优化性能,串行操作并行化 串行操作 // 以下2个都是耗时操作 doBizA(); doBizB(); 修改变为并行化 new Thread(() -> doBizA()).start() ...

  7. 2.5D Visual Sound:CVPR2019论文解析

    2.5D Visual Sound:CVPR2019论文解析 论文链接: http://openaccess.thecvf.com/content_CVPR_2019/papers/Gao_2.5D_ ...

  8. gst-crypto GStreamer插件

    gst-crypto GStreamer插件 内容 1. gst-crypto概述 1.1gst-crypto GStreamer插件功能 1.2用例范例 2. GStreamer插件支持 3. 在本 ...

  9. JS设置GridView中的RadioButton只能选中一个

    //JS&JQuery $(document).ready(function () { //点击跳转链接返回浏览器历史的上一个页面 $("#btnBack").click( ...

  10. 三、使用sudo分配管理权限

    使用sudo分配管理权限 su命令 su -  [账户名称]     :切换到用户,不加用户名默认切换到root su -  [账户名称]  -c  '命令'   :以xx用户身份执行命令,注意命令需 ...