欢迎关注方志朋的博客,回复”666“获面试宝典

Redis预减库存:主要思路减少对数据库的访问,之前的减库存,直接访问数据库,读取库存,当高并发请求到来的时候,大量的读取数据有可能会导致数据库的崩溃。

思路:

  1. 系统初始化的时候,将商品库存加载到Redis 缓存中保存

  2. 收到请求的时候,现在Redis中拿到该商品的库存值,进行库存预减,如果减完之后库存不足,直接返回逻辑Exception就不需要访问数据库再去减库存了,如果库存值正确,进行下一步

  3. 将请求入队,立即给前端返回一个值,表示正在排队中,然后进行秒杀逻辑,后端队列进行秒杀逻辑,前端轮询后端发来的请求,如果秒杀成功,返回秒杀,成功,不成功就返回失败。

(后端请求 单线程 出队,生成订单,减少库存,走逻辑)前端同时轮询

  1. 前端显示

第一步:预减库存

/*** 秒杀接口优化之---   第一步:  系统初始化后就将所有商品库存放入 缓存*/
@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预减库存,减少对数据库访问方案相关推荐

  1. 【Java秒杀方案】11.功能开发-【商品秒杀及优化】防止超卖 接口优化(redis预减库存,内存标记减少redis访问,RabbitMQ异步下单) 安全优化(隐藏秒杀接口,验证码,接口防刷)

    商品秒杀核心功能及优化 1. 正常秒杀流程 在商品详情页面等待秒杀倒计时–http://localhost:8080/goodsDetail.htm?goodsId=2 倒计时为0,开始秒杀,点[秒杀 ...

  2. java 消息队列 秒杀_【IDEA+SpringBoot+Java商城秒杀实战21】高并发秒杀系统接口优化 RabbitMQ异步下单...

    问题: 针对秒杀的业务场景,在大并发下,仅仅依靠页面缓存.对象缓存或者页面静态化等还是远远不够.数据库压力还是很大,所以需要异步下单,如果业务执行时间比较长,那么异步是最好的解决办法,但会带来一些额外 ...

  3. 【Redis 如何实现库存扣减操作】

    在日常开发中有很多地方都有类似扣减库存的操作,比如电商系统中的商品库存,抽奖系统中的奖品库存等. 解决方案 使用mysql数据库,使用一个字段来存储库存,每次扣减库存去更新这个字段. 还是使用数据库, ...

  4. 扣减库存,redis你值得拥有

    扯扯犊子 并发知识点总结: 1.秒杀,物理业务隔离,抽成单独的服务器 2.接口设计,防止洪流访问数据库. 3.加redis缓存. 4.缓存雪崩,一个请求,多个key同时失效,避免同时失效.多个请求,一 ...

  5. 基于redis实现的扣减库存

    2019独角兽企业重金招聘Python工程师标准>>> 在日常开发中有很多地方都有类似扣减库存的操作,比如电商系统中的商品库存,抽奖系统中的奖品库存等. 解决方案 使用mysql数据 ...

  6. 电商库存设计mysql redis_基于redis实现的扣减库存

    在日常开发中有很多地方都有类似扣减库存的操作,比如电商系统中的商品库存,抽奖系统中的奖品库存等. 解决方案 使用mysql数据库,使用一个字段来存储库存,每次扣减库存去更新这个字段. 还是使用数据库, ...

  7. Redis 如何实现库存扣减操作和防止被超卖?

    Redis 如何实现库存扣减操作和防止被超卖? 在日常开发中有很多地方都有类似扣减库存的操作,比如电商系统中的商品库存,抽奖系统中的奖品库存等. 解决方案 使用mysql数据库,使用一个字段来存储库存 ...

  8. 06 秒杀系统“减库存”设计的核心逻辑

    如果要设计一套秒杀系统,那我想你的老板肯定会先对你说:千万不要超卖,这是大前提. 如果你第一次接触秒杀,那你可能还不太理解,库存100件就卖100件,在数据库里减到0就好了啊,这有什么麻烦的?是的,理 ...

  9. 秒杀系统“减库存”设计的核心逻辑

    如果要设计一套秒杀系统,那我想你的老板肯定会先对你说:千万不要超卖,这是大前提. 如果你第一次接触秒杀,那你可能还不太理解,库存100件就卖100件,在数据库里减到0就好了啊,这有什么麻烦的?是的,理 ...

最新文章

  1. python变量类型之间转换_Python变量赋值类型转换
  2. ZigBee TI ZStack CC2530 2.4 IAR软件版本
  3. 系统的延时与定时任务
  4. mail 命令发送附件
  5. 二、RabbitMQ常用交换器
  6. 大数据分析如何助力企业发展业务
  7. 从携程事件给我们警示
  8. Ubuntu Server Download
  9. android 按键,Android 7.0 Power 按键处理流程
  10. vue点击下载图片的实现
  11. SAP-MM知识精解-批次管理(01)- 概览及物料的批次启用
  12. Xshell5(远程终端工具)工具的安装使用 【免费】
  13. 电脑桌面云便签怎么设置锁屏密码?
  14. excel 模拟分析 - 单变量求解模拟运算表
  15. 再聊聊Linux IO
  16. 颈椎牵引器的介绍-颈托护颈
  17. 从 Windows 过度到 Mac 必备快捷键对照表
  18. matlab trendsurface,供水管网压力异常工况下的趋势面分析模型及应用_期刊网
  19. Kth Smallest Element in a BST
  20. 机架服务器的系统安装,机架服务器操作系统安装

热门文章

  1. matlab实例 pdf,matlab65实例教程(含语句注释).pdf
  2. 在idea项目中的android包不能识别_项目调试编译和部署运行
  3. ubuntu14.04初体会
  4. 由“公共类”看出的一些东西
  5. jQuery中的常用内容总结(一)
  6. iOS开发实战-基于SpriteKit的FlappyBird小游戏
  7. 利用box-shadow绘图
  8. 大龄屌丝自学笔记--Java零基础到菜鸟--028
  9. maven3 手动安装本地jar到仓库
  10. 【组队学习】【33期】吃瓜教程——西瓜书+南瓜书