接口优化:Redis预减库存,减少对数据库访问方案
欢迎关注方志朋的博客,回复”666“获面试宝典
Redis预减库存:主要思路减少对数据库的访问,之前的减库存,直接访问数据库,读取库存,当高并发请求到来的时候,大量的读取数据有可能会导致数据库的崩溃。
思路:
系统初始化的时候,将商品库存加载到Redis 缓存中保存
收到请求的时候,现在Redis中拿到该商品的库存值,进行库存预减,如果减完之后库存不足,直接返回逻辑Exception就不需要访问数据库再去减库存了,如果库存值正确,进行下一步
将请求入队,立即给前端返回一个值,表示正在排队中,然后进行秒杀逻辑,后端队列进行秒杀逻辑,前端轮询后端发来的请求,如果秒杀成功,返回秒杀,成功,不成功就返回失败。
(后端请求 单线程 出队,生成订单,减少库存,走逻辑)前端同时轮询
前端显示
第一步:预减库存
/*** 秒杀接口优化之--- 第一步: 系统初始化后就将所有商品库存放入 缓存*/
@Override
public void afterPropertiesSet() throws Exception {List<GoodsVo> goods = goodsService.getGoodsList();if (goods == null) {return;}for (GoodsVo goodsVo : goods) {redisService.set(GoodsKey.getGoodsStock, "" + goodsVo.getId(), goodsVo.getStockCount());isOverMap.put(goodsVo.getId(), false);//先初始化 每个商品都是false 就是还有}
}
/**秒杀接口优化之 ----第二步: 预减库存 从缓存中减库存* 利用 redis 中的方法,减去库存,返回值为 减去1 之后的值* */
long stock = redisService.decr(GoodsKey.getGoodsStock, "" + goodsId);
/*这里判断不能小于等于,因为减去之后等于 说明还有是正常范围*/
if (stock < 0) {isOverMap.put(goodsId, true);//没有库存就设置 对应id 商品的map 为truereturn Result.error(CodeMsg.MIAO_SHA_NO_STOCK);
}
预减库存:
1.先将所有数据读出来,初始化到缓存中,并以 stock + goodid 的形成存入Redis,
2.在秒杀的时候,先进行预减库存检测,从redis中,利用decr 减去对应商品的库存,如果库存小于0,说明此时 库存不足,则不需要访问数据库。直接抛出异常即可
内存标记:
由于接口优化很多基于Redis的缓存操作,当并发很高的时候,也会给Redis服务器带来很大的负担,如果可以减少对Redis服务器的访问,也可以达到的优化的效果。
于是,可以加一个内存map,标记对应商品的库存量是否还有,在访问Redis之前,在map中拿到对应商品的库存量标记,就可以不需要访问Redis 就可以判断没有库存了。
1.生成一个map,并在初始化的时候,将所有商品的id为键,标记false 存入map中。
private Map<Long, Boolean> isOverMap = new HashMap<Long, Boolean>();/*** 秒杀接口优化之--- 第一步: 系统初始化后就将所有商品库存放入 缓存*/
@Override
public void afterPropertiesSet() throws Exception {List<GoodsVo> goods = goodsService.getGoodsList();if (goods == null) {return;}for (GoodsVo goodsVo : goods) {redisService.set(GoodsKey.getGoodsStock, "" + goodsVo.getId(), goodsVo.getStockCount());isOverMap.put(goodsVo.getId(), false);//先初始化 每个商品都是false 就是还有}
}/**再优化: 优化 库存之后的请求不访问redis 通过判断 对应 map 的值* */boolean isOver = isOverMap.get(goodsId);if (isOver) {return Result.error(CodeMsg.MIAO_SHA_NO_STOCK);}if (stock < 0) {isOverMap.put(goodsId, true);//没有库存就设置 对应id 商品的map 为true
2.在预减库存之前,从map中取标记,若标记为false,说明库存,还有,
3.预减库存,当遇到库存不足的时候,将该商品的标记置为true,表示该商品的库存不足。这样,下面的所有请求,将被拦截,无需访问redis进行预减库存。
来源:blog.csdn.net/weixin_38035852/
article/details/81174986
热门内容:
阿里3大编程语言,Java没上榜!
在部队当程序员是什么体验?
mybatis-plus团队新作:mybatis-mate 轻松搞定数据权限
面试能力者当场拿offer,Java基础天花板实锤了!
牛逼,国产开源的远程桌面火了,只有9MB,支持自建中继器!
最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。
明天见(。・ω・。)ノ♡
接口优化:Redis预减库存,减少对数据库访问方案相关推荐
- 【Java秒杀方案】11.功能开发-【商品秒杀及优化】防止超卖 接口优化(redis预减库存,内存标记减少redis访问,RabbitMQ异步下单) 安全优化(隐藏秒杀接口,验证码,接口防刷)
商品秒杀核心功能及优化 1. 正常秒杀流程 在商品详情页面等待秒杀倒计时–http://localhost:8080/goodsDetail.htm?goodsId=2 倒计时为0,开始秒杀,点[秒杀 ...
- java 消息队列 秒杀_【IDEA+SpringBoot+Java商城秒杀实战21】高并发秒杀系统接口优化 RabbitMQ异步下单...
问题: 针对秒杀的业务场景,在大并发下,仅仅依靠页面缓存.对象缓存或者页面静态化等还是远远不够.数据库压力还是很大,所以需要异步下单,如果业务执行时间比较长,那么异步是最好的解决办法,但会带来一些额外 ...
- 【Redis 如何实现库存扣减操作】
在日常开发中有很多地方都有类似扣减库存的操作,比如电商系统中的商品库存,抽奖系统中的奖品库存等. 解决方案 使用mysql数据库,使用一个字段来存储库存,每次扣减库存去更新这个字段. 还是使用数据库, ...
- 扣减库存,redis你值得拥有
扯扯犊子 并发知识点总结: 1.秒杀,物理业务隔离,抽成单独的服务器 2.接口设计,防止洪流访问数据库. 3.加redis缓存. 4.缓存雪崩,一个请求,多个key同时失效,避免同时失效.多个请求,一 ...
- 基于redis实现的扣减库存
2019独角兽企业重金招聘Python工程师标准>>> 在日常开发中有很多地方都有类似扣减库存的操作,比如电商系统中的商品库存,抽奖系统中的奖品库存等. 解决方案 使用mysql数据 ...
- 电商库存设计mysql redis_基于redis实现的扣减库存
在日常开发中有很多地方都有类似扣减库存的操作,比如电商系统中的商品库存,抽奖系统中的奖品库存等. 解决方案 使用mysql数据库,使用一个字段来存储库存,每次扣减库存去更新这个字段. 还是使用数据库, ...
- Redis 如何实现库存扣减操作和防止被超卖?
Redis 如何实现库存扣减操作和防止被超卖? 在日常开发中有很多地方都有类似扣减库存的操作,比如电商系统中的商品库存,抽奖系统中的奖品库存等. 解决方案 使用mysql数据库,使用一个字段来存储库存 ...
- 06 秒杀系统“减库存”设计的核心逻辑
如果要设计一套秒杀系统,那我想你的老板肯定会先对你说:千万不要超卖,这是大前提. 如果你第一次接触秒杀,那你可能还不太理解,库存100件就卖100件,在数据库里减到0就好了啊,这有什么麻烦的?是的,理 ...
- 秒杀系统“减库存”设计的核心逻辑
如果要设计一套秒杀系统,那我想你的老板肯定会先对你说:千万不要超卖,这是大前提. 如果你第一次接触秒杀,那你可能还不太理解,库存100件就卖100件,在数据库里减到0就好了啊,这有什么麻烦的?是的,理 ...
最新文章
- python变量类型之间转换_Python变量赋值类型转换
- ZigBee TI ZStack CC2530 2.4 IAR软件版本
- 系统的延时与定时任务
- mail 命令发送附件
- 二、RabbitMQ常用交换器
- 大数据分析如何助力企业发展业务
- 从携程事件给我们警示
- Ubuntu Server Download
- android 按键,Android 7.0 Power 按键处理流程
- vue点击下载图片的实现
- SAP-MM知识精解-批次管理(01)- 概览及物料的批次启用
- Xshell5(远程终端工具)工具的安装使用 【免费】
- 电脑桌面云便签怎么设置锁屏密码?
- excel 模拟分析 - 单变量求解模拟运算表
- 再聊聊Linux IO
- 颈椎牵引器的介绍-颈托护颈
- 从 Windows 过度到 Mac 必备快捷键对照表
- matlab trendsurface,供水管网压力异常工况下的趋势面分析模型及应用_期刊网
- Kth Smallest Element in a BST
- 机架服务器的系统安装,机架服务器操作系统安装
热门文章
- matlab实例 pdf,matlab65实例教程(含语句注释).pdf
- 在idea项目中的android包不能识别_项目调试编译和部署运行
- ubuntu14.04初体会
- 由“公共类”看出的一些东西
- jQuery中的常用内容总结(一)
- iOS开发实战-基于SpriteKit的FlappyBird小游戏
- 利用box-shadow绘图
- 大龄屌丝自学笔记--Java零基础到菜鸟--028
- maven3 手动安装本地jar到仓库
- 【组队学习】【33期】吃瓜教程——西瓜书+南瓜书