由于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
上面的结果很明显,商品被秒杀完毕,没有出现负数的情况
而我们再来看看用户信息表中的情况,看看幸运秒杀用户是哪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 (时间)