聊聊高并发下超卖,少卖的解决方案

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: 聊聊高并发下超卖,少卖的解决方案

1、超卖的解决方案

①、想到  悲观锁

select   t.*  from product where id  for update; 
//  表锁  myISAM   mysql   默认是 innoDB 作为存储引起, 它使用的是行锁。
update  product set count = count -1 where id = #{id};
rollback;    //  要么提交事务
commit;    //  要么回滚事务

这里  用了 数据库的悲观锁,  这个条件下id  会被枷锁,  其他来执行的时候会一直等待,  但若是其他线程来请求过来,会一直 占有数据库连接, 导致 mysql 数据库连接数过多, 导致后面的mysql 的连接中断,或者超时。 使mysql 数据库崩溃。

②、 想到 乐观锁

select stock_count  from product where id =  #{id}
update product set t.stock_count  = t.stock_count -1 where id = #{id}  and t.stock_count = #{stockCount};

cas 操作  执行  会影响  事务日志执行 过程中繁琐,  每次记录的日志都要   undo log,

或者 redo log,binlog,导致大量的这种日志文件。一定程度上影响MySQL 的性能

1.redo log通常是物理日志,记录的是数据页的物理修改,而不是某一行或某几行修改成怎样怎样,它用来恢复提交后的物理数据页(恢复数据页,且只能恢复到最后一次提交的位置)。

2.undo用来回滚行记录到某个版本。undo log一般是逻辑日志,根据每行记录进行记录

3、二进制日志(binlog): 1,用于复制,在主从复制中,从库利用主库上的binlog进行重播,实现主从同步。2,用于数据库的基于时间点的还原。

③、 sql 上进行 优化  执行

 update  product set stock_count =
                  case when stock_count >= #{quantity}
                         then sotck_count - #{quantity}
                   else
                         stock_count
                   end
         where id = #{id}

2、少卖的解决方案

   redis 进行 库存的增减

    在redis 进行减库存 , 当  stock  < 0 时, 若是 减失败了, 就需要加回来这个库存。不然就会出现少卖的情况,利用 redis 的 发布 订阅模式, 可以监听到库存的变化, 但是 redis 这边成功, 但是同步数据库的时候失败了,   就会导致数据库中实际还有库存,但redis 上 却没有库存了, 这样 怎么解决数据库  和 redis 之间的 强一致性,  但是做到实时的强一致性也很困难,毕竟redis 缓存到数据库之间 是有一定的时间差,这个 方案 也不是可取 的  , 有什么较好的补偿机制嘛? 回去想想???

redis  发布-订阅 模式



订阅,发布中监听减库存说一下。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
7月前
|
消息中间件 安全 NoSQL
2023春招面试专题:高并发解决方案(三)
2023春招面试专题:高并发解决方案
129 0
|
7月前
|
缓存 NoSQL 数据库
2023春招面试专题:高并发解决方案
2023春招面试专题:高并发解决方案
|
7月前
|
监控 NoSQL Java
Redis之高并发超卖问题解决方案
在高并发的秒杀抢购场景中,常常会面临一个称为“超卖”(Over-Selling)的问题。超卖指的是同一件商品被售出的数量超过了实际库存数量,导致库存出现负数。这是由于多个用户同时发起抢购请求,而系统未能有效地控制库存的并发访问。
519 0
|
缓存 NoSQL Redis
Redis高并发场景下秒杀超卖解决
Redis高并发场景下秒杀超卖解决
429 0
|
11天前
|
缓存 NoSQL Java
高并发场景秒杀抢购超卖Bug实战重现
在电商平台的秒杀活动中,高并发场景下的抢购超卖Bug是一个常见且棘手的问题。一旦处理不当,不仅会引发用户投诉,还会对商家的信誉和利益造成严重损害。本文将详细介绍秒杀抢购超卖Bug的背景历史、业务场景、底层原理以及Java代码实现,旨在帮助开发者更好地理解和解决这一问题。
38 12
|
4月前
|
算法 关系型数据库 MySQL
技术分享:600W QPS高并发ID设计与时钟回拨解决方案
【8月更文挑战第26天】在大型分布式系统中,高并发ID生成和时钟同步是两个至关重要的技术挑战。随着业务量的快速增长,如美团点评的金融、支付、餐饮等业务场景,每秒需要处理数百万级别的请求,这就对ID的生成效率和唯一性提出了极高要求。同时,时钟回拨问题也时常困扰着系统管理员,影响数据一致性和系统稳定性。本文将围绕这两个主题,分享一些工作学习中的技术干货。
69 1
|
6月前
|
存储 缓存 NoSQL
Redis是一种高性能的内存数据库,常用于高并发环境下的缓存解决方案
【6月更文挑战第18天】**Redis摘要:** 高性能内存数据库,擅长高并发缓存。数据存内存,访问迅速;支持字符串、列表等多元数据类型;具备持久化防止数据丢失;丰富命令集便于操作;通过节点集群实现数据分片与负载均衡,增强可用性和扩展性。理想的缓存解决方案。
90 1
|
6月前
|
缓存 NoSQL Java
高并发场景下缓存+数据库双写不一致问题分析与解决方案设计
高并发场景下缓存+数据库双写不一致问题分析与解决方案设计
|
6月前
|
存储 监控 NoSQL
MongoDB分片:打造高性能大数据与高并发处理的完美解决方案
MongoDB分片:打造高性能大数据与高并发处理的完美解决方案
309 0
|
7月前
|
SQL 缓存 NoSQL
2023春招面试专题:高并发解决方案(二)
2023春招面试专题:高并发解决方案
183 0