令牌桶算法如何使用php实现

令牌桶算法如何使用php实现

php+redis实现令牌桶算法代码:

getRedis($minNumKey, $this->minNum, 60);        $resDay    = $this->getRedis($minNumKey, $this->minNum, 86400);        if (!$resMin['status'] || !$resDay['status']) {            exit($resMin['msg'] . $resDay['msg']);        }    }    public function getRedis($key, $initNum, $expire)    {        $nowtime  = time();        $result   = ['status' => true, 'msg' => ''];        $redisObj = $this->di->get('redis');        $redis->watch($key);        $limitVal = $redis->get($key);        if ($limitVal) {            $limitVal = json_decode($limitVal, true);            $newNum   = min($initNum, ($limitVal['num'] - 1) + (($initNum / $expire) * ($nowtime - $limitVal['time'])));            if ($newNum > 0) {                $redisVal = json_encode(['num' => $newNum, 'time' => time()]);            } else {                return ['status' => false, 'msg' => '当前时刻令牌消耗完!'];            }        } else {            $redisVal = json_encode(['num' => $initNum, 'time' => time()]);        }        $redis->multi();        $redis->set($key, $redisVal);        $rob_result = $redis->exec();        if (!$rob_result) {            $result = ['status' => false, 'msg' => '访问频次过多!'];        }        return $result;    }}

登录后复制

代码要点:

1、首先定义规则

单个用户每分钟访问次数($minNum),单个用户每天总的访问次数($dayNum),接口总的访问次数等不同的规则。

立即学习“PHP免费学习笔记(深入)”;

2、计算速率

该代码示例以秒为最小的时间单位,速率=访问次数/时间($initNum / $expire)

3、每次访问后补充的令牌个数计算方式

获取上次访问的时间即上次存入令牌的时间,计算当前时刻与上次访问的时间差乘以速率就是此次需要补充的令牌个数,注意补充令牌后总的令牌个数不能大于初始化的令牌个数,以补充数和初始化数的最小值为准。

4、程序流程

第一次访问时初始化令牌个数($minNum),存入Redis同时将当前的时间戳存入以便计算下次需要补充的令牌个数。

第二次访问时获取剩余的令牌个数,并添加本次应该补充的令牌个数,补充后如何令牌数>0则当前访问是有效的可以访问,否则令牌使用完毕不可访问。先补充令牌再判断令牌是否>0的原因是由于还有速率这个概念即如果上次剩余的令牌为0但是本次应该补充的令牌>1那么本次依然可以访问。

5、针对并发的处理

使用Redis的乐观锁机制。

更多相关知识,请关注 PHP中文网!!

以上就是令牌桶算法如何使用php实现的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2140553.html

(0)
上一篇 2025年2月25日 02:18:15
下一篇 2025年2月24日 04:33:06

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 在php中处理乱码问题的方法

    在php中处理乱码问题的方法 第一种:解决HTML中中文乱码问题方法 如果你的HTML文件文件出现了乱码问题,那么你可以在head标签里面加入UTF8编码(国际化编码):UTF-8是没有国家的编码,也就是独立于任何一种语言,任何语言都可以使…

    2025年2月25日 编程技术
    200
  • 如何用yum安装php

    使用yum安装php的方法: 1、添加php的yum软件仓库 sudo rpm -Uvh https://mirror.webtatic.com/yum/el6/latest.rpm 登录后复制 2、安装php相关软件,执行过程中全部选择y…

    2025年2月25日
    200
  • php中=表示什么意思

    在 php 中,”=”是基本的赋值运算符。它意味着左操作数被设置为右侧表达式的值。也就是说,”$x = 5″ 的值是 5。 示例如下: 登录后复制 更多相关教程请关注【创想鸟】。 以上就是ph…

    2025年2月25日
    200
  • php中echo输出的汉字显示乱码怎么办

    echo输出的中文显示乱码根本还是编码问题。 一般来说出于编码兼容考虑大多的页面都将页面字符集定义为utf-8 登录后复制 这时候要正常显示中文需要转化一下编码方式,比如 echo iconv(“GB2312″,”UTF-8”,’中文’);…

    2025年2月25日
    200
  • php中双冒号什么意思

    php中双冒号什么意思?  一,当调用静态属性和静态方法时 ::与->的作用相同,只不过使用的对象不一样!::引用类里面的静态方法或者属性,而且不需要实例化! 建立一个类,并且建立一个静态属性$a,一个静态方法b,如下: class …

    2025年2月25日
    200
  • php中如何去除字符串中间的空格

    php中如何去除字符串中间的空格? 第一种:使用正则 代码如下: 立即学习“PHP免费学习笔记(深入)”; 登录后复制 第二种:使用str_replace()函数 代码如下: 立即学习“PHP免费学习笔记(深入)”; 登录后复制 第三种:使…

    2025年2月25日
    200
  • php中strcmp函数用法

    php中strcmp函数用法 strcmp定义和用法 strcmp() 函数比较两个字符串。 注释:strcmp() 函数是二进制安全的,且对大小写敏感。 提示:该函数与 strncmp() 函数类似,不同的是,通过 strncmp() 您…

    2025年2月25日
    200
  • php中的大小写转换函数是什么

    1、将字符串转换成小写 strtolower():该函数将传入的字符串参数所有的字符都转换成小写,并以小写形式返回字符串。 示例: 登录后复制 2、将字符转换成大写 strtoupper():该函数的作用同strtolower函数相反,是将…

    2025年2月25日
    200
  • 怎么判断php是否安装成功

    测试PHP安装是否成功的方法: 1、在PHP安装路径下PHP文件中创建一个名为phpinfo.php的文件,文件内容为: 登录后复制 2、保存好文件,然后在IE中输入http://localhost/phpinfo.php,若安装成功则能看…

    2025年2月25日
    200
  • 如何修改php上传文件大小限制

    首先打开php.ini配置文件 然后进行如下修改 1、upload_max_filesize = 8m; 即允许上传文件大小的最大值 post_max_size = 8m ; 立即学习“PHP免费学习笔记(深入)”; 指通过表单POST给P…

    2025年2月25日 编程技术
    200

发表回复

登录后才能评论