库存扣减还有这么多方案? | 架构师之路

本文涉及的产品
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS AI 助手,专业版
简介: 原以为两个核心观点应该是没有疑义的,结果很多朋友说方案不好,今天交流下部分回复的方案,个人的一些看法。

昨天一篇《库存扣多了,到底怎么整》,核心观点是:

用“设置库存”替代“扣减库存”,以保证幂等性

使用CAS乐观锁,在“设置库存”时加上原始库存的比对,避免数据不一致

文章非常多朋友留言发表观点,“架构师之路”能引发不少同学思考,甚是欣慰。

原以为两个核心观点应该是没有疑义的,结果很多朋友说方案不好,今天交流下部分回复的方案,个人的一些看法。

留言一

是否能使用

update stock set num=num-$count where sid=$sid and stock>=$count;

的方式扣减库存?

回答:这个方案无法保证幂等性,有可能出现重复扣减。

留言二

把库存放到reids里,利用redis的事务性来扣减库存。

分析:

redis是如何实现事务操作的?

本质也是乐观锁。

在redis客户端执行:

$num = GET key

$num = $num - $count

SET key $num

在并发量大的时候,会遇到和《库存扣多了,到底怎么整》文章中一样的并发一致性问题。

redis的WATCH和EXEC可以提供类似事务的机制:

WATCH观察key是否被改动

如果提交时key被改动,EXEC将返回null,表示事务失败

上面保证一致性的库存扣减可能类似于这样执行:

WATCH key

$num = GET key

$num = $num - $count

MULTI

SET key $num

EXEC

在WATCH之后,EXEC执行之前,如果key的值发生变化,则EXEC会失败。

redis的WATCH为何能够保证事务性,本质上,它使用的就是乐观锁CAS机制。

大部分情况下,redis不同的客户端会访问不同的key,所以WATCH碰撞的概率会比较小,在秒杀的业务场景,即使使用WATCH,调用侧仍然需要重试。

在CAS机制这一点上,redis和mysql相比没有额外的优势。

redis的性能之所以高,还是redis内存访问与mysql数据落盘的差异导致的。内存访问的不足是,数据具备“易失性”,如果重启,可能导致数据的丢失。当然redis也可以固化数据,难道每次都刷盘?redis真心没法当作mysql用。

最后,redis用单线程来避免物理锁,但mysql多线程也有多线程并发的优势。

回答:可以使用redis的事务性扣减库存,但在CAS机制上比mysql没有优势,高性能是因为其内存存储的原因,带来的副作用是数据有丢失风险,具体怎么用,还得结合业务折衷(任何脱离业务的架构设计都是耍流氓)。

柳岩三

支持幂等能否使用客户端token,业务流水?

能否使用时间戳,版本号来保证一致性?

回答:可以。

留言四

能否使用队列,在数据库侧串行执行,降低锁冲突?

回答:可以。

留言五

能否使用事务?

回答:容易死锁,吞吐量很低,不建议。

留言六

能否使用分布式锁解决,例如setnx, mc, zookeeper?

回答:可以,但吞吐量真的高么。

留言六

文章重点讲了幂等性和一致性,没有深入展开讲高吞吐,利用缓存抗读请求,利用水平扩展增加性能是提升吞吐量的根本方案。

回复:很中肯。

留言1-6代表了评论的多个观点,由于时间有限,《库存扣多了,到底怎么整》许多地方没有讲清楚,大伙见谅。

目录
相关文章
|
6月前
|
网络协议 NoSQL API
转转客服IM系统的WebSocket集群架构设计和部署方案
客服IM系统是转转自研的在线客服系统,是用户和转转客服沟通的重要工具,主要包括机器人客服、人工客服、会话分配、技能组管理等功能。在这套系统中,我们使用了很多开源框架和中间件,今天讲一下客服IM系统中WebSocket集群的的实践和应用。
537 141
|
8月前
|
SQL 存储 供应链
如何开发ERP系统中的库存管理板块(附架构图+流程图+代码参考)
本文介绍如何通过ERP系统实现企业库存管理的数字化与自动化,涵盖仓库管理、库位管理、出入库操作、库存调拨与盘点等功能设计,并提供开发技巧及代码参考,帮助企业提升库存管理效率,减少错误与资源浪费。
|
8月前
|
消息中间件 供应链 前端开发
如何开发进销存系统中的库存管理板块?(附架构图+流程图+代码参考)
进销存系统中的库存管理是企业运营关键环节,影响效率、资金周转与物流成本。本文详解库存管理概念、模块结构、业务流程及开发技巧,通过示例代码展示入库、出库等功能实现,助力企业优化库存管理,提升运作效率。
|
7月前
|
存储 供应链 前端开发
如何开发仓库管理系统中的库存管理板块 ?(附架构图+流程图+代码参考)
本文介绍仓库管理系统(WMS)中库存管理模块的开发,涵盖系统简介、库存管理功能设计、业务流程分析、开发技巧与代码示例,以及实现效果和常见问题解答,帮助企业实现高效、精准的库存管理。
|
6月前
|
供应链 监控 JavaScript
如何开发ERP(离散制造-MTO)系统中的库存管理板块(附架构图+流程图+代码参考)
本文详解MTO模式下ERP库存管理的关键作用,涵盖核心模块、业务流程、开发技巧与代码示例,助力制造企业提升库存周转率、降低缺货风险,实现高效精准的库存管控。
|
6月前
|
消息中间件 监控 Cloud Native
高效设计:支持亿级用户社交关系的100W QPS架构方案
面对亿级用户与百万QPS的高并发场景,性能测试成为系统稳定的关键。本文剖析真实业务痛点,详解从接口压测、全链路监控到瓶颈定位的完整性能体系,助你掌握大厂级性能优化能力,从容应对卡顿、宕机等线上挑战。
|
6月前
|
存储 监控 NoSQL
Redis高可用架构全解析:从主从复制到集群方案
Redis高可用确保服务持续稳定,避免单点故障导致数据丢失或业务中断。通过主从复制实现数据冗余,哨兵模式支持自动故障转移,Cluster集群则提供分布式数据分片与水平扩展,三者层层递进,保障读写分离、容灾切换与大规模数据存储,构建高性能、高可靠的Redis架构体系。
|
边缘计算 Kubernetes 物联网
Kubernetes 赋能边缘计算:架构解析、挑战突破与实践方案
在物联网和工业互联网快速发展的背景下,边缘计算凭借就近处理数据的优势,成为解决云计算延迟高、带宽成本高的关键技术。而 Kubernetes 凭借统一管理、容器化适配和强大生态扩展性,正逐步成为边缘计算的核心编排平台。本文系统解析 Kubernetes 适配边缘环境的架构分层、核心挑战与新兴解决方案,为企业落地边缘项目提供实践参考。
558 0
|
12月前
|
监控 Java Nacos
阿里二面:10亿级分库分表,如何丝滑扩容、如何双写灰度?阿里P8方案+ 架构图,看完直接上offer!
阿里二面:10亿级分库分表,如何丝滑扩容、如何双写灰度?阿里P8方案+ 架构图,看完直接上offer!
阿里二面:10亿级分库分表,如何丝滑扩容、如何双写灰度?阿里P8方案+ 架构图,看完直接上offer!
|
8月前
|
缓存 Java 数据库
Java 项目分层架构实操指南及长尾关键词优化方案
本指南详解基于Spring Boot与Spring Cloud的Java微服务分层架构,以用户管理系统为例,涵盖技术选型、核心代码实现、服务治理及部署实践,助力掌握现代化Java企业级开发方案。
362 2

热门文章

最新文章