redis限制验证码发送次数和间隔

2020-11-16  本文已影响0人  江河湖海琴瑟琵琶

要求.
每个手机号每天最多发送10条验证码
每两条验证码间隔需要大于60秒
思路.
调用发送验证码接口时,以前缀+当前日期+手机号 为键.
sendVerify:20201014:18920144444
值需要记录上次发送的时间和发送次数
[ 'recently_send_time'=>time(), 'send_time'=>1 ]
并设置过期时间24小时


    /**
     * 是否拦截短信发送,基于redis实现
     * @param $tel string 手机号
     * @param $max int 每天发送次数
     * @param $interval int 发送间隔s
     *
     * @return bool|string
     */
    private function isInterceptSend($tel,$max,$interval){
        $date = date('Ymd',time());
        $REDIS_KEY = "sendVerify:$date:$tel";
        $REDIS_VALUE = S($REDIS_KEY);

        //第一次,保存发送时间和发送次数
        if (!$REDIS_VALUE)
        {
            S($REDIS_KEY,['recently_send_time'=>time(),'send_times'=>1],24*3600);
            return false;
        }

        //判断两次发送时间间隔
        if( time() - $REDIS_VALUE['recently_send_time'] < $interval )
        {
            return "发送间隔$interval 秒";
        }

        //判断发送次数
        if ( $REDIS_VALUE['send_times'] >= $max )
        {
            return "验证码发送次数过多";
        }

        //更新发送时间,次数+1,(重新设置过期时间,否则会变成永不失效)
        S($REDIS_KEY,['recently_send_time'=>time(),'send_times'=> ($REDIS_VALUE['send_times'] + 1)],24*3600);
        return false;
    }
上一篇 下一篇

猜你喜欢

热点阅读