方案1:

原理:后台创建红包后,将红包个数存入redis,采用常量键名拼接红包id 作为key,红包个数为value存入redis,然后当用户领取红包的时候,前端肯定传红包id到后端,后端 先加redis锁,然后根据接收的红包id 读取key对应的值就是红包剩余个数,然后减1后再存入。

具体代码如下(php--laravel)

方案2:(不加锁利用redis原子性,还是建议使用方案一)

首先要了解的是:1.Redis如何保证原子性?

                              答案很简单,因为redis是单线程。

一、看下面代码(仅仅是看,后面贴的有代码可复制)

分析:通过jmeter并发测试发现仍然出现类似超卖情况,

          上图中 llen 和 lpush 两次操作如果单独执行是具备原子性的,但是这两个操作组合起来才算是完成一个业务,那么这2个命令组合起来就不具备原子性,所有在两个操作之间其他客户端会出现脏读。

二、再优化代码如下:

在后台设置红包的时候执行以下操作,

然后用户领取红包请求接口的时候只做一步redis操作。

public function getPacket(Request $request) {$packet_id = $request->input('packet_id',0);if(!$packet_id){return Response::error('缺少参数:packet_id') ;}$redisConfig = config('database.redis.default');$redis = new Client($redisConfig);$count = $redis->lpop('red_packet_id:'.$packet_id);if(!$count){return Response::error('已经抢光了哦') ;}return Response::success('恭喜您,抢到了哦!') ;}

总结:

这里利用 redis 操作的原子性来实现。首先我们把 红包个数或者库存 存在“red_packet_id:1”这个列表中,假设id=1的这个红包的可领取个数为10个,就往列表中push10个数,这个数没有实际意义,仅仅只是代表红包的可被领取次数。抢购或者红包到开始领取时间后,每到来一个用户,就从“red_packet_id:1”中 pop 一个数,表示用户抢购成功。当列表为空时,表示已经被抢光了。因为列表的pop操作是原子的,即使有很多用户同时到达,也是依次执行的。

       缺陷:1、单纯依靠这总办法解决并发是不够的。

                  2、这种办法如果红包个数1000个是要往队列插入1000条,方案有点low,

                  3、队列一般都是用来异步处理,上面方案是同步消费队列返回给前端,所以这种方案不是很完美,但是能够实现。

  

php laravel 抢红包防止并发(超卖也是同理)相关推荐

  1. 高并发超卖问题简要解决方案

    1.传统通过数据库保证不超卖 事务+行锁并不是解决超卖的方案,只是保障数据的统一性.传统通过回滚事务的方式防止某些用户多卖的情况. 采用新建一个防重表+事务的方式防止超卖.同一事务中,采用如 用户ID ...

  2. 解决高并发的问题python_python ---解决高并发超卖问题

    使用redis 解决美多商城超卖的问题 import redis r = redis.Redis(host='localhost', port=6379) #定义过载 def limit_handle ...

  3. 怎么解决高并发下抢红包和商品超卖问题?

    一.场景模拟 在抢红包或秒杀商品的时候,肯定会有高并发的情况出现,程序中如果出现库存重复减扣的情况,那肯定是不行的!接下来模拟一下高并发下的库存重复减扣问题以及相应的解决方案. 1.  在测试前,需要 ...

  4. PHP 实现积分兑换和大转盘抽奖功能,防超卖

    目录 前情提要 如何不发生超卖现象? 代码如何实现 Redis 锁的实现(悲观锁) 结论 前情提要 前段时间帮客户做了一个线上会议网站,网站实际运营 2 个多月,正常参会用户注册量大概有1万多. 网站 ...

  5. 秒杀场景下超卖问题解决方案

    秒杀超卖现象:在高并发下,多个线程并发更新库存,导致库存为负的情况. 我搜集了一些资料,整理了一下,秒杀可选方案主要有以下三种: 1.超卖原因 一个简单的订单表 create table orders ...

  6. 电商超卖,从业务到设计

    编辑导语:超卖这一概念的定义可以从不同层面进行阐述,比如平台层面.渠道层面.仓库层面等.而假设因超卖导致订单难以履行,则容易让用户体验"打折".为什么有时电商超卖的现象会发生?可以 ...

  7. 避免商品超卖的4种方案

    避免商品超卖的4种方案(以下是一些核心思路) 原始方案(失败):在每次下订单前我们判断促销商品的数量够不够,不够不允许下订单,更改库存量时加上一个条件,只更改商品库存大于0的商品的库存,当时我们使用a ...

  8. Java实现库存防超卖_高并发场景-订单库存防止超卖

    背景 在电商系统中买商品过程,先加入购物车,然后选中商品,点击结算,即会进入待支付状态,后续支付. 过程需要检验库存是否足够,保证库存不被超卖. 场景一:买家需要购买数量可以多件 场景二:秒杀活动,到 ...

  9. 【万级并发】电商库存扣减如何设计?不超卖!

    随着中国消费认知的不断升级,网购走近千家万户,越来越被人们所接受.淘宝.唯品会.考拉.京东.拼多多等逐渐成为我们生活的重要组成部分. 除了常规的购物下单外,这些电商平台还经常搞一些双十一活动,秒杀.大 ...

最新文章

  1. 生活问题 | 对华为畅玩手机5X进行升级
  2. ie网络集合代理无法启动_网络故障诊断70例!经典老文了!
  3. BSTR、char* 和 CString 之间的转换 (转)
  4. 漫步最优化十二——局部极小与极大的充分必要条件(下)
  5. oracle xp 安装包资源
  6. 关于EasyUI查询功能的二级联动
  7. MATLAB r2016a 配置 VLFeat 库教程(超详细,一看必会)
  8. 【三维目标检测】PointRCNN(二)
  9. html居中代码怎么写?
  10. ls命令显示颜色含义详解
  11. Go:Comb sort 梳状排序(附完整源码)
  12. 苹果系统中国日历服务器,简单三步,让 iPhone 自带日历 App 显示国家节假日安排...
  13. IMAC 2011 MID免光驱安装WIN10
  14. here-document at line y delimited by end-of-file
  15. 0基础学MySQL数据库—从小白到大牛(20)大小写规范、sql_mode的合理设置
  16. linux罗马数字1到10怎么打,罗马数字1到10怎么打
  17. app后端设计(6)-- LBS
  18. 【图】上海居住证办理指南
  19. Java黑马程序员:文字版格斗游戏
  20. 神经科学探索脑第二章答案

热门文章

  1. A - Bookshelf Filling (非二分法,好像还更快)
  2. 考研英语很重要,这篇文章教你如何通过它
  3. 中国科学:信息科学 投稿模板的编译方法
  4. html页面特效代码,html特效代码大全
  5. html模式是什么意思,html-什么是怪癖模式?
  6. wallpaper破解解决方法
  7. 金鱼多久喂一次?一次喂几颗鱼食?
  8. 企业微信系列之JSSDK文件预览对接
  9. Electron安装报错 RequestError: read ECONNRESET
  10. openssl命令行实用程序(译文)