最近找时间浏览了网上的一些文章,结合自己的思考,觉得需要出一个秒杀活动的技术方案。大家可以参考,也可以指正,这里都表示热烈欢迎!技术只有相互探讨才能碰撞出智慧的火花,问题也就随之清晰明朗。闲话不多扯了,先上一副流程图,描述下大概秒杀流程。

场景:公司周年之际,准备答谢客户,于是想策划一起秒杀活动,一共有100件商品,且要求每个用户只能抢一件商品,并且用户抢到后如果30分钟内没有付款,则取消订单,释放库存给其他用户抢。


我们来一步一步分析下:
首先第一个问题:如何解决用户抢购过了,不准再抢这个问题?
分析:用户抢购商品后会携带一个userId发起抢购请求,我们该如何避免用户刷单呢?这里我们在请购请求到达后,首先将用户放进一个hash集合中,可以采用redis的Hash来存放:

Long first = jedis.hset("userQueue", "0000000001", "0000000001");

对于userQueue这个key的hash结构来说,userId是其field,userId也是其value,第一次放入0000000001这个用户返回值为1,第二次放入则返回值是0,且redis是单线程顺序执行命令,所以一定只能放进去一个0000000001用户,这样就控制住同一个用户只能进入userQueue队列1次,同一个用户可以提示“已经参与抢购!”,那进入队列后这个用户要干什么呢?
当然是抢购了,在这里有一个很关键的问题要注意:商品一共100件,最终抢到商品的也只能是userQueue中的100个用户,如何保证第101个用户买不到商品?现在的设计是将库存100先放进一个redis的list结构中,来一个用户pop一个,直到最后pop出第100个秒杀结束。提示“抢光了!”pop成功则进入下单流程,插入新订单到数据库,初始状态0未支付(0:未支付 1:已支付,2:30min已过期)。对于过期的则归还库存到redis的库存list中等待pop。

期初的设计是这样的如下图(略复杂):
将用户的的请求preOderpush放进redis的list列表中,key为一个应用中定义的AutomicInteger值,value为用户ID即userId,但是考虑到分布式应用场景(毕竟我们的秒杀服务端可能不止一台机器)key可能需要做分布式计数,那么我想到的就是ZK实现的分布式计数器
DistributedAtomicInteger,入队后+1,订单过期未支付-1,入队后获取+1后的值是否超过100,如果超过则提示抢购结束,否则抢到商品且入队成功。
存放进抢购队列的preOder将会被我们事先定义的定时任务TASK1扫描,这个定时任务的逻辑就是将抢购队列的preOder预订单生在DB订单表中成正式订单,并且初始状态为0:未支付
0:未支付 1:已支付,2:30min已过期)。
我们用TASK2来扫描数据库中超过30分钟未支付的过期订单,更新状态为2:已过期。同时分布式计数器-1.此时可以进来一个新的抢购用户!

