大促下热点数据写(库存扣减解决方案-程序员宅基地

       针对交易系统大促场景下热点数据写优化的相关案例。当然,不同的企业有不同的解决方案和实现,但是万变不离其宗,还是那句话,对于大型网站而言,其架构一定是简单和清晰的,而不是炫技般的复杂化,毕竟解决问题采用最直接的方式直击要害才是最见效的,否则事情只会变得越来越糟

   在大部分情况下,商品库存都是直接在关系型数据库中进行扣减,那么在限时抢购活动正式开始后,那些单价比平时更给力、更具吸引力的热卖商品大家肯定都会积极踊跃的参与抢购,这必然会产生大量针对数据库同一行记录的并发更新操作。因此数据库为了保证原子性,InnoDB引擎缺省会对同一行数据记录进行加锁,把前端的并发请求变成串行操作来确保数据更新时的一致性。

 

一、在RDBMS中扣减商品库存

先来看看如果是直接在数据库中扣减库存,应该如何避免商品超卖呢?在生产环境中我们可以通过乐观锁机制来避免这个问题,所谓乐观锁,简单来说,就是在item表中建立一个version字段。假设某一个热卖商品的实际库存为n,处于性能考虑对于查询库存操作是不建议加for update的,那么在并发场景下,必然会导致多个用户拿到的stock和version都一样。因此当第1个用户成功扣减商品库存后,则需要将item表中的version加1,这样一来,当第2个用户扣减库存时,由于version不匹配,那么为了提升库存扣减的成功率,可以适当进行重试,如果库存不足,则说明商品已经售罄,反之扣减库存后version继续加1。关于在数据库中使用乐观锁扣减库存的伪代码,如下所示:


  1. public void testStock(int num) {  

  2. if (version不一致时的重试次数阈值) {  

  3.     SELECT stock,version FROM item WHERE item_id=1;  

  4. if (如果查询的指定商品存在) {  

  5. if (判断stock是否够扣减) {  

  6.              UPDATE item SET version=version+1,stock=stock-1 WHERE   

  7.                           item_id=1 AND version="+ version +";  

  8. if (扣减库存失败) {  

  9. /* version不一致时开始尝试重试 */  

  10. testStock(--num);  

  11. else {  

  12. logger.info("扣减库存成功");  

  13. }  

  14. else {  

  15. logger.warn("指定商品已售罄");  

  16. }  

  17. }  

  18. }  

如果系统前端不配合做限流消峰等处理,随意放任大量的并发更新请求直接在数据库中扣减同一热卖商品的库存数据,这将会导致线程之间相互竞争InnoDB的行锁,由于数据库中针对同一行数据的更新操作是串行执行的,那么某一个线程在未释放锁之前,其余的线程将会全部阻塞在队列中等待拿锁,并发越高时,等待的线程也就会越多,这会严重影响数据库的TPS,从而导致RT线性上升,最终可能引发系统出现雪崩。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ax8785r8C32nef593/article/details/78623635

智能推荐

R语言中计算混淆矩阵_r做混淆矩阵-程序员宅基地

文章浏览阅读249次。在混淆矩阵中,行表示预测结果,列表示真实标签。例如,上述混淆矩阵中有3个真正例(预测正确的正例)、4个真反例(预测正确的反例)、1个假正例(预测错误的正例)和2个假反例(预测错误的反例)。在R语言中,我们可以使用一些库来计算混淆矩阵,如caret和e1071。假设我们有一个二分类问题,类别分别为"正例"和"反例",并且已经得到了一个分类模型的预测结果和真实标签。通过使用R语言提供的库函数,我们可以轻松计算混淆矩阵并获取各种性能指标。除了混淆矩阵本身之外,我们还可以通过混淆矩阵对象获取其他性能指标。_r做混淆矩阵

vscode下.vue文件初始化_vscode初始化vue-程序员宅基地

文章浏览阅读1.8k次。vscode下.vue文件初始化当我们在使用vscode编写vue文件的时候,每次都需要输入<template></template>,<script></script>,<style></style>这些标签如何像我们之前一样写html使用emmet插件一样使用 !自动出来html的格式呢1 安装Vetur扩展让V..._vscode初始化vue

cglib动态代理(需导入cglib-nodep-2.1_3.jar)_导入一个架包:cglib-nodep-2.1.3.jar-程序员宅基地

文章浏览阅读1.7k次。这是一个简单的例子_导入一个架包:cglib-nodep-2.1.3.jar

【CDH】Cloudera manager 卸载并重新安装某一个节点_cdh卸载重装-程序员宅基地

文章浏览阅读2.2k次,点赞2次,收藏4次。完美卸载CDH一个节点并重新安装_cdh卸载重装

tp5缺少start.php,TP5报错Fatal error: require(): Failed opening required '/home/www/xx/public/../thinkphp...-程序员宅基地

文章浏览阅读3k次。PHP message: PHP Warning: require(/data/wwwroot/blog.sgfoot.com/bootstrap/autoload.php): failed to open stream: Operation not permitted in /data/wwwroot/blog.sgfoot.com/public/index.php on line 22PHP ..._notice: php message: php warning: require(/start.php): failed to open stream

matlab instfreq,emdPinstfreq - 源码下载|数值算法/人工智能|matlab例程|源代码 - 源码中国...-程序员宅基地

文章浏览阅读109次。emd+instfreq\instfreq.m............\package_emd\bugfix.sh............\...........\EMDs\cemdc.m............\...........\....\cemdc.mexw32............\...........\....\cemdc2.m............\...........\...._cemdc.m

随便推点

Learn from Demonstration-程序员宅基地

文章浏览阅读857次。Reference:http://blog.exbot.net/archives/249https://blog.csdn.net/weixin_43822994/article/details/85566552https://zhuanlan.zhihu.com/p/45845001https://blog.csdn.net/c2a2o2/article/details/77336551..._learn from demonstration

最新最详细的配置Node.js环境教程_node配置-程序员宅基地

文章浏览阅读1.6k次,点赞41次,收藏22次。最新最详细的配置Node.js环境教程,已经将所有坑都踩了一遍!!超级超级详细详细!!!_node配置

java web开发的mvc_java的web开发中的mvc模式-程序员宅基地

文章浏览阅读127次。mvc 1,什么是mvc? model,view,controller 是一种软件架构模式,其基本思想是:将一个软件的组成部分划分成三部分,即: 模型:封装业务逻辑 视图:数据展现,也就是表示逻辑(即将模型中提供的数据以合适的方法展示出来), 另外还提供UI(用户接口),用户通过视图向系统发送请求。 控制器:将视图与模型的关系解耦,即视图与模型的调用要通过..._web开发中的mvc

matlab粒子群运动模拟伪代码,基本粒子群优化算法(PSO)的matlab实现-程序员宅基地

文章浏览阅读1.2k次。粒子群优化算法是一种模拟鸟群社会行为的群体搜素算法。它分为全局最佳粒子优化和局部最佳粒子优化,对于全局最佳PSO,或者叫做gbest PSO,每个粒子的邻域都是整个群,其算法伪代码如下:创建并初始化一个n维的粒子群repeatfor 每个粒子i=1,2,…n do//设置个体最佳位置if f(i)y=f(i);end//设置全局最佳位置if yY=y;endendfor每个粒子i=1,2,…n ..._pso伪代码

Linux学习之CentOS(二十六)--Linux磁盘管理:LVM逻辑卷的创建及使用-程序员宅基地

文章浏览阅读370次。您可以通过点击 右下角 的按钮 来对文章内容作出评价, 也可以通过左下方的 关注按钮 来关注我的博客的最新动态。 如果文章内容对您有帮助, 不要忘记点击右下角的 推荐按钮 来支持一下哦 如果您对文章内容有任何疑问, 可以通过评论或发邮件的方式联系我: [email protected] / [email protected]如果需要转载,请注明出处,谢谢!..._can't obtain inputstream for linux-x86-64/libdwfcall.so] with root cause

chatgpt赋能python:Python中如何反转整数_python整数反转-程序员宅基地

文章浏览阅读513次。这篇文章介绍了两种Python中反转整数的方法。我们可以使用字符串反转,在将字符串转换为整数,也可以使用除余和乘法,一位位反转整数。根据实际情况和需要,选择不同的方法。无论使用哪种方法,都可以轻松实现反转整数的操作。反转一个整数虽然看起来很简单,但是这里介绍的方法可以帮助大家更好地理解Python中的字符串处理、循环和除余操作。在日常编程中,我们可以将这些技巧应用到实际的问题中。本文由chatgpt生成,文章没有在chatgpt生成的基础上进行任何的修改。以上只是chatgpt能力的冰山一角。作为通用的。_python整数反转

推荐文章

热门文章

相关标签