php+redis限制短信頻繁發送

一、規則限制

一天內最多發送25條,1小時內最多發送5條

二、實現思路

1、將手機號作爲鍵
2、將每一次發送短信的時間戳依次存進該鍵的值中
3、取出鍵中的值並遍歷,查詢每個值是否在一天內和一小時內的區間裏

三、代碼實現

		//獲取當前小時內開始的時間戳
		$start_hour = strtotime(date("Y-m-d H:00:00"));
		//獲取當前小時內結束的時間戳
		$end_hour = date(("Y-m-d H:59:59"));
		//獲取今天開始的時間戳
		$beginToday=mktime(0,0,0,date('m'),date('d'),date('Y'));
		//獲取今天結束的時間戳
		$endToday=mktime(0,0,0,date('m'),date('d')+1,date('Y'))-1;
		
        $redis = new \Redis();
        $redis->connect('127.0.0.1', 6379);
        //判斷該鍵是否存在
		if($redis->exists($mobile)){
			//獲取該鍵的數組值
			$arr = $redis->lrange($mobile, 0, -1);
			if($arr){
				$i=0;
				$j=0;
				foreach ($arr as $k => $v) {
					//查詢一小時內發送短信的次數
					if ($v>=$start_hour&&$v<=$end_hour) {
						$i++;
					}
					//查詢一天內發送短信的次數
					if($v>=$beginToday&&$v<=$endToday){
						$j++;
					}
				}
				//判斷一小時內的發送短信次數是否超過5次
				if($i>5){
					$json=array('status'=>1000,'msg'=>'發送短信頻繁,請稍後重試');
            		exit(json_encode($json));
				}
				//判斷一天內的短信發送次數是否超過25次
				if($j>25){
					$json=array('status'=>1000,'msg'=>'發送短信頻繁,請稍後重試');
            		exit(json_encode($json));
				}
				//將本次發送時間存入
				$redis->rpush($mobile,time());
			}
		}else{
			//如果不存在  則把當前時間內存入時間戳,並繼續向下執行,發送短信
			$redis->rpush($mobile, time());
		}
發佈了330 篇原創文章 · 獲贊 111 · 訪問量 48萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章