redis设计秒杀活动图解相关推荐

  1. 【硬核】秒杀活动技术方案,Redis申请32个G,被技术总监挑战了...

    作为一名技术从业人员,性能优化是每个人的必修课 就像大学时期给漂亮妹子修电脑的绝招就是"重启电脑一样",性能优化也有自己的必杀技 你一定听过一句话:性能不够,缓存来凑!对,你没听错 ...

  2. 业务总结002:秒杀活动架构设计

    一.秒杀商品模型 二.架构设计 2.1 Redis + MQ 缓存预热:秒杀商品一般时效性比较强,一场秒杀活动持续的时间不会很长,当在后台设置秒杀活动添加秒杀商品时,把商品对应的库存直接存到 Redi ...

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

    开篇叙 ,顺手点个推荐也不错: a. 秒杀流程 b. 封装StackExchange.Redis的使用类 c. Ubuntu16.04上使用Jexus搭建代理完成分布式部署 d. NetCore写实时 ...

  4. redis分布式锁实现秒杀活动

    最近,参与和负责公司的一次秒杀活动的设计开发,收获颇多,与大家分享.其实大家在生活中或见过或参见过秒杀活动,用户以极低的成本获得高价值的商品,所以也导致活动期间出现拥挤现象,进而导致一些高并发问题,所 ...

  5. Day267.预约系统的性能瓶颈、营销活动无缝切换秒杀活动、预约系统数据迁移方案、高流量下预约系统搭建熔断机制、预约系统redis集群主从哨兵架构 -Redis的高并发预约抢购系统

    一.预约系统的性能瓶颈 1.预约系统应对热门爆品时的缺陷 用户进行预约会涉及到两个维度的数据变更一个是用户信息,一个是SKU信息,如图↓所示: 正常来说这么搞一点问题没有,即便涉及到写数据库,但是每个 ...

  6. C#/.NET redis案例【超卖,秒杀活动】

    redis中string数据结构实现超卖 public class Oversell{private static bool IsGoOn = true;//秒杀活动是否结束public static ...

  7. 大神手把手教你设计秒杀架构模型

    中生代技术 链接技术大咖,分享技术干货 全文:4000字 作者:Yrion 原文首发:https://www.cnblogs.com/wyq178/p/11261711.html 前言:秒杀系统相信很 ...

  8. 关于设计秒杀系统的几个问题

    本文来说下如何设计一个秒杀系统. 文章目录 秒杀场景 第1版-裸奔 第2版-悲观锁 第3版-乐观锁 第4版-限流 漏桶算法 令牌桶算法 第5版- 细节优化 限时抢购 秒杀接口隐藏 访问频率限制 第6版 ...

  9. Redis解决秒杀中的超卖问题

    前言 在上一篇,我们通过一个简单的案例,分享了怎么利用redis设计并实现一个秒杀抢购的功能,关于秒杀功能中,需要注意的比较关键的有两个问题 高并发场景下,怎么确保不会超卖 高并发场景下,如何确保一人 ...

  10. 基于Redis实现秒杀系统

    系统架构 客户端发起秒杀请求,请求经网关处理转发到对应的服务节点上,进行业务层处理,最后数据入库. 业务处理: 验证秒杀活动是否已经开启: 对流量进行限制: 验证订单信息(验证重复秒杀.验证库存是否足 ...

最新文章

  1. 【前端面试分享】- 寒冬求职下篇
  2. 浅谈如何增强ASP程序性能
  3. tomcat jdbc SlowQueryReport的实现解读
  4. python collections(容器)模块
  5. 时间序列异常检测机制的研究
  6. 语言学博士、Kaggle数据分析师,她说:读研不是必选项,这4项技能学校不教
  7. 一款开源的 macOS 外接显示器必备工具
  8. UE4_C++_自定义细节面板_Customizing detail panels
  9. 【单目3D检测】Monoflex论文阅读
  10. C语言基础学习——编译过程
  11. luoguP3403 跳楼机
  12. 金蝶K3工资模块个税计算公式
  13. python opencv将图片转为灰度图
  14. c语言中f的作用是什么,c语言中f什么意思 c语言中f什么意思
  15. C++:实现将华氏度转换为摄氏度
  16. android 键盘快捷指令
  17. 远程访问linux图像桌面,在windows下远程访问linux桌面
  18. 学校计算机一级上网题,考试经验之谈:计算机一级考试上网题怎么操作?
  19. VS code C语言输出位数
  20. nginx启动、停止、重启命令

热门文章

  1. 171-辽宁移动魔百盒CM211-1-YS-S905L3B-RTL8822C线刷包
  2. 枫叶永恒 服务器维护,3月8日服务器维护公告
  3. Contrastive Loss 详解及用法
  4. 手机home键、POWER 键分别是什么
  5. Linux 磁盘管理 : dir dirs dircolors 命令详解
  6. Bad config encountered during initialization: No such notebook dir:
  7. 微信小程序提示 本地域名不在以下 request 合法域名列表中,
  8. Hibernate入门简介----张冬
  9. 【离散数学】命题逻辑
  10. 基于STM32:情侣互动玩偶(设计方案+源码+3D图纸+AD电路)