java 订单减库存_下单减库存(示例代码)
1. 减库存
一般下单减库存的流程大概是这样的:
1、查询商品库存。这里直接查的Redis中的库存。
2、Redis中的库存减1。这里用到的Redis命令是:incrby -1
3、扣减数据库中的库存。这里用数据库乐观锁,不用额外加锁
4、异步刷新Redis中的库存
5、定时扫描超时未支付的交易,库存加回去
总结一下这个流程就是:先减redis库存,再减数据库库存,最后刷新redis库存
用到的Redis命令可能:DECR key 或者 INCRBY key -1
更新数据库的SQL可能是这样的:
update 商品库存表 set 库存 = 库存 - 1 where 商品ID = xxx and 库存 > 0;
或者
update 商品库存表 set 库存 = 库存 - 1 where 商品ID = xxx and version = xxx;
用乐观锁是一种比较好的方式,而且一遍ID字段都有索引,可以充分利用MySQL行级锁
这种方式还有一个比较巧妙的地方是,利用redis的单线程来操作库存,而且又是原子命令,可以避免并发问题
同时,先减redis库存后可以防止后续因库存不足而造成下单失败
最后,数据库更新完以后,再通过MQ异步刷新缓存,可以使得redis中的库存误差不会太大
交易系统会定时扫描超时未支付的订单,然后用MQ异步通知订单和商品中心,将订单关闭,库存再放回去
2. 加锁
加锁(比如:基于Redis的分布式锁)
MQ可以把并行转成串行,但是并不能很好的解决并发访问的问题,只能靠锁
加锁会影响性能,但是影响不大。假设我们用Redisson分布式锁,操作redis只需要几毫秒,因此这点儿损耗不是什么大问题。都是这么玩儿的,不加锁还能怎么办呢。
3. 内存缓存
在cms管理后台修改数据后,同步或异步刷新redis缓存,同时利用zookeeper刷新内存缓存,这样就可以不用等到需要用的时候再从redis中同步。
一定要避免redis大key,最常见的就是hash key,设置的时候不注意,一不小心里面就几千个field了,这对查询非常不利,可以取模进行分片。
一定要避免HGETALL命令,利用Pinpoint可以帮助我们分析每个请求在每个操作所消耗的时候,从而有助于我们优化
数据迁移用Canal
java 订单减库存_下单减库存(示例代码)相关推荐
- java 订单减库存_下单减库存
1. 减库存 一般下单减库存的流程大概是这样的: 1.查询商品库存.这里直接查的Redis中的库存. 2.Redis中的库存减1.这里用到的Redis命令是:incrby -1 3.扣减数据库中的库存 ...
- java 高并发商城库存订单处理,下单减库存,如何解决高并发减库存问题
下单减库存,如何解决高并发减库存问题 1. 减库存 一般下单减库存的流程大概是这样的: 1.查询商品库存.这里直接查的Redis中的库存. 2.Redis中的库存减1.这里用到的Redis命令是:in ...
- 【电商经验】之商品下单减库存方案
一.下单减库存方案 在电商项目中设计商品下单减库存时有两种典型的方案: 下单后减库存 付款后减库存 这两种减库存方案都有各自的优缺点,没有说哪种是最好的,主要看业务场景适合哪种. 1.下单后减库存 用 ...
- Java Singleton类中的线程安全性的示例代码
Java Singleton类中的线程安全性的示例代码 Singleton是最广泛使用的创建设计模式之一,用于限制应用程序创建对象.在实际应用程序中,数据库连接或企业信息系统(EIS)等资源是有限的, ...
- 纯java pdf转换成html,JAVA实现PDF转HTML文档的示例代码
本文是基于PDF文档转PNG图片,然后进行图片拼接,拼接后的图片转为base64字符串,然后拼接html文档写入html文件实现PDF文档转HTML文档. 引入Maven依赖 org.apache.p ...
- 电商扣减库存_电商库存体系设计
库存是什么? 百度百科:库存(inventory)是以支持生产,维护,操作和客户服务为目的而存储的各种物料,包括原材料和在制品,维修件和生产消耗品,成品和备件等: 狭义:"仓库里存放东西&q ...
- java订单实现的_订单的处理原理及代码实现.
上一篇博文我们已经介绍了购物车的原理及实现, 那么购物车再往后就是提交订单了, 订单的实现方式是怎么样的呢? 那么下面就让我们来一起学习下. 提交订单有几个关键点: 1, 用户必须登录 2, 购物车必 ...
- java实现区域生长算法_区域生长算法(附MATLAB代码实现)
标签: 一.理论概念 区域生长是按照事先定义的生长准则将一个像素或者子区域逐步聚合成一个完整独立的连通区域过程.对于图像感兴趣目标区域R,z为区域R上事先发现的种子点,按照规定的生长准则逐步将与种子点 ...
- java鼠标指针锤子_深入剖析锤子onestep代码实现 - 上篇
OneStep的四大功能 自身设置 设置(添删图标,图标排序),onestep模式进入.退出 应用切换 启动.切换应用,包括联系人图标,直达联系人对话页面 拖拽分享 拖拽图片.文字到侧边栏图标,然后分 ...
最新文章
- maven项目中,如何导出项目所有的jar
- Date、DateFormat、Calendar日期类
- 你人脉网中应该有的10种人
- 深入探究.Net Core Configuration读取配置的优先级
- Sentinel(三)之如何使用
- mac上sublime配置php环境,Mac下sublime text3如何配置php编译环境?
- Transformer的学习笔记
- 中英文对照 —— 生物学基本概念
- 系统学习机器学习之参数方法(三)
- Android 使用字符串动态获取资源ID
- Miracle密码算法开源库(十二)分析 :mrflsh3.c
- 计算机一黑屏就显示当前账户已锁定,电脑黑屏用户已锁定账户怎么办?
- O2O商业模式目前的状态需看透什么?未来会呈现怎样的特征?
- C# word 操作进阶-05-复制表格[转载]
- (Adventure项目)自行车业务数据分析报告(五)
- 织梦采集-织梦采集教程-织梦采集插件下载教程
- red5源码分析---12
- VCS和Verdi学习
- Flutter | 和小老弟一起学资源管理
- Qemu虚拟化PowerPc
热门文章
- 电网企业与发电企业基础
- Echarts数据可视化框架
- 专家论剑人工智能 技术远未成熟
- OpenResty 最佳实践学习--实战演习笔记(4)
- 标注神器 | Label-Studio X SAM 半自动化标注
- 用AAS 模板写Latex 教程
- iOS 8 用户可以使用 iPhone 或 iPad 的 mic 识别歌曲名称和歌手信息
- 1077 Kuchiguse (20分)
- 吉祥止止 | 天空卫士旗下两家公司分别荣获“国家专精特新小巨人”和“北京市专精特新”企业
- 记录配置打印机遇到的三个问题