秒杀思路: yii2加Redis实现秒杀

整理一些思路

  • PHP7, yii2加Redis怎么实现秒杀
  1. 一个list列表存放秒杀的商品
  2. 一个list列表存放秒杀的客户信息

首先读取秒杀商品到商品列表, 然后等待客户秒杀.

    1. 每次客户请求,

      1. 检查用户列表与商品数量是否大于等于. 如果是就提示已经抢完.下次再来. (这里可以选择方案 是用户下单就减少还是付款再减少)
      2. 检查商品的剩余数量是否大于0, 是就减一,并加入客户到列表里面. 否就提示已经抢完.下次再来. (这里可以选择方案 是用户下单就减少还是付款再减少)
      3. 每次客户请求, 加入客户到列表里面. 等待付款. 付款时检查??检查商品的剩余数量是否大于0, 是就减一,否就提示已经抢完.下次再来.
      4. (上面的集中方法也是有问题, 如果高并发 还是会有可能同时读取和写入的冲突情况, 可以考虑加锁, 加事务, 特别是更新数量进行减一的时候要带着上次查询出来的库存数量, 但是不加锁的话也可能高并发时同时请求操作.)
      5. 还有一种方案, 是直接在数据库用数据版本, 加一个version字段, 每次写入时作为条件.  如果版本不对, 可以用while控制重新操作几次请求, 也可以让用户再次提交.

原文地址:https://www.cnblogs.com/stillstep/p/11056479.html

时间: 2024-10-05 21:04:58

秒杀思路: yii2加Redis实现秒杀的相关文章

redis watch 加 事务实现秒杀

<?php //redis watch 加 事务实现秒杀  $redis = new redis();  $result = $redis->connect('10.10.10.119', 6379); $redis->watch("mywatchkey"); //必须先watch 后get $mywatchkey = $redis->get("mywatchkey"); $rob_total = 100;   //抢购数量 if($mywa

.NetCore+Jexus代理+Redis模拟秒杀商品活动

开篇叙 本篇将和大家分享一下秒杀商品活动架构,采用的架构方案正如标题名称.NetCore+Jexus代理+Redis,由于精力有限所以这里只设计到商品添加,抢购,订单查询,处理队列抢购订单的功能:有不足或者不够详细的还请见谅,顺手点个推荐也不错: a. 秒杀流程 b. 封装StackExchange.Redis的使用类 c. Ubuntu16.04上使用Jexus搭建代理完成分布式部署 d. NetCore写实时监控队列服务 秒杀架构设计图︿( ̄︶ ̄)︿三幅 1. 一般业务性架构 2. 后端分布

thinkphp+redis实现秒杀功能

1,安装redis,根据自己的php版本安装对应的redis扩展(此步骤简单的描述一下) 1.1,安装 php_igbinary.dll,php_redis.dll扩展此处需要注意你的php版本如图: 1.2,php.ini文件新增 extension=php_igbinary.dll;extension=php_redis.dll两处扩展 ok此处已经完成第一步redis环境搭建完成看看phpinfo 2,项目中实际使用redis 2.1,第一步配置redis参数如下,redis安装的默认端口

使用 redis 减少 秒杀库存 超卖思路

由于数据库查询的及插入的操作 耗费的实际时间要耗费比redis 要多, 导致 多人查询时库存有,但是实际插入数据库时却超卖 redis 会有效的减少相关的延时,对于并发量相对较少的 可以一用 1 public function buy($goods_id = 0){ 2 if(!$goods_id){ 3 die("商品不存在!"); 4 } 5 $redis = new Redis(); 6 $redis->connect('127.0.0.1',6379); 7 $stock

Redis+PHP秒杀设计

讲师介绍: 稳定性建设: 如何做到服务9999的稳定性即每年不可用时间不到1min 高性能系统: 滴滴运营广告系统即并发量很大 社招面试: 秒杀系统的设计与实现,其本质高并发高可用,这两方面的技术可直接决定公司技术水平,提现个人技术实力 概要: 基本知识和原理 减而治之 cdn原理: 减少读的压力,如订单详情页下发到不同地方的cdn节点,访问加速,回源减少 Nginx限流: 请求到达服务端(即接入层)如何做过载保护 异步队列概念: 如通过异步方式创建订单 分而治之 Nginx负载均衡: 流量到达

借助Redis做秒杀和限流的思考

最近群里聊起秒杀和限流,我自己没有做过类似应用,但是工作中遇到过更大的数据和并发. 于是提出了一个简单的模型: var count = rds.inc(key); if(count > 1000) throw "已抢光!" 借助Redis单线程模型,它的inc是安全的,确保每次加一,然后返回加一后的结果.如果原来是234,加一了就是235,返回的一定是235,在此中间,不会有别的请求来打断从而导致返回236或者其它. 其实我们可以理解为inc的业务就是占坑排队,每人占一个坑,拿到

redis优化秒杀系统

用redis提高基于mss的秒杀系统 使用背景: 普通的基于mss框架的系统在并发量不是很高的情况下,对redis的需求不是很高.redis在系统中的角色相当于一个对象缓存器,在高并发的系统中(比如秒杀系统),在某一刻对数据库中的一条数据可能是成千上万的用户同时去访问,系统的用户体验度直接受到数据库的性能的影响.为了保证数据的完整性,用户只能串行访问数据库中的某一条记录.redis则是把记录对应的对象序列化存储在自身的容器中,减少数据库的压力.废话不多说,接下来简单介绍redis的使用. red

redis实现秒杀demo

代码 package com.prosay.redis; import java.util.List; import redis.clients.jedis.Jedis; import redis.clients.jedis.Transaction; public class SaleRunable implements Runnable{ String productKey="iphone8";//监视的key 当前秒杀商品的数量 Jedis jedis = new Jedis(&q

PHP 使用redis实现秒杀

使用redis队列,因为pop操作是原子的,即使有很多用户同时到达,也是依次执行,推荐使用(mysql事务在高并发下性能下降很厉害,文件锁的方式也是) 先将商品库存如队列 [php] view plain copy <?php $store=1000; $redis=new Redis(); $result=$redis->connect('127.0.0.1',6379); $res=$redis->llen('goods_store'); echo $res; $count=$sto