自己的redis秒杀[生成订单入库]

来源:互联网 发布:unity3d 控制人物移动 编辑:程序博客网 时间:2024/06/15 14:19
使用redis队列,因为pop操作是原子的,即使有很多用户同时到达,也是依次执行,推荐使用(mysql事务在高并发下性能下降很厉害,文件锁的方式也是)

1.0 [商品库存]存入redis消息队列

connect('127.0.0.1',6379);//删除 redis队列数据// $redis->delete('goods_store');die;for($i=0;$i<$store;$i++){// echo $i."
"; //商品数量[入队列] $redis->lpush('goods_store',$i+1); } //查询缓存中 商品数量[已入队列]echo $redis->llen('goods_store');?>

2.0 [商品订单核查入库]

connect('127.0.0.1',6379); //Redis[弹出队列] $count = $redis->lpop('goods_store');if(!$count){  // 记录日志    insertLog('error:no store redis');die;  }    //生成订单    $order_sn=build_order_no();  $sql="insert into ih_order(order_sn,user_id,goods_id,sku_id,price)   values('$order_sn','$user_id','$goods_id','$sku_id','$price')";    $order_rs=mysql_query($sql,$conn);     //库存减少  $sql="update ih_store set number=number-{$number} where sku_id='$sku_id'";  $store_rs=mysql_query($sql,$conn);    if(mysql_affected_rows()){    echo "
库存减少成功"; insertLog('库存减少成功'); }else{echo "
库存减少失败"; insertLog('库存减少失败'); } ?>

3.0测试数据库

--  -- 数据库: `big`  --    -- --------------------------------------------------------    --  -- 表的结构 `ih_goods`  --      CREATE TABLE IF NOT EXISTS `ih_goods` (    `goods_id` int(10) unsigned NOT NULL AUTO_INCREMENT,    `cat_id` int(11) NOT NULL,    `goods_name` varchar(255) NOT NULL,    PRIMARY KEY (`goods_id`)  ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;      --  -- 转存表中的数据 `ih_goods`  --      INSERT INTO `ih_goods` (`goods_id`, `cat_id`, `goods_name`) VALUES  (1, 0, '小米手机');    -- --------------------------------------------------------    --  -- 表的结构 `ih_log`  --    CREATE TABLE IF NOT EXISTS `ih_log` (    `id` int(11) NOT NULL AUTO_INCREMENT,    `event` varchar(255) NOT NULL,    `type` tinyint(4) NOT NULL DEFAULT '0',    `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,    PRIMARY KEY (`id`)  ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;    --  -- 转存表中的数据 `ih_log`  --      -- --------------------------------------------------------    --  -- 表的结构 `ih_order`  --    CREATE TABLE IF NOT EXISTS `ih_order` (    `id` int(11) NOT NULL AUTO_INCREMENT,    `order_sn` char(32) NOT NULL,    `user_id` int(11) NOT NULL,    `status` int(11) NOT NULL DEFAULT '0',    `goods_id` int(11) NOT NULL DEFAULT '0',    `sku_id` int(11) NOT NULL DEFAULT '0',    `price` float NOT NULL,    `addtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,    PRIMARY KEY (`id`)  ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='订单表' AUTO_INCREMENT=1 ;    --  -- 转存表中的数据 `ih_order`  --      -- --------------------------------------------------------    --  -- 表的结构 `ih_store`  --    CREATE TABLE IF NOT EXISTS `ih_store` (    `id` int(11) NOT NULL AUTO_INCREMENT,    `goods_id` int(11) NOT NULL,    `sku_id` int(10) unsigned NOT NULL DEFAULT '0',    `number` int(10) NOT NULL DEFAULT '0',    `freez` int(11) NOT NULL DEFAULT '0' COMMENT '虚拟库存',    PRIMARY KEY (`id`)  ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='库存' AUTO_INCREMENT=2 ;    --  -- 转存表中的数据 `ih_store`  --    INSERT INTO `ih_store` (`id`, `goods_id`, `sku_id`, `number`, `freez`) VALUES  (1, 1, 11, 500, 0);  





原创粉丝点击