由于Mysql在处理并发业务的时候,性能欠佳,尤其是使用到了悲观锁,阻塞形式的悲观锁,如果在用户量少的情况下还可以使用,如果在用户量大的情况下使用,用户体验会非常差,这里介绍Redis中的并发队列使用
Redis中由于pop这个出队的操作是原子性的,不论请求有多大,它都是按顺序来的,因此实现秒杀的业务需求会比mysql简单许多。
以下是代码解释:
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 |
<?php $redis=new Redis(); $redis->connect("localhost","6379","15"); $redis->auth("zxc86506859"); //我们先连接Redis数据库,给商品做入队操作,商品库存以一种队列的形式存在 //添加商品入队 $goods=20;//商品库存为20 for ($i=0;$i<$goods;$i++) { $redis->lPush("goods",1); //给商品以入队的形式操作,商品名为:数字1 } //此时商品队列中的存在形式是如下的 /* 11111111111111111111 共有20个1 */ |
此时我们开始进行秒杀模拟
前面的文章介绍到了,在本地模拟mysql的并发操作,我用的是curl模拟多线程并发操作,再此处,我们换了一个工具:Webbench,该工具可以在linux操作系统上测试服务器的压力,具体下载方式,我们最后再介绍。
以下是下单逻辑操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<?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 "很遗憾您晚了一步"; } |
此时我们就可以看看数据库是否被秒杀异常
进入redis-cli客户端,查看库存是否为负数
lrange goods 0 -1
lrange是用来查看链表中的各个元素,goods代表链表的键名,0代表从下标为0的开始查,-1代表从最后一个元素,即从0位开始查,查到-1位(即最后一位元素)
解释过来即是 lrange 参数keys 参数start 参数end

上面的结果很明显,商品被秒杀完毕,没有出现负数的情况
而我们再来看看用户信息表中的情况,看看幸运秒杀用户是哪20位
lrange user 0 -1

就此,一个小案例就结束了。
最后分享下 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)