点击上方“方志朋”,选择“设为星标”

回复”666“获取新整理的面试文章

作者:涛哥谈篮球

来源:toutiao.com/i6836611989607809548

问题描述

在众多抢购活动中,在有限的商品数量的限制下如何保证抢购到商品的用户数不能大于商品数量,也就是不能出现超卖的问题;还有就是抢购时会出现大量用户的访问,如何提高用户体验效果也是一个问题,也就是要解决秒杀系统的性能问题。本文主要介绍基于redis 实现商品秒杀功能。先来跟大家讲下大概思路。

总体思路就是要减少对数据库的访问,尽可能将数据缓存到Redis缓存中,从缓存中获取数据。

在系统初始化时,将商品的库存数量加载到Redis缓存中;接收到秒杀请求时,在Redis中进行预减库存,当Redis中的库存不足时,直接返回秒杀失败,否则继续进行第3步;将请求放入异步队列中,返回正在排队中;服务端异步队列将请求出队,出队成功的请求可以生成秒杀订单,减少数据库库存,返回秒杀订单详情。当后台订单创建成功之后可以通过websocket 向用户发送一个秒杀成功通知。前端以此来判断是否秒杀成功,秒杀成功则进入秒杀订单详情,否则秒杀失败。

下面直接上代码系统初始化的时候将秒杀商品库存放入redis缓存

第二创建消息队列(这里为了方便,我直接使用redis队列来进行模拟操作)

第三 配置RedisTemplate序列化

下面创建一个接口,在这个接口中创建10000个线程来模拟用户商品抢购场景

这里使用到了redis api中的decrement操作,预先减轻用户抢购的数量,同时判断redis中的库存是否大于用户抢购数量,如果小于0,直接提示用户秒杀失败,否则秒杀成功,进入redis消息队列执行数据库建库存操作。以上操作注意保证redis缓存与数据库库存数据保持一致性。

下面测试演示

初始化商品库存100,在测试一万并发量后,最终发现不会不会出现超卖问题。因为这里一万个并发,每个并发抢购10件商品。经过redis减库存之后,最后只会有10个线程去更新数据库。

热门内容:Spring Boot+JWT+Shiro+MyBatisPlus 实现 RESTful 快速开发后端脚手架
MyBatis动态SQL(认真看看, 以后写SQL就爽多了)
选型必看:RabbitMQ 七战 Kafka,差异立现为什么阿里规定需要在事务注解@Transactional中指定rollbackFor?最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。
明天见(。・ω・。)ノ♡

Spring Boot + redis解决商品秒杀库存超卖,看这篇文章就够了相关推荐

  1. redis如何解决秒杀超卖java_Spring Boot + redis解决商品秒杀库存超卖,看这篇文章就够了...

    作者:涛哥谈篮球 来源:toutiao.com/i6836611989607809548 问题描述 在众多抢购活动中,在有限的商品数量的限制下如何保证抢购到商品的用户数不能大于商品数量,也就是不能出现 ...

  2. Redis解决商品秒杀与超卖

    这个是实体店我们会看到的场景,100件商品,1人1件,最后200人中只有100人能买到商品,剩下100人只能空手而归.如果您开了家网店,同样你开起了秒杀的活动,可能同时会有1000人通过不同的终端访问 ...

  3. 斗鱼html5插件音画不同步,音画不同步在直播中怎么解决?看这篇文章就够了!...

    原标题:音画不同步在直播中怎么解决?看这篇文章就够了! 什么是音画不同步? 很容易判断,就是画面和声音不匹配. 为什么会音画不同步? 首先我们要明白一个概念,虽然人的肉眼很容易辨别音画是否同步的,但是 ...

  4. 【Redis】实战篇:优惠卷秒杀 (库存超卖问题、一人一单问题)

    文章目录 3.1 全局唯一ID 3.2 -Redis实现全局唯一Id 3.3 添加优惠卷 3.4 实现秒杀下单 3.5 库存超卖问题分析 3.6 乐观锁解决超卖问题 3.7 优惠券秒杀-一人一单 3. ...

  5. Redis实战——优惠券秒杀(超卖问题)

    1 实现优惠券秒杀功能 下单时需要判断两点:1.秒杀是否开始或者结束2.库存是否充足 所以,我们的业务逻辑如下 1. 通过优惠券id获取优惠券信息 2.判断秒杀是否开始,如果未返回错误信息 3.判断秒 ...

  6. spring boot入门,看这篇文章就够了

    一.SpringBoot入门 1.基本介绍 简化Spring应用开发的一个框架.整个Spring技术栈的一个大整合: J2EE开发的一站式解决方案: 优点: 快速创建独立运行的Spring项目以及与主 ...

  7. Spring 事务失效?看这篇文章就够了!

    欢迎关注方志朋的博客,回复"666"获面试宝典 用 Spring 的 @Transactional 注解控制事务有哪些不生效的场景? 不知道小伙伴们有没有这样的经历,在自己开心的编 ...

  8. redis解决商品秒杀问题

    在redis中,有两个键值对: 键1:"sk:"+prodid+":qt"(某个秒杀产品),值1:库存(int类型,比如10) 键2:"sk:&quo ...

  9. Spring Boot + Redis 解决重复提交问题,一定用的到

    点击关注

最新文章

  1. 从菜鸟到老司机,数据科学的17个必用数据集推荐
  2. 乙肝的传播途径是否只有四种?
  3. django使用iframe
  4. 常见压缩/解压缩及打包命令
  5. sql server 流程控制
  6. [easyui] - 在easyui的table中展示提示框
  7. mac OSX 上 brew install hive
  8. 大数据第一季--java基础(day2)-徐培成-专题视频课程
  9. 重置linux红帽登录密码,红帽(RHEL)Linux 忘记root密码后重置密码
  10. css写七步诗,《七步诗》改写550字
  11. 如何压缩视频大小?详细操作步骤
  12. Http头:only-if-cached
  13. 布局练习——网易新闻
  14. Java基础知识面试题(总结最全面的面试题)
  15. adguard自定义_AdGuardHome拦截页面模版下载,自定义AdGuardHome拦截页教程,修改AdGuardHome默认拦截页...
  16. TTL与OC电路和MOS管
  17. 为何要配置环境变量?
  18. php windows 信号,win10连接投影仪无信号怎么办
  19. error: insufficient permission for adding an object to repository database .git/objects
  20. java自学能学会吗_自学java能学会吗?有没有捷径能尽快学会?

热门文章

  1. 【算法学习】堆排序建立最大堆
  2. springboot 集成mybatis时日志输出
  3. Android开发笔记1.2
  4. Zepto.js库touch模块代码解析
  5. CentOS7种搭建FTP服务器
  6. Linq 等式运算符:SequenceEqual
  7. 日期处理工具类 -【二】
  8. [JAVA] DUMP
  9. VS2013中, 无法嵌入互操作类型“……”,请改用适用的接口的解决方法
  10. Mac环境下svn的使用