php 结合redis 限制用户每日砍价次数

最近做的砍价活动的项目马上上线了 ,之前提出的是不限制用户的砍价次数,但是后面又说要改成限制次数。。。。。

需求就是每个商品的砍价数次做限制,后台可以限制用户每天的砍价次数。意思就是属于该活动的订单,每个好友过来帮你砍价,需要限制每日最大的次数(之前没有限制)。所以想到用redis ,redis 里面有键值可以设置过期时间,感觉很好用,直接上代码了:

  1. 首先,因为是限制用户一天的砍价次数,所以首先就要先获取今天的结束的时间戳:
    $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;
        }

     

  2. 由于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是过期的秒数,第一步就已经有算出来了。

     

  3. 这步就是处理砍价的业务逻辑了:
    $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);
    
    }

     

  4. 以上就是通过redis  限制用户每日的砍价操作 。
posted @ 2017-09-12 15:08  还好l  阅读(922)  评论(0编辑  收藏  举报