单例模式创建redis,并连接
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2018/9/29
* Time: 17:13
*/
class HelperRedis {
private static $redisInstance;
/**
* 私有化构造函数
* 原因:防止外界调用构造新的对象
*/
private function __construct(){}
/**
* 获取唯一实例HelperRedis
*/
public static function getRedisConn(){
if(!self::$redisInstance instanceof self){
self::$redisInstance = new self;
}
// 获取当前单例
$temp = self::$redisInstance;
// 调用私有化方法
return $temp->connRedis();
}
/**
* 连接redis的私有化方法
* @return Redis
*/
private static function connRedis()
{
try {
$redis_ocean = new Redis();
$redis_ocean->connect('127.0.0.1', 6379);
}catch (Exception $e){
echo $e->getMessage().'<br/>';
}
return $redis_ocean;
}
}
test1.php(模拟商品详情页,将当前商品总数存入列表)
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2018/10/31
* Time: 15:09
*/
require "HelperRedis.php";
$redis = HelperRedis::getRedisConn();
/**
*test1.php页面刷新的时候,模拟商品详情页显示当前商品数量
*先删除之前的数量,在本次示例中保证每次商品数量都是100
*实际项目可以在商品详情页显示数量时,判断当前键值goods_store是否存在,如
*/过不存在,从数据库查询数量
$redis->del('goods_store');
//在本次示例中清除user_id的值,每次刷新test2.php显示当前测试购买成功的人数
$redis->del('user_id');
$num = 100;
for ($i=1;$i<=$num;$i++){
//将商品数量存入列表
$redis->lPush('goods_store',$i);
}
//打印长度,即商品数量
var_dump($redis->lLen('goods_store'));
test2.php
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2018/12/25
* Time: 14:28
*/
require "HelperRedis.php";
$redis = HelperRedis::getRedisConn();
//显示所有购买成功的商品编号及其购买成功的人的总数
print_r($redis->lRange('user_id',0,-1));
index.php
<?php
require "HelperRedis.php";
header("Content-type: text/html; charset=utf-8");
/**
* 列表的pop操作是原子的,即使有很多用户同时到达,也是依次执行的
* 先将物品数量存入队列,每来一个用户,取出来一个
*/
$redis = HelperRedis::getRedisConn();
$check = $redis->lPop('goods_store');
if(!$check){
echo '已经售完';
}else{
//如果抢购成功,将商品编号存入键值为user_id的列表中
$redis->lPush('user_id',$check);
}
用ab测试并发
-c 代表并发人数
-n 代表访问总数
D:\PHPStudy\PHPTutorial\Apache\bin>ab -c 100 -n 200 http://www.test.cn/index.php