php结合redis实现秒杀功能
<?php
$conn
=mysql_connect(
"localhost"
,
"big"
,
"123456"
);
if
(!
$conn
){
echo
"connect failed"
;
exit
;
}
mysql_select_db(
"big"
,
$conn
);
mysql_query(
"set names utf8"
);
$price
=10;
$user_id
=1;
$goods_id
=1;
$sku_id
=11;
$number
=1;
//生成唯一订单
function
build_order_no(){
return
date
(
'ymd'
).
substr
(implode(NULL,
array_map
(
'ord'
,
str_split
(
substr
(uniqid(), 7, 13), 1))), 0, 8);
}
//记录日志
function
insertLog(
$event
,
$type
=0){
global
$conn
;
$sql
="insert into ih_log(event,type)
values(
'$event'
,
'$type'
)";
mysql_query(
$sql
,
$conn
);
}
//模拟下单操作
//库存是否大于0
$sql
=
"select number from ih_store where goods_id='$goods_id' and sku_id='$sku_id'"
;
//解锁 此时ih_store数据中goods_id='$goods_id' and sku_id='$sku_id' 的数据被锁住(注3),其它事务必须等待此次事务 提交后才能执行
$rs
=mysql_query(
$sql
,
$conn
);
$row
=mysql_fetch_assoc(
$rs
);
if
(
$row
[
'number'
]>0){
//高并发下会导致超卖
$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()){
insertLog(
'库存减少成功'
);
}
else
{
insertLog(
'库存减少失败'
);
}
}
else
{
insertLog(
'库存不够'
);
}
?>.
<?php
$conn
=mysql_connect(
"localhost"
,
"big"
,
"123456"
);
if
(!
$conn
){
echo
"connect failed"
;
exit
;
}
mysql_select_db(
"big"
,
$conn
);
mysql_query(
"set names utf8"
);
$price
=10;
$user_id
=1;
$goods_id
=1;
$sku_id
=11;
$number
=1;
//生成唯一订单号
function
build_order_no(){
return
date
(
'ymd'
).
substr
(implode(NULL,
array_map
(
'ord'
,
str_split
(
substr
(uniqid(), 7, 13), 1))), 0, 8);
}
//记录日志
function
insertLog(
$event
,
$type
=0){
global
$conn
;
$sql
="insert into ih_log(event,type)
values(
'$event'
,
'$type'
)";
mysql_query(
$sql
,
$conn
);
}
//模拟下单操作
//库存是否大于0
mysql_query(
"BEGIN"
);
//开始事务
$sql
=
"select number from ih_store where goods_id='$goods_id' and sku_id='$sku_id' FOR UPDATE"
;
//此时这条记录被锁住,其它事务必须等待此次事务提交后才能执行
$rs
=mysql_query(
$sql
,
$conn
);
$row
=mysql_fetch_assoc(
$rs
);
if
(
$row
[
'number'
]>0){
//生成订单
$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()){
insertLog(
'库存减少成功'
);
mysql_query(
"COMMIT"
);
//事务提交即解锁
}
else
{
insertLog(
'库存减少失败'
);
}
}
else
{
insertLog(
'库存不够'
);
mysql_query(
"ROLLBACK"
);
}
?>
<?php
$conn=mysql_connect("localhost","root","123456");
if(!$conn){
echo "connect failed";
exit;
}
mysql_select_db("big-bak",$conn);
mysql_query("set names utf8");
$price=10;
$user_id=1;
$goods_id=1;
$sku_id=11;
$number=1;
//生成唯一订单号
function build_order_no(){
return date('ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);
}
//记录日志
function insertLog($event,$type=0){
global $conn;
$sql="insert into ih_log(event,type)
values('$event','$type')";
mysql_query($sql,$conn);
}
$fp = fopen("lock.txt", "w+");
if(!flock($fp,LOCK_EX | LOCK_NB)){
echo "系统繁忙,请稍后再试";
return;
}
//下单
$sql="select number from ih_store where goods_id='$goods_id' and sku_id='$sku_id'";
$rs=mysql_query($sql,$conn);
$row=mysql_fetch_assoc($rs);
if($row['number']>0){//库存是否大于0
//模拟下单操作
$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()){
insertLog('库存减少成功');
flock($fp,LOCK_UN);//释放锁
}else{
insertLog('库存减少失败');
}
}else{
insertLog('库存不够');
}
fclose($fp);
第四种,使用redis队列
<?php
$store
=1000;
$redis
=
new
Redis();
$result
=
$redis
->connect(
'127.0.0.1'
,6379);
$res
=
$redis
->llen(
'goods_store'
);
echo
$res
;
$count
=
$store
-
$res
;
for
(
$i
=0;
$i
<
$count
;
$i
++){
$redis
->lpush(
'goods_store'
,1);
}
echo
$redis
->llen(
'goods_store'
);
?>
php结合redis实现秒杀功能的更多相关文章
- thinkphp+redis实现秒杀功能
好久没来整理文章了,闲了没事写篇文章记录下php+redis实现商城秒杀功能. 1,安装redis,根据自己的php版本安装对应的redis扩展(此步骤简单的描述一下) 1.1,安装 php_igbi ...
- thinkphp+redis实现秒杀功能(转)
1,安装redis,根据自己的php版本安装对应的redis扩展(此步骤简单的描述一下) 1.1,安装 php_igbinary.dll,php_redis.dll扩展此处需要注意你的php版本如图: ...
- 电商项目中使用Redis实现秒杀功能
参与过抢购活动就知道,很明显的一点是商即便商品实际没有了也是可以下单成功的,但是在支付的时候会提示你商品没有了. 实现原理:list双向链表 使用redis队列,因为pop操作是原子的,即使有很多用户 ...
- php+redis实现电商秒杀功能
这一次总结和分享用Redis实现分布式锁来完成电商的秒杀功能.先扯点个人观点,之前我看了一篇博文说博客园的文章大部分都是分享代码,博文里强调说分享思路比分享代码更重要(貌似大概是这个意思,若有误请谅解 ...
- Redis事务和实现秒杀功能的实现
今天带着学生学习了Redis的事务功能,Redis的事务与传统的关系型数据库(如MySQL)有所不同,Redis的事务不能回滚. Redis中使用multi.exec.discard.watch.un ...
- Redis分布式锁实现简单秒杀功能
这版秒杀只是解决瞬间访问过高服务器压力过大,请求速度变慢,大大消耗服务器性能的问题. 主要就是在高并发秒杀的场景下,很多人访问时并没有拿到锁,所以直接跳过了.这样就处理了多线程并发问题的同时也保证了服 ...
- thinkphp+redis实现秒杀,缓存等功能
秒杀是商城常见功能 php+redis是最常见的秒杀功能 1,安装redis,根据自己的php版本安装对应的redis扩展 首先查看phpinfo();php环境信息 2,下载redis https ...
- spring boot:redis+lua实现生产环境中可用的秒杀功能(spring boot 2.2.0)
一,秒杀需要具备的功能: 秒杀通常是电商中用到的吸引流量的促销活动方式 搭建秒杀系统,需要具备以下几点: 1,限制每个用户购买的商品数量,(秒杀价格为吸引流量一般会订的很低,不能让一个用户全部抢购到手 ...
- 秒杀功能压测 jmeter--------重要!!!
线程组里面有三个接口请求,依次为:显示商品列表.登录秒杀平台账户.进行秒杀 对线程组用5000个线程循环10次 设置一下默认配置,之后就不用反复填写了 设置配置文件这个具体功能就是读text文件并且设 ...
随机推荐
- 聊聊 Material Design 里,阴影的那些事儿!
当你的设计师要求你在某个 View 上增加阴影效果,那你只需要认真阅读本文,阴影的问题就不再是问题. 一.前言 设计师的世界,与常人不同,有时候想要扁平化的风格,有时候又想要拟物化的风格.而在 Mat ...
- 数据处理不等式:Data Processing Inequality
我是在差分隐私下看到的,新解决方案的可用性肯定小于原有解决方案的可用性,也就是说信息的后续处理只会降低所拥有的信息量. 那么如果这么说的话为什么还要做特征工程呢,这是因为该不等式有一个巨大的前提就是数 ...
- js让input失去焦点
要求:当我点击页面非文本框的地方,令文本框失去焦点 问题:一开始我的做法是让点击的地方得到焦点,实际上是无效的 $(this).focus(); 当时我也不知道为什么focus会失效, 问题在于f ...
- poj 2566 Bound Found
Bound Found Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 4384 Accepted: 1377 Spe ...
- 第三章 CUDA设备相关
这章介绍了与CUDA设备相关的参数,并给出了了若干用于查询参数的函数. 章节代码(已合并): #include <stdio.h> #include "cuda_runtime. ...
- shapes 不规则边界
CSS基本形状都是矩形,CSS shapes允许开发者用定制的路径来包裹内容,例如圆形,椭圆,多边形等. 形状可以自定义也可以从图片中推断 从图片推断,例如可以让文字按照图片形状来浮动到一边: ...
- 【深度学习系列】PaddlePaddle之数据预处理
上篇文章讲了卷积神经网络的基本知识,本来这篇文章准备继续深入讲CNN的相关知识和手写CNN,但是有很多同学跟我发邮件或私信问我关于PaddlePaddle如何读取数据.做数据预处理相关的内容.网上看的 ...
- idea java项目部署至Tomcat服务器
1. 服务器部署TomCat 1. 安装JDK,配置环境变量 > 变量名:JAVA_HOME;变量值:C:\Program Files\Java\jdk1.7.0_45 ...
- NoSQL:linux操作memcached
缓存数据库 一 NoSQL简介 NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL",泛指非关系型的数据库,随着互联网web2.0网站的兴起,传统的关系 ...
- python+selenium安装
1.下载Python 请到官网自行下载安装https://www.python.org/downloads/ 在安装的时候,注意一定要勾上这个选项,可以免去我们配置系统变量的麻烦,如果你忘了,没关系, ...