Redis解决库存超卖问题(下)

本文涉及的产品
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 商品服务的库存变化时,通过 MQ 通知订单服务库存变化。

redis库存和mysql库存

支付前是预扣,是扣redis库存,是锁定库存的过程

支付后是真正扣,扣mysql库存,保证库存最终一致

但是,在极端情况下会存在数据不一致

如果redis库存 = mysql库存,不会有问题

如果redis库存 < mysql库存,不会有超卖问题,但会存在实际有库存,但是没有卖的情况

如果redis库存 > mysql库存,就会超卖,超卖的订单,在出库的过程中会失败

这样总体不会出问题,mysql数据库层,保证库存最终不会出问题。

问题

数据库库存和redis库存不一致,如何检测?

如果检测出来不一致,如何同步

没有想出来好的方案

比较暴力的方式,就是找一个低峰期,譬如凌晨1点,周期性强行覆盖。 但是极端情况下还是会存在同步后不准确,譬如在同步的过程中,刚好有一个订单在支付,这个订单支付成功后,出库的过程中,扣除了mysql的库存,但是没有扣除redis的库存


这个就是数据库同步缓存的更新机制方面的问题

属于一致性的逻辑设计的问题

缓存数 = 数据库库存数 - 待扣数

当然这里面也还有其它的方案,以及考虑到一致性的要求高低,可以使用简单或复杂的方案

就看系统复杂度了,越是大系统就要拆得越细

比如待扣数又可以放到一个队列里面,或者缓存里面,同时有计数,直接读计数就行

比如放到mongo,已支付待出库的数量,一般也不会很大,count一下,也不会损失多少

所以一般系统都不能完全保障数据链不出错,但一定要有补偿,就是出错了可以纠错

要保障不出错的代价显然太大

同步是有一套刷新机制,可以定时,也可以通过MQ,或者监控不一至同步等等。。。

也叫做保障缓存数据的新鲜度

一般不会太长时间,半小时,几分钟都有可能,不同场景需求不一样

12306

买火车票的12306,晚上的时间都不能买票,这个时间估计是在同步库存,将数据库库存同步到redis库存中, 但是买火车票之类,在订单生成前,必须扣除实际库存,也就是要扣除mysql的库存,

因为买火车票和购物不一样,购物可以付款后出库,但是买票这种,支付前就必须出库,因此,要将出库过程提前, 只有出库成功,才能生成订单,同样要引入redis库存


先扣缓存中的库存,扣除成功后,然后才可以去扣mysql中的库存。


如果扣除缓存中的库存失败,就会挡在外面,返回库存不足,这些请求不会穿刺到mysql中,挡住了大多数的请求压力。

redis库存会和mysql库存不一致,极端情况下是肯定有的,需要进行库存同步

  • 当缓存库存比数据库库存多,那么就会出现,查询有票,但是就无法下单,下单的时候就说库存不足,这个情况下,就会造成数据库压力过大,不过12306应该有其他手段来规避这个问题,不过,我确实遇到过,查询的时候有票,但是无法下单的情况。
  • 当缓存库存比数据库缓存少,那么不会出问题,只会出现有票,但是没有出售的情况,等完成库存同步一下, 明天又准确了。
目录
相关文章
|
缓存 NoSQL Redis
Redis高并发场景下秒杀超卖解决
Redis高并发场景下秒杀超卖解决
941 0
|
监控 NoSQL Java
Redis之高并发超卖问题解决方案
在高并发的秒杀抢购场景中,常常会面临一个称为“超卖”(Over-Selling)的问题。超卖指的是同一件商品被售出的数量超过了实际库存数量,导致库存出现负数。这是由于多个用户同时发起抢购请求,而系统未能有效地控制库存的并发访问。
1374 0
|
11月前
|
缓存 NoSQL 算法
高并发秒杀系统实战(Redis+Lua分布式锁防超卖与库存扣减优化)
秒杀系统面临瞬时高并发、资源竞争和数据一致性挑战。传统方案如数据库锁或应用层锁存在性能瓶颈或分布式问题,而基于Redis的分布式锁与Lua脚本原子操作成为高效解决方案。通过Redis的`SETNX`实现分布式锁,结合Lua脚本完成库存扣减,确保操作原子性并大幅提升性能(QPS从120提升至8,200)。此外,分段库存策略、多级限流及服务降级机制进一步优化系统稳定性。最佳实践包括分层防控、黄金扣减法则与容灾设计,强调根据业务特性灵活组合技术手段以应对高并发场景。
3253 7
|
存储 NoSQL Java
从扣减库存场景来讲讲redis分布式锁中的那些“坑”
本文从一个简单的库存扣减场景出发,深入分析了高并发下的超卖问题,并逐步优化解决方案。首先通过本地锁解决单机并发问题,但集群环境下失效;接着引入Redis分布式锁,利用SETNX命令实现加锁,但仍存在死锁、锁过期等隐患。文章详细探讨了通过设置唯一标识、续命机制等方法完善锁的可靠性,并最终引出Redisson工具,其内置的锁续命和原子性操作极大简化了分布式锁的实现。最后,作者剖析了Redisson源码,揭示其实现原理,并预告后续关于主从架构下分布式锁的应用与性能优化内容。
543 0
|
NoSQL Redis
Redis系列学习文章分享---第五篇(Redis实战篇--优惠券秒杀,全局唯一id 添加优惠券 实现秒杀下单 库存超卖问题分析 乐观锁解决超卖 实现一人一单功能 集群下的线程并发安全问题)
Redis系列学习文章分享---第五篇(Redis实战篇--优惠券秒杀,全局唯一id 添加优惠券 实现秒杀下单 库存超卖问题分析 乐观锁解决超卖 实现一人一单功能 集群下的线程并发安全问题)
596 0
|
NoSQL 安全 Redis
解决秒杀系统库存超卖问题:乐观锁与Redis分布式锁的应用
解决秒杀系统库存超卖问题:乐观锁与Redis分布式锁的应用
3325 0
|
存储 缓存 NoSQL
Redis 如何实现库存扣减操作和防止被超卖?
电商当项目经验已经非常普遍了,不管你是包装的还是真实的,起码要能讲清楚电商中常见的问题,比如库存的操作怎么防止商品被超卖
1745 0
|
缓存 监控 NoSQL
Redis分布式锁解决超卖问题
Redis分布式锁解决超卖问题
|
NoSQL 安全 Java
Redis(二十三)-秒杀案例之超卖和超时问题解决
上一篇文章我们介绍秒杀案例的基本实现 Redis(二十二)-秒杀案例的基本实现以及用ab工具模拟并发。但是在文章的最后留了两个问题没有解决,一个是高并发情况下的超卖问题,以及jedis客户端请求超时问题。这篇文章就是来解决这两篇问题。
380 0
Redis(二十三)-秒杀案例之超卖和超时问题解决
|
NoSQL Redis
Redis(二十四)-秒杀案例之库存遗留问题解决
上一篇文章Redis(二十三)-秒杀案例之超卖和超时问题解决 我们介绍了超卖和超时问题的解决,最后还留了一个问题—库存遗留问题。这篇文章就来介绍下如何解决库存遗留问题。
620 0