最近做的砍价活动的项目马上上线了 ,之前提出的是不限制用户的砍价次数,但是后面又说要改成限制次数。。。。。
需求就是每个商品的砍价数次做限制,后台可以限制用户每天的砍价次数。意思就是属于该活动的订单,每个好友过来帮你砍价,需要限制每日最大的次数(之前没有限制)。所以想到用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 限制用户每日的砍价操作 。
|
请发表评论