php mysql 秒杀_redis+PHP实现高并发下秒杀数据入库的问题

在高并发下实现抢购秒杀功能中,我有一个疑问,就是数据入库的问题,什么时候入库。

设想思路:

1.判断他抢购成功了,立马把生成的订单数据写入mysql订单表,同时库存表字段减少1;

2.判断抢购成功后,把用户的user_id存入到redis的list列表里(比如:order,以user_id为值的列表)。然后再用crontab定时去一个一个插入到mysql订单表里,同时库存表字段减少1。

设想结果:

第一种思路,很好理解。简单的代码实现如下:

$num=10; //假设库存量

for($i=0;$i

\Redis::lpush('goods_store',1);//往goods_store列表中,

未抢购之前这里应该是默认push 10个1进去,当然里面的1没有实际意义

在抢购之前,上面的代码可以先执行,把商品入队。

抢购时间到了:(大量用户请求下面代码执行操作)

/* 模拟抢购操作,抢购前判断redis队列库存量 */

$count=\Redis::lpop('goods_store');//lpop是原子性的,可以保证不会出现超卖现象。

if(!$count)

return '已经抢光了';

/* 下面处理抢购成功后与mysql数据库的交互 */

1. //根据规则生成订单号(order_num),然后把相关的字段数据插入到订单列表里

$data['order_num'] = *****************;

$data['user_id'] = ***;

$data['goods_id'] = **;

.......

$res = DB::table('order')->insert($data);

2. //减少num库存字段

if($res)

DB::table('goods')->decrement('num', 1);,

上面的代码中,当用户抢购成功后,立马把相关的订单数据插入mysql订单表中,同时库存减少。现在我的疑问来了,要是用这种思路的话,大并发下,要是多个用户都同时进入到插入数据到订单列表和减少商品库存量这个过程中,是不是也会造成并发操作导致服务器压力瞬间过大,导致数据入库不正确呢,比如说存库少减了一个(还是说根据mysql增删改查的原子性,并不会造成这样的错误)?。

针对上面抢购成功后,立马把相关的订单数据插入mysql订单表中,同时库存减少,造成的数据库服务器压力过大的问题;

于是有了第二种思路,把用户的user_id存入到redis列表里(比如:order,以user_id为值的列表),在通过定时器crontab定时去从列表里一个一个取出user_id,生成相关的数据插入到mysql订单表里,同时库存表字段减少1。

代码实现跟上面差不多,

/* 模拟抢购操作,抢购前判断redis队列库存量 */

$count=\Redis::lpop('goods_store');//lpop是原子性的,可以保证不会出现超卖现象。

if(!$count)

return '已经抢光了';

/* 下面处理抢购成功后把user_id存入列表 */

\Redis::lpush('order',user_id);

通过定时器crontab定时去下面的代码

$user_id = \Redis::rpop('order',user_id);

1. //根据规则生成订单号(order_num),然后把相关的字段数据插入到订单列表里

$data['order_num'] = *****************;

$data['user_id'] = $user_id;

$data['goods_id'] = **;

.......

$res = DB::table('order')->insert($data);

2. //减少num库存字段

if($res)

DB::table('goods')->decrement('num', 1);,

第二种思路,我的疑问是,要是抢购成功后,先把user_id存入队列,再用定时器每隔一段时间去队列里取数据,然后生成相关的数据插入的mysql订单表里,同时减少库存。这样是可以减轻数据库服务器的压力了。但是我的抢购流程是这么设计的,用户抢购成功后,弹出//去支付按钮//进入订单列表页面(订单列表页数据是从mysql读取出来的),由于使用定时器去执行生成订单数据然后再插入到mysql数据库,这个过程肯定会有延迟,要是用户此时通过//去支付按钮//进入订单列表页面,发现订单列表还没有生成订单数据,那不是很悲催吗?

【这样设计抢购流程是否合理,是不是不用进入到订单列表,直接点击去支付,支付成功后,才生成订单数据插入到数据库呢】

以上就是我对两种思路存在的疑惑,希望可以得到专业人士的讲解,或者一起探讨。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499227.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql8解决区分大小写问题_球磨机“包球”和“饱磨”分不清?点进来快速区分,解决问题...

球磨机的“包球”和“饱磨”现象都是设备在磨矿过程中出现的常见故障,大多数用户对这两种情况不是特别了解,出现问题时也不知从何下手,导致机器无法正常作业。其实“包球”和“饱磨”有一定的相似之处,同时在产生原因、处理方法等…

控制浏览器增加新页签的js_技术网站重写复制按键 js 跳转到注册页,就能增加用户?...

背景技术网站重写复制按键的 js ,作为开发人员你会为了复制一段代码而注册一个用户吗?一个小需求变动,将跳转详情页改为 target_blank 的方式打开新页面。原来用 Vue.js 的路由代码 push 需要换成 resolve ,本文将介绍该需求调整过…

win7系统一直反复重启_iPhone7开机白苹果反复重启进不了系统维修过程

故障现象iPhone7开机时在出现苹果图标后反复重启,无法进入系统。维修过程拿到手机之后开机测试,在显示苹果图标界面反复重启。这种故障是开机过程不能通过自检造成的。由于客户要保留资料,所以是不能刷机。根据经验判断应该是基带部分有问题。…

mysql去掉小数点多余0_mysql数据库个性化需求:版本号排序

概述今天主要介绍一个MySQL数据库版本号排序问题,一起来看看吧~需求按版本号排序,版本号字段为字符类型,其中1.2.10应大于1.2.9,但mysql数据库会认为1.2.9大于1.2.1正确的版本号应该是 1.3.0 大于 1.2.231.2.10 大于 1.2.9实现sql…

mysql语句在哪编写_mysql常见问题七:编写sql语句

一、删除除了学号字段以外,其它字段都相同的冗余记录,只保留一条!(也就是要删除凤姐和田七中一条重复数据只留一条)要求结果数据:原始数据:CREATE TABLEtbl_students (idint NOT NULL,namevarchar(10) DEFAULT NULL,sa…

lamp mysql5.0_CentOS 5/6 LAMP(Apache MySQL PHP)一键安装脚本

适用系统:CentOS-5 (32bit/64bit)CentOS-6 (32bit/64bit)安装了什么:1、Apache 2.2.202、MySQL 5.0.923、PHP 5.2.174、ZendOptimizer 3.3.95、eAccelerator 0.9.6.16、phpmyadmin 3.3.47、vsftpd 2.3.4实现了什么功能1、一键配置LAMP经典环境2、自动删除…

mysql safe file priv_MYSQL的secure_file_priv参数怎么用?

MYSQL的secure_file_priv参数怎么用?发布时间:2020-06-01 14:03:22来源:亿速云阅读:639作者:LeahMYSQL的secure_file_priv参数怎么用?针对这个问题,今天小编总结这篇有关secure_file_priv的文章…

mysql stdistance_postgis的geography_columns和geometry_columns有什么区别

1、先说说Sql Server中geometry和geography的区别:geometry:planar 平面坐标系【supported by SQL Server conforms to the Open Geospatial Consortium (OGC) Simple Features for SQL Specification version 1.1.0.】geography: terrest…

python依赖平台吗_在Python中创建快速循环最依赖于平台和pythonversion的方法是什么?...

我正在用Python编写一个科学应用程序,其核心是一个处理器密集型的循环。我希望尽可能地优化这一点,将给最终用户带来的不便降到最低,他们可能会将其作为Python脚本的未编译集合,并将使用Windows、Mac和(主要是Ubuntu)Linux。在它目…

sum()转字符串_Python字符串与内置函数

字符串创建变量来保存字符串 字符串可以通过单、双、三引号创建字符串message "Hello,world"#变量mseeage,值为hello,worldprint(message)输出结果:Hello,worldPython3,有3种数值类型分别为:int(整形)#创建变量为a,值为496a 496 #type查看类…

obj文件编辑软件_工程动画制作 | MAX文件导出obj、fbx格式在Bentley软件中应用

一、利用3dmax打开max模型,利用材质球吸取材质。看材质是否为标准材质(standard),如若是,继续下一步操作。如若不是,修改材质球属性,保留贴图为子材质,更改为标准材质。二、处理模型面数、点数问题。利用修…

mysql数据库用户简单分析_如何用SQLyog来分析MySQL数据库详解

用SQLyog来分析MySQL数据库:SOLyog的下载、安装以及使用很简单。我去了相关网站下载,它只有384K字节大小。它把两个文件(一个可执行文件.exe和一个动态链接库文件.dll)安装到C:\Program Files\SQLyog路径下。然后运行可执行文件。安装后没有必要再访问该…

python 安装pandas 权限不够_详解Python学习之安装pandas

一、python pip的安装与使用1、pip 是 python 包管理工具,该工具提供了对python 包的查找、下载、安装、卸载的功能。目前如果你在 python.org 下载最新版本的安装包,则是已经自带了该工具。python 2.7.9 或 python 3.4 以上版本都自带 pip 工具。pip 官…

关于mysql正确的联合索引_关于mysql联合索引

1234567CREATE TABLE uniontest (idint(11)NOT NULL AUTO_INCREMENT,menunamevarchar(50)DEFAULT NULL,urlvarchar(200)DEFAULT NULL,PRIMARY KEY (id),UNIQUE KEY u_index (menuname,url)) ENGINEInnoDB AUTO_INCREMENT5DEFAULT CHARSETutf8先建立数据库,把menunam…

python socket出现ip已经使用_Python:只接受特定的IP(socket)

我有一个由java客户机和python服务器组成的程序。python服务器可以接收多个连接,客户端将尝试每隔17秒连接到服务器。我的问题:服务器应该只接受一个用户之前输入的IP的连接。在HOST 0.0.0.0PORT 1979s socket.socket(socket.AF_INET, socket.SOCK_ST…

java 变量初始化_浅谈Java变量的初始化顺序详解

规则1(无继承情况下):对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器证明代码:public class InitialOrderTest {// 静态变量public static String stat…

java的类是什么_java类是什么意思

java类就是具备某些共同特征的实体的集合,它是一种抽象的数据类型,它是对所具有相同特征实体的抽象。在面向对象的程序设计语言中,类是对一类“事物”的属性与行为的抽象。举一个例子说明下类,比如Person(人)就是一个类&#xff0…

loadrunner 录制java_LoadRunner脚本录制流程

1.1 录制流程协议选择→设置录制选项→开始录制→插入命令→停止录制→回放验证1.2 协议选择单协议or多协议C/S架构使用的协议可能比较特殊,若不确定可询问开发人员。B/S架构使用的协议基本都是HTTP协议。1.3 录制选项1、录制准备事项Application type:可…

phaser java_【Java并发编程实战】-----“J.U.C”:Phaser

Phaser由java7中推出,是Java SE 7中新增的一个使用同步工具,在功能上面它与CyclicBarrier、CountDownLatch有些重叠,但是它提供了更加灵活、强大的用法。CyclicBarrier,允许一组线程互相等待,直到到达某个公共屏障点。…

java 时间类 joda_Java日期类Joda-time的使用及性能对比

在产品的性能优化过程中发现JDK的日期类Calendar使用起来太慢,于是找了替代方案,惊喜的发现Joda-time类库,提供的API功能丰富,关键的是性能要比JDK的Calendar要高出许多。1)日期的实例化//构造方法有很多,对比Calendar类&#xff…