zoukankan      html  css  js  c++  java
  • 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  限制用户每日的砍价操作 。
    各位多多指教!
  • 相关阅读:
    pytest: error: unrecognized arguments: --html=report.html
    运行pytest报错“PytestUnknownMarkWarning: Unknown pytest.mark.***
    SQL启动代理服务-自动备份的前提
    SQL Server数据库每日自动备份作业操作步骤(转载)
    c#播放声音文件(转载)
    使用Office组件导出Excel表格
    四舍五入保留小数问题
    List数据集按对象某个属性排序
    C# 创建Windows Service(Windows服务)程序
    WebService下实现大数据量的传输(转载)
  • 原文地址:https://www.cnblogs.com/lixiaoquan/p/7510260.html
Copyright © 2011-2022 走看看