php+redis秒杀

啥都不说了,看代码

前台:

<input type="hidden" id="start" value="<?php date_default_timezone_set(‘PRC‘);echo  strtotime(date(‘Y-m-d H:i:s‘))-strtotime($goods[‘start_time‘]);?>"><input type="hidden" id="end" value="<?php date_default_timezone_set(‘PRC‘);echo strtotime(date(‘Y-m-d H:i:s‘))-strtotime($goods[‘end_time‘])?>" >
<script type="text/javascript">   //判断时间        var start = document.getElementById("start").value;        var end = document.getElementById("end").value;      if(start>=0 && end<0)      {         timer(end*-1);      }

function timer(intDiff) {        window.setInterval(function () {            var day = 0,                hour = 0,                minute = 0,                second = 0; //时间默认值            if (intDiff > 0) {                day = Math.floor(intDiff / (60 * 60 * 24));                hour = Math.floor(intDiff / (60 * 60)) - (day * 24);                minute = Math.floor(intDiff / 60) - (day * 24 * 60) - (hour * 60);                second = Math.floor(intDiff) - (day * 24 * 60 * 60) - (hour * 60 * 60) - (minute * 60);            }            if (minute <= 9) minute = ‘0‘ + minute;            if (second <= 9) second = ‘0‘ + second;            $(‘#t_d‘).html(day + "天");            $(‘#t_h‘).html(‘<s id="h"></s>‘ + hour + ‘时‘);            $(‘#t_m‘).html(‘<s></s>‘ + minute + ‘分‘);            $(‘#t_s‘).html(‘<s></s>‘ + second + ‘秒‘);            intDiff--;        }, 1000);    }

function GetRTime(end){

var EndTime= new Date(end);        var NowTime = new Date();        var t =EndTime.getTime() - NowTime.getTime();        var d=0;        var h=0;        var m=0;        var s=0;        if(t>=0){            d=Math.floor(t/1000/60/60/24);            h=Math.floor(t/1000/60/60%24);            m=Math.floor(t/1000/60%60);            s=Math.floor(t/1000%60);        }

document.getElementById("t_d").innerHTML = d + "天";        document.getElementById("t_h").innerHTML = h + "时";        document.getElementById("t_m").innerHTML = m + "分";        document.getElementById("t_s").innerHTML = s + "秒";    }   $(function () {        $(".ms").click(function () {            var id = $(this).attr("ids");            $.ajax({                type: "get",                url: "?r=ms/buyms",                data: {id:id},            dataType:"json",                success: function(msg){                    alert(msg[‘message‘])                }            });        })    })</script>
 

后台:

<?phpnamespace frontend\controllers;

use think\image\Exception;use Yii;use yii\web\Controller;

/** * Site controller */class MsController extends Controller{    public $layout = false;

/**     * 商品只能购买一件商品   商品ID、当前用户ID、商品数量,存入redis,     * 通知当前用户,秒杀成功,或失败     * 并将redis的商品库存队列 递减     *     */    public function actionBuyms(){        date_default_timezone_set(‘PRC‘);//      接受商品ID  ajax传来的id//      $goods_id = yii::$app->request->get(‘goods_id‘);        $goods_id=1;//      当前登录用户ID        $user_id = 1;//      当前时间        $date = date(‘Y-m-d H:i:s‘);//      首先判断开始时间是否到//      在队列查询开始时间        $start_time = Yii::$app->redis->get(‘start_time‘.$goods_id);        if(empty($start_time)||$start_time>$date){            echo json_encode(array(‘code‘=>1002,‘message‘=>‘秒杀时间还未开始‘));exit;        }//      判断结束时间是否到        $end_time  = Yii::$app->redis->get(‘end_time‘.$goods_id);        if(empty($end_time)||$date>=$end_time){            echo json_encode(array(‘code‘=>1002,‘message‘=>‘秒杀已经结束了‘));exit;        }        //取出储存在redis里的库存       $num = Yii::$app->redis->get(‘num‘.$goods_id);        if($num<=0){            echo json_encode(array(‘code‘=>1001,‘message‘=>‘已被抢空了...请等待下次抢购‘));exit;        }else{            $msg = json_encode([‘user_id‘=>1,‘goods_id‘=>1,‘buy_num‘=>$goods_id]);            //更新库存  decr递减            $u=Yii::$app->redis->decr(‘num‘.$goods_id);            if($u)            {                //储存用户信息到用户的队列   秒杀人员的总队列                Yii::$app->redis->lpush(‘yes_buy‘,$msg);                echo json_encode(array(‘code‘=>1000,‘message‘=>‘抢购成功,稍后为您出单,预计时间3分钟‘));            }        }    }    /**     * @return string     *     * 生成订单为定时任务     在服务器每两分钟执行一次,等待1分钟     */    /**     * 设置初始值,理论上,应为后台管理员手动设定秒杀商品     *     *     * 模拟给予   开始时间、结束时间、库存在redis储存的值     */    public function actionSetbuyuser(){        //默认开始时间为    2017-03-28 00:00:00        $start_time = ‘2017-03-28 00:00:00‘;        //默认结束时间为    2017-03-28 00:00:00        $end_time = ‘2017-03-28 24:00:00‘;        //默认库存为1        $num = 10;        //商品id   为了区分商品信息、库存   不会打乱各个商品信息        $goods_id = 1;        //设置库存        Yii::$app->redis->set(‘num‘.$goods_id,$num);        //设置当前商品的开始时间        Yii::$app->redis->set(‘start_time‘.$goods_id,$start_time);        //设置当前商品的结束时间        Yii::$app->redis->set(‘end_time‘.$goods_id,$end_time);    }}
时间: 2024-10-18 19:31:49

php+redis秒杀的相关文章

解决redis秒杀超卖的问题

我们再使用redis做秒杀程序的时候,解决超卖问题,是重中之重.以下是一个思路. 用上述思路去做的话,我们再用户点击秒杀的时候,只需要检测,kucun_count中是否能pop出数据,如果能pop出来则证明还有库存,且秒杀成功.而且pop是原子性的,即使很高的并发, 同时有很多用户访问,也是排队一个一个解决(并行转串行). 这样的话,就解决了超卖的问题.至于存入磁盘,我的上一篇文章中有介绍.有需要的朋友可以去看. 这是一个思路,具体的秒杀程序应该还有很多细节需要完善,但是核心问题已经解决了哈.

秒杀架构

前言:秒杀系统相信很多人见过,比如京东或者淘宝的秒杀,小米手机的秒杀,那么秒杀系统的后台是如何实现的呢?我们如何设计一个秒杀系统呢?对于秒杀系统应该考虑哪些问题?如何设计出健壮的秒杀系统?本期我们就来探讨一下这个问题: 博客的目录 一:秒杀系统应该考虑的问题 二:秒杀系统的设计和技术方案 三:系统架构图 四:总结 一:秒杀应该考虑哪些问题 1.1:超卖问题 分析秒杀的业务场景,最重要的有一点就是超卖问题,假如备货只有100个,但是最终超卖了200,一般来讲秒杀系统的价格都比较低,如果超卖将严重影

苹果手机那里找115网盘资源

在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈.博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你. 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积.不断沉淀.不断总结.善于传达自己的个人见解以及乐于分享的过程. 文章目录

php结合redis实现高并发下的抢购、秒杀功能

原文: http://blog.csdn.net/nuli888/article/details/51865401 抢购.秒杀是如今很常见的一个应用场景,主要需要解决的问题有两个:1 高并发对数据库产生的压力2 竞争状态下如何解决库存的正确减少("超卖"问题)对于第一个问题,已经很容易想到用缓存来处理抢购,避免直接操作数据库,例如使用Redis.重点在于第二个问题 常规写法: 查询出对应商品的库存,看是否大于0,然后执行生成订单等操作,但是在判断库存是否大于0处,如果在高并发下就会有问

redis使用watch完成秒杀抢购功能(转)

redis使用watch完成秒杀抢购功能: 使用redis中两个key完成秒杀抢购功能,mywatchkey用于存储抢购数量和mywatchlist用户存储抢购列表. 它的优点如下: 1. 首先选用内存数据库来抢购速度极快. 2. 速度快并发自然没不是问题. 3. 使用悲观锁,会迅速增加系统资源. 4. 比队列强的多,队列会使你的内存数据库资源瞬间爆棚. 5. 使用乐观锁,达到综合需求. 我觉得以下代码肯定是你想要的. [php] view plain copy print? <?php hea

.NetCore+Jexus代理+Redis模拟秒杀商品活动

开篇叙 本篇将和大家分享一下秒杀商品活动架构,采用的架构方案正如标题名称.NetCore+Jexus代理+Redis,由于精力有限所以这里只设计到商品添加,抢购,订单查询,处理队列抢购订单的功能:有不足或者不够详细的还请见谅,顺手点个推荐也不错: a. 秒杀流程 b. 封装StackExchange.Redis的使用类 c. Ubuntu16.04上使用Jexus搭建代理完成分布式部署 d. NetCore写实时监控队列服务 秒杀架构设计图︿( ̄︶ ̄)︿三幅 1. 一般业务性架构 2. 后端分布

使用redis实现简单的秒杀

自己做的简单秒杀  感觉思路是没太大问题的  但是代码写的不是很好  做个记录方便以后回来嘲讽下自己 <?phpnamespace frontend\controllers; use Yii;use frontend\models\Goods;use frontend\models\Order;use yii\web\Controller; define('chenggong',1);define('yishouwan',4);define('weidenglu',5); class Secki

php+redis实现电商秒杀功能

这一次总结和分享用Redis实现分布式锁来完成电商的秒杀功能.先扯点个人观点,之前我看了一篇博文说博客园的文章大部分都是分享代码,博文里强调说分享思路比分享代码更重要(貌似大概是这个意思,若有误请谅解),但我觉得,分享思路固然重要,但有了思路,却没有实现的代码,那会让人觉得很浮夸的,在工作中的程序猿都知道,你去实现一个功能模块,一段代码,虽然你有了思路,但是实现的过程也是很耗时的,特别是代码调试,还有各种测试等等.所以我认为,思路+代码,才是一篇好博文的主要核心. 直接进入主题. 一.前言 双十

thinkphp+redis实现秒杀功能

1,安装redis,根据自己的php版本安装对应的redis扩展(此步骤简单的描述一下) 1.1,安装 php_igbinary.dll,php_redis.dll扩展此处需要注意你的php版本如图: 1.2,php.ini文件新增 extension=php_igbinary.dll;extension=php_redis.dll两处扩展 ok此处已经完成第一步redis环境搭建完成看看phpinfo 2,项目中实际使用redis 2.1,第一步配置redis参数如下,redis安装的默认端口