zoukankan      html  css  js  c++  java
  • 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
    版权声明:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请保留以上作者信息和原文链接。
  • 相关阅读:
    上传项目到github上
    app widget设置bitmap时,无作用
    Android Studio 启动app 白屏
    android sqlite 数据库中使用的类型
    android 解决华为系列手机调试时不能打印Logcat日志信息
    android 自定义滚动条图标
    检测邮箱
    js检测是否存在中文
    表单的checkbox选中和取消
    javascript
  • 原文地址:https://www.cnblogs.com/chengfengchi/p/15190457.html
Copyright © 2011-2022 走看看