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 订单减库存_下单减库存相关推荐

  1. java 订单减库存_下单减库存(示例代码)

    1. 减库存 一般下单减库存的流程大概是这样的: 1.查询商品库存.这里直接查的Redis中的库存. 2.Redis中的库存减1.这里用到的Redis命令是:incrby -1 3.扣减数据库中的库存 ...

  2. java 高并发商城库存订单处理,下单减库存,如何解决高并发减库存问题

    下单减库存,如何解决高并发减库存问题 1. 减库存 一般下单减库存的流程大概是这样的: 1.查询商品库存.这里直接查的Redis中的库存. 2.Redis中的库存减1.这里用到的Redis命令是:in ...

  3. 【电商经验】之商品下单减库存方案

    一.下单减库存方案 在电商项目中设计商品下单减库存时有两种典型的方案: 下单后减库存 付款后减库存 这两种减库存方案都有各自的优缺点,没有说哪种是最好的,主要看业务场景适合哪种. 1.下单后减库存 用 ...

  4. 电商扣减库存_电商库存体系设计

    库存是什么? 百度百科:库存(inventory)是以支持生产,维护,操作和客户服务为目的而存储的各种物料,包括原材料和在制品,维修件和生产消耗品,成品和备件等: 狭义:"仓库里存放东西&q ...

  5. java订单实现的_订单的处理原理及代码实现.

    上一篇博文我们已经介绍了购物车的原理及实现, 那么购物车再往后就是提交订单了, 订单的实现方式是怎么样的呢? 那么下面就让我们来一起学习下. 提交订单有几个关键点: 1, 用户必须登录 2, 购物车必 ...

  6. 分布式锁和mysql事物扣库存_浅谈库存扣减和锁

    先说场景: 物品W现在库存剩余1个,  用户P1,P2同时购买.则只有1人能购买成功.(前提是不允许超卖) 秒杀也是类似的情况, 只有1件商品,N个用户同时抢购,只有1人能抢到.. 这里不谈秒杀设计, ...

  7. java日期减天数_使用Java中的Calendar.DATE从当前日期减去天数

    为Java中的Calendar类导入以下软件包.import java.util.Calendar; 首先,创建一个Calendar对象并显示当前日期.Calendar calendar = Cale ...

  8. 分布式锁和mysql事物扣库存_这个是真的厉害,高并发场景下的订单和库存处理方案,讲的很详细了!...

    前言 之前一直有小伙伴私信我问我高并发场景下的订单和库存处理方案,我最近也是因为加班的原因比较忙,就一直没来得及回复.今天好不容易闲了下来想了想不如写篇文章把这些都列出来的,让大家都能学习到,说一千道 ...

  9. 电商扣减库存_二类电商:鲁班今日最新消息!

    了解更多,点击上方蓝字关注我吧 [小店'美妆个护'行业禁限售商品需求收集] 小店平台目前针对部分品类做了较为严格的禁限售要求,存在部分优质商品在站外销量火爆但在抖音无法售卖的情况.如您有这部分的投放需 ...

最新文章

  1. 《计算机组成与体系结构:性能设计》读后小记 11、指令集:寻址方式和指令格式...
  2. SAMBA服务和FTP服务讲解(week3_day1)--技术流ken
  3. jsp servlet中的过滤器Filter配置总结(转)
  4. RTX5 | 线程管理03 - 线程退出osThreadExit
  5. 程序员自救指南:一不小心删库删表怎么办?
  6. C/C++中的关键字
  7. c++switch语句中不能进行变量定义吗_Go 指南--控制流语句
  8. mac中 安装mysql无法启动_Mac 下安装MySQL(dmg方式),无法启动
  9. 查询iphone邮箱服务器,iPhone上的各种邮箱设置
  10. Colab+Google使用教程
  11. HTML表格表格标签的属性
  12. mysql值为空返回0 ,否则 返回1
  13. 电脑组装好了开机完全没反应?
  14. Canvas 从 0 到 1 -- 开发 2D 游戏《保卫家园》-- 【上篇】
  15. Shell发送邮件+附件
  16. php图片无损压缩的问题解决(推荐)
  17. 自考学历和成考学历哪个更高一些 有啥区别
  18. JavaScript 数字格式化怎么写(#,##.00) (实用,赞)
  19. exfat fat_正确的名称是exFAT还是FAT64?
  20. 9.7-一定要开始学了

热门文章

  1. 学大伟业:在数学竞赛学习中,你属于哪种类型?
  2. 教授专栏08| 徐岩:青年震荡与青年危机
  3. 内网远程控制软件哪个好用
  4. java排查full gc_一次频繁Full GC问题排查过程分享
  5. 小米12、小米12x和小米12pro的区别
  6. web平台使用threejs实现三维视频融合的思路
  7. ACT技能编辑器的制作经验
  8. 反思抑郁症的原因:抑郁症能否遗传?
  9. java关注列表_如何从一个Instagram帐户中获取关注者列表?
  10. 显卡测试软件毛毛虫,ATI Radeon Xpress200M与Intel GMA950谁强些?