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

摘要:
//一天的结束时间戳$d=$this->//计算从当前时间到一天结束的时间差函数timediff($begin_time;$end_time){if($begin _time<$endtime=$end_ttime;$endtime=$begin_time;$days=intval($timediff/86400);

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

需求就是每个商品的砍价数次做限制,后台可以限制用户每天的砍价次数。意思就是属于该活动的订单,每个好友过来帮你砍价,需要限制每日最大的次数(之前没有限制)。所以想到用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  限制用户每日的砍价操作 。

免责声明:文章转载自《php 结合redis 限制用户每日砍价次数》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇##Jquery基础(一)构建安全的数据访问SQL 注入(三)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【安全】CSRF、XSS攻击了解与防范

============================== 目录   一、了解CSRF攻击及防范   二、了解XSS攻击及防范 =============================== 一、了解CSRF攻击及防范 1、了解csrf   中文叫跨站请求伪造,指攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求。利用受害者在被攻击...

element的form表单中如何一行显示多el-form-item标签

效果图: HTML代码: <script src="//unpkg.com/vue/dist/vue.js"></script> <script src="//unpkg.com/element-ui@2.4.3/lib/index.js"></script> <div i...

随机数的深究

几乎所有编程语言中都提供了"生成一个随机数"的方法,也就是调用这个方法会生成一个数,我们事先也不知道它生成什么数。比如在.Net中编写下面的代码: Random rand = newRandom(); Console.WriteLine(rand.Next()); 运行后结果如下:     Next()方法用来返回一个随机数。同样的代码你执行和我...

QT MSVC中文编译出错error: C2001: 常量中有换行符 --- 解决方案

前言 这个问题一直存在,以前是妥协,现在实在是忍不了,不解决,强迫症都要犯了,于是百度了一下,看到有一篇文章是这样解决的,于是亲测,确实有效果,记录如下 正文 QT上用MSVC去编译部分含有中文的字符串时会出现编译错误 error: C2001: 常量中有换行符 ,但用MinGW就不会。需在后面加个正常的字符才能正常编译,但出现 了。其编码如下图,明...

Wireshark——过滤器

一、捕获过滤器 选中捕获选项后,就会弹出下面这个框,在红色输入框中就可以编写过滤规则。 1)捕获单个IP地址 2)捕获IP地址范围 3)捕获广播或多播地址 4)捕获MAC地址 5)捕获所有端口号 6)捕获特定ICMP数据 当网络中出现性能或安全问题时,将会看到ICMP(互联网控制消息协议)。 在这种情况下,用户必须使用一个偏移量表示一个ICMP...

homebrew &amp;amp; brew cask使用技巧及Mac软件安装

homebrew 安装 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 命令 安装软件:brew install 软件名,例:brew install wget 搜索软件:brew search 软件名...