redis 秒杀成功 mysql_Redis 商品秒杀案例

由于Mysql在处理并发业务的时候,性能欠佳,尤其是使用到了悲观锁,阻塞形式的悲观锁,如果在用户量少的情况下还可以使用,如果在用户量大的情况下使用,用户体验会非常差,这里介绍Redis中的并发队列使用

Redis中由于pop这个出队的操作是原子性的,不论请求有多大,它都是按顺序来的,因此实现秒杀的业务需求会比mysql简单许多。

以下是代码解释:

商品入队操作

PHP

$redis=new Redis();

$redis->connect("localhost","6379","15");

$redis->auth("zxc86506859");

//我们先连接Redis数据库,给商品做入队操作,商品库存以一种队列的形式存在

//添加商品入队

$goods=20;//商品库存为20

for ($i=0;$i

{

$redis->lPush("goods",1); //给商品以入队的形式操作,商品名为:数字1

}

//此时商品队列中的存在形式是如下的

/*

11111111111111111111

共有20个1

*/

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

$redis=newRedis();

$redis->connect("localhost","6379","15");

$redis->auth("zxc86506859");

//我们先连接Redis数据库,给商品做入队操作,商品库存以一种队列的形式存在

//添加商品入队

$goods=20;//商品库存为20

for($i=0;$i

{

$redis->lPush("goods",1);//给商品以入队的形式操作,商品名为:数字1

}

//此时商品队列中的存在形式是如下的

/*

11111111111111111111

共有20个1

*/

此时我们开始进行秒杀模拟

前面的文章介绍到了,在本地模拟mysql的并发操作,我用的是curl模拟多线程并发操作,再此处,我们换了一个工具:Webbench,该工具可以在linux操作系统上测试服务器的压力,具体下载方式,我们最后再介绍。

以下是下单逻辑操作

PHP

$redis=new Redis();

$redis->connect("localhost","6379","15"); //三个参数分别为,主机、端口、允许连接超时时间

$redis->auth("zxc86506859");

$userid=rand(10000,99999); //随机范围性生成用户id

$pop=$redis->lPop("goods");//从商品的链表头部删除一个元素,返回删除的元素,$pop为true

if($pop) {

$redis->lPush("user",json_encode(["userid"=>$userid,"time"=>time()]));

//写入用户信息链表

}else {

echo "很遗憾您晚了一步";

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

$redis=newRedis();

$redis->connect("localhost","6379","15");//三个参数分别为,主机、端口、允许连接超时时间

$redis->auth("zxc86506859");

$userid=rand(10000,99999);//随机范围性生成用户id

$pop=$redis->lPop("goods");//从商品的链表头部删除一个元素,返回删除的元素,$pop为true

if($pop){

$redis->lPush("user",json_encode(["userid"=>$userid,"time"=>time()]));

//写入用户信息链表

}else{

echo"很遗憾您晚了一步";

}

此时我们就可以看看数据库是否被秒杀异常

进入redis-cli客户端,查看库存是否为负数

lrange goods 0 -1

lrange是用来查看链表中的各个元素,goods代表链表的键名,0代表从下标为0的开始查,-1代表从最后一个元素,即从0位开始查,查到-1位(即最后一位元素)

解释过来即是 lrange 参数keys 参数start 参数end

27c4b01a3b48a236d9fb50e1c0568ba9.png

上面的结果很明显,商品被秒杀完毕,没有出现负数的情况

而我们再来看看用户信息表中的情况,看看幸运秒杀用户是哪20位

lrange user 0 -1

c41cd6c08540fcc54917304b1ad42698.png

就此,一个小案例就结束了。

最后分享下 webbench压力测试工具如何安装(方法如下:)

从官网下载webbench-1.5.tar.gz

当然也可以选择wget方法

命令: wget http://soft.vpser.net/test/webbench/webbench-1.5.tar.gz

解压: tar -zxvf webbench-1.5.tar.gz

进入解压目录: cd webbench-1.5

make

make install

当出现以下情况,即为安装成功

install -s webbench /usr/local/bin

install -m 644 webbench.1 /usr/local/man/man1

install -d /usr/local/share/doc/webbench

install -m 644 debian/copyright /usr/local/share/doc/webbench

install -m 644 debian/changelog /usr/local/share/doc/webbench

此时就可以在当前目录进行简单测试了

命令: webbench -c 500 -t 30 http://www.baidu.com

参数-c (连接数)

参数 -t (时间)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值