redis实现抢购功能

单例模式创建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

更详细内容和代码见github地址https://github.com/ljhe/RedisForRushBuy

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值