最近做的砍价活动的项目马上上线了 ,之前提出的是不限制用户的砍价次数,但是后面又说要改成限制次数。。。。。
需求就是每个商品的砍价数次做限制,后台可以限制用户每天的砍价次数。意思就是属于该活动的订单,每个好友过来帮你砍价,需要限制每日最大的次数(之前没有限制)。所以想到用redis ,redis 里面有键值可以设置过期时间,感觉很好用,直接上代码了:
- 首先,因为是限制用户一天的砍价次数,所以首先就要先获取今天的结束的时间戳:
$t = time();//当前的时间戳 $end = mktime(23,59,59,date("m",$t),date("d",$t),date("Y",$t));//当天的结束时间戳 $d =$this->timediff($t,$end);//计算当前时间距离当天结束的时间还剩几秒 function timediff($begin_time,$end_time){ if($begin_time < $end_time){ $starttime = $begin_time; $endtime = $end_time; }else{ $starttime = $end_time; $endtime = $begin_time; } //计算天数 $timediff = $endtime-$starttime; $days = intval($timediff/86400); //计算小时数 $remain = $timediff%86400; $hours = intval($remain/3600); //计算分钟数 $remain = $remain%3600; $mins = intval($remain/60); //计算秒数 $secs = $remain%60; //$res = array("day" => $days,"hour" => $hours,"min" => $mins,"sec" => $secs); $s= ($hours*3600)+($mins*60)+$secs; return $s; }
- 由于redis 键过期时间是以秒为单位的(可能我的redis版本比较低 2.6之后好像是已毫秒为单位),所以第一步我要先获取结束的秒数 。在这步就要写入了键值了:
$friend_name = $this->deploy['prefix'].'fried_order'.$order_id.'-'.$member_id;//这边命名的方式用到订单的ID,和用户的ID,来保证该键的唯一性 $this->redis->set($friend_name,'1',$d);//这一步就写入redis中了 $d是过期的秒数,第一步就已经有算出来了。
- 这步就是处理砍价的业务逻辑了:
$friend = $this->redis->get($friend_name);//去redis缓存中查询,有没有这个键 if($friend){ //如果有这个键判断里面的值是不是大于我们后台限制的次数 if($friend<500){ //假如小于限定值,说明用户当天砍价次数没有超出 $this->redis->incrBy($friend_name,1);//在原先砍价的次数加一次 }else{ //已经超出,就不让用户砍价了 直接给他错误信息让他明天来 } }else{ //这个键值不存在 说明可能已经过期了 或者用户是第一次砍价 所以redis 没有记录那就要重写redis $this->redis->set($friend_name,'1',$d); }
- 以上就是通过redis 限制用户每日的砍价操作 。