php抢购商品redis高并发

3 篇文章 0 订阅
  • 抢购

主要针对两个问题
一、高并发对数据库产生的压力
二、竞争状态下如何解决库存的正确减少("超卖"问题)

解决
第一个问题,对于PHP来说很简单,用缓存技术就可以缓解数据库压力,比如memcache,redis等缓存技术。

代码参考

// 关闭自动提交
$this->db_conn->autocommit(FALSE);//开启事务

//获取商品库存
$query_sql = 'select stock from goods where id ='.$goods_id .' lock in share mode'; //加mysql共享锁[提交前不允许其他事务修改]

$stock = $this->query($query_sql);
if ($stock < $num) {
	return $this->log('库存不足_'.$stock);
}

//减库存

//创订单

//提交事务

REDIS

以商品id生成key,redis获取库存,开启redis监控key和redis事务首次获取失败: 数据查询商品库存存入redis'

    /**
     * 生成商品库存redis
     */
    public function redis()
    {
        $data = [
            ['id' => 1,'stock' => 2],
            ['id' => 2,'stock' => 23],
            ['id' => 3,'stock' => 1]
        ];

        foreach ($data as $v) {
            $redis_key = 'goods_id_' . $v['id'];
            for ($i = 0; $i < $v['stock']; $i++) {
                //插入redis中商品的表抢购时从这读取
                $this->redis->lPush($redis_key, 1);
            }
        }
        $this->success('生产库存成功');
    }

    /**
     * 抢购
     */
    public function skill()
    {
        $data = input();
        //模拟随机用户id
        $uid = rand(10000,99999);
        //传商品id
        $redis_key = 'goods_id_' .  $data['id'];
        //查询redis中商品的数量长度
        $len = $this->redis->lLen($redis_key);
        $str = "";
        if(!$len || $len<=0){
            $str .= $uid."抢购失败,商品售罄";
        }else{
            $redis_user_name = "goods_id_".$data['id']."_uid";
            //判断已抢购列表中是否已存在该用户,获取列表中所有的数据
            $skill_user_list = $this->redis->lrange($redis_user_name, 0, -1);
            if(in_array($uid, $skill_user_list)){
                $str .= $uid."已经抢购成功";
            }else{
                //从redis商品表中取出一个
                $this->redis->rPop($redis_key);
                //插入用户抢购成功的redis表中
                $this->redis->lPush($redis_user_name,$uid."_".microtime().rand(10000,99999));
                $str .= $uid."抢购成功";
            }
        }
        //存日志信息与流程无关
        $path = __DIR__ . "/../../../redis_log.txt";
        $file = fopen($path, "a+");        //创建文件或打开文件
        fwrite($file, '抢购信息' . '----' . $str . '-------------------' . '时间:' . date('Y-m-d H:i:s', time()) . "\r\n");
        echo '完成';
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Nginx和Redis都是在高并发场景下常用的工具。Nginx是一个高性能的Web服务器和反向代理服务器,而Redis是一个高性能的键值存储数据库。 当涉及到高并发时,Nginx可以用作负载均衡器,将请求分发给多个后端服务器,从而提高系统的吞吐量和性能。Nginx使用事件驱动的异步架构,可以处理大量并发连接,同时具有较低的资源消耗。 Redis作为一个内存数据库,具有快速读写的能力,适合处理大量的并发请求。它支持多种数据结构和丰富的功能,例如缓存、消息队列和分布式锁等,可以帮助应对高并发场景下的数据存储和处理需求。 在高并发环境中,可以通过以下几点来优化Nginx和Redis的性能: 1. Nginx: - 合理配置Nginx的工作进程数和连接数,使其适应并发请求的压力。 - 使用Nginx的缓存功能,减轻后端服务器的压力。 - 配置合适的超时时间,避免请求长时间占用连接资源。 - 使用Nginx的Gzip压缩功能,减小传输数据量,提高响应速度。 - 使用Nginx的Keepalive机制,减少TCP连接的建立和关闭开销。 2. Redis: - 合理设计数据模型,减少数据存储和检索的复杂度。 - 使用Redis集群或主从复制,提高读写性能和数据的可用性。 - 配置适当的内存策略,例如使用LRU算法来淘汰冷数据。 - 使用Redis的Pipeline和批量操作来减少网络延迟和降低通信开销。 - 避免频繁的大批量写入操作,可以通过异步或者缓存策略来优化性能。 综上所述,Nginx和Redis高并发场景下可以发挥其优势,通过合理的配置和优化可以提高系统的性能和稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阳光帅气男孩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值