• PHP+Redis解决实际问题一:订单限流


    <?php
    
        /**
         * 是否允许放行
         * @param string $key       redis键前缀
         * @param int $timeInterval 时间间隔(秒)
         * @param int $max          时间间隔内最大放行数
         * @return bool             是否放行
         * @throws Exception
         * @example
         * <pre>
         * //每秒放行一个
         * isAllow('my_allow');
         *
         * //每秒放行3个
         * isAllow('my_allow',1,3);
         *
         * //每3秒放行2个
         * isAllow('my_allow',3,2);
         */
        function isAllow(string $key, int $timeInterval=1, int $max=1):bool{
            if($timeInterval<1){
                throw new Exception('时间间隔必须大于0');
            }
            if($max<1){
                throw new Exception('最大放行数必须大于0');
            }
    
            $redis=new Redis();
            $redis->connect('127.0.0.1');
            if(!$redis->isConnected()){
                throw new Exception('Redis服务连接失败');
            }
    
            //对时间戳取模,使得每$timeInterval秒取得同一个时间戳
            $time=time();
            $key.=':'.($time-($time%$timeInterval));
    
            //自增并返回自增后的结果
            $index=$redis->incr($key);
    
            //如果是第一个访问,设置键的过期时间
            if($index===1){
                $redis->expire($key,$timeInterval+1);
            }
    
            return $index<$max+1;
        }
    
    ————————————————
    原文作者:renxiaotu
    转自链接:https://learnku.com/articles/60146
    版权声明:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请保留以上作者信息和原文链接。
  • 相关阅读:
    SSH隧道,解决MySQL访问时,报Access denied for user 'xxx'@'localhost'的错误
    Linux(debianxfce) 输入法
    getopt函数
    【分布式事务】
    记录chrome中cookies设置的一个问题
    antdv 表格table中customRender
    OAuth2.0及token刷新流程
    笔记草稿
    Openvas QoD 说明
    elementaryos6.1stable.20211218rc.iso 下载磁链
  • 原文地址:https://www.cnblogs.com/chengfengchi/p/15190457.html
Copyright © 2020-2023  润新知