`

秒杀核心设计(减库存部分)-防超卖与高并发

 
阅读更多


http://f.dataguru.cn/thread-485176-1-1.html
(出处: 炼数成金)
from: http://www.tuicool.com/articles/Bfa63e6

              商品详情页面的静态化,varnish加速,秒杀商品库独立部署服务器这种就略过不讲了。只讨论库存部分的优化
      mysql配置层面的优化可以参考我的这篇文章    《关于mysql innodb引擎性能优化的一点心得》  
  重点设计在数据库层面。
  2张表:
  第一张:判重表(buy_record),该用户有没秒杀过该商品
  字段: id, uid, goods_id, addtime
  第二张表:商品表 goods
  字段: goods_id   goods_num
      方案1:  
  start transaction;
  select id from buy_record where uid=$uid and goods_id=$goods_id;
  if(结果不为空)
      抛异常,回滚。
  insert into buy_record。。。
  if(受影响行数<=0)
          抛异常,回滚。。。  
  select goods_num from goods where goods_id=$good_id;
  if(库存<=0)
          抛异常,回滚。。。  
  update goods set goods_num=goods_num-1 where goods_id=$goods_id;
  if(受影响行数<=0)
      该方法在高并发下几乎必然导致超卖。当库存为1的时候刚好多个用户同时    select goods_num from goods where goods_id=$good_id;此时库存刚好大于0,做update操作的时候必然减到小于0.  同时上面进行是否秒杀过的判重同样会出现类似问题  
      方案二:  
  start transaction;
      select id from buy_record where uid=$uid and goods_id=$goods_id          for       update        ;  
  if(结果不为空)
      抛异常,回滚。
  insert into buy_record。。。
  if(受影响行数<=0)
      抛异常,回滚。。。
      select goods_num from goods where goods_id=$good_id    for update    ;  
  if(库存<=0)
      抛异常,回滚。。。
      update goods set goods_num=goods_num-1     where goods_id=$goods_id    ;  
  if(受影响行数<=0)
      抛异常,回滚。。。
      该方法有效的防止了超卖,但是在每次select的时候加上了排它锁,每次select操作都会被堵塞    ,并发性能大大降低。  
            方案三:              对(uid,goods_id)加唯一索引!!      
  start transaction;
      insert into buy_record。。。  
  if(唯一索引报错?)
      抛异常,已经秒过了,回滚。。。
            update goods set goods_num=goods_num-1                         where goods_id=$goods_id          and                goods_num>0            ;      
  if(受影响行数<=0)
      抛异常,商品秒完了,回滚。。。
      该方法完美的解决了超卖与select排它锁导致的并发低的问题,并且4个sql缩减成2个sql语句。极大提升性能  

分享到:
评论

相关推荐

    高并发秒杀案例

    这里,我们将围绕“高并发秒杀案例”这一主题,结合使用SpringMVC和Mybatis两大技术框架,深入探讨如何设计和实现一个能够承受高并发压力的秒杀功能。 首先,我们需要理解SpringMVC作为一款强大的Web MVC框架,它...

    基于springmvc高并发秒杀系统

    代码设计风格基于RESTful,以c3p0作为连接池,Redis数据库为媒介实现高并发技术。其中,对于相关的DAO,Service操作,均添加了Junit单元测试实例。 开发文档 一、业务分析 1.秒杀系统业务流程 2.秒杀业务的核心...

    spring boot高并发秒杀测试.zip

    demo.git准备使用docker-compose启动redis服务器(可以用其他方式命令启动)理念启动测试项目jmeter测试高并发杀-重新超卖问题.jmx高并发秒杀-有事务方式减少库存.jmx删除秒时出现的超卖问题核心测试代码如下/** ...

    Java高并发秒杀API之业务分析与DAO层

    在IT行业中,尤其是在Java开发领域,高并发秒杀API的设计是相当重要的一项技术。它涉及到如何在短时间内处理大量用户请求,保证系统稳定性和性能。在这个主题下,我们主要讨论两个关键部分:业务分析和DAO(Data ...

    java高并发秒杀api源码

    在Java开发领域,高并发秒杀API是电商、抢购等场景中不可或缺的一部分。这个"java高并发秒杀api源码"很可能是一个实现这类功能的示例项目,它结合了Spring和MyBatis两大主流框架,以提升系统性能和可维护性。下面,...

    SpringBoot开发的高并发限时抢购秒杀系统(含数据库文件).zip

    【标题】:基于SpringBoot的高并发限时抢购秒杀系统设计与实现 【描述】:这个项目是一个使用SpringBoot框架构建的高并发限时抢购(秒杀)系统,它涵盖了从后端服务到数据库的设计与实现。系统的核心目标是处理大量...

    秒杀系统设计与实现.互联网工程师进阶与分析

    秒杀系统设计与实现是互联网行业中一个至关重要的领域,它涉及到高并发、高性能以及稳定性等核心挑战。在本文中,我们将深入探讨秒杀系统的设计原理、关键技术及其在实际项目中的应用,尤其关注Java语言下的解决方案...

    商城代码秒杀,下单,减库存,支付

    在电子商务领域,商城系统的开发是至关重要的,其中包含了多个核心功能模块,如商品秒杀、订单处理、库存管理以及支付系统。以下是对这些关键模块的详细解析: **1. 秒杀功能** 秒杀活动是一种促销策略,可以短时间...

    SpringBoot+Zookeeper+Dubbo打造分布式高并发商品秒杀系统.zip

    在构建分布式高并发的商品秒杀系统中,SpringBoot、Zookeeper和Dubbo是三个关键的技术组件,它们共同协作以实现高效、稳定且可扩展的架构。以下是对这些技术及其在秒杀系统中应用的详细解释: 1. **SpringBoot**: ...

    Redis 高并发秒杀商品系统(Spring MVC+bootstrap+redis+mybatis)

    在设计这样的系统时,技术选型至关重要,本项目选择了Spring MVC、Bootstrap、Redis和MyBatis作为核心组件,构建了一个高并发的秒杀商品系统。接下来,我们将深入探讨这些技术如何协同工作以实现高效、稳定的秒杀...

    java高并发买秒杀完整代码

    在IT行业中,尤其是在互联网电商领域,秒杀活动是一种常见的促销手段,它考验着系统的高性能和高并发处理能力。本文将围绕“Java高并发秒杀完整代码”这一主题,结合描述中提到的技术栈,如Spring、SpringMVC、...

    《IT学习资料》-SSM实战项目-Java高并发秒杀API,详细流程+学习笔记.zip

    《IT学习资料》-SSM实战项目-Java高并发秒杀API是一份全面的教程,旨在帮助学习者掌握如何在Java环境下使用Spring、SpringMVC和MyBatis(简称SSM)框架构建高并发的秒杀系统。这个项目涵盖了从项目初始化到实现完整...

    Java高并发秒杀API之业务分析与DAO层 第一课代码

    秒杀系统在电商、票务等场景中广泛应用,其核心挑战在于如何处理短时间内大量用户同时请求的高并发问题,确保数据一致性,避免超卖或漏卖。我们将使用Spring框架作为服务层容器,MyBatis作为持久层框架,通过具体的...

    基于SSM+mysql框架的高并发和商品秒杀项目.zip

    这个"基于SSM+mysql框架的高并发和商品秒杀项目"是一个典型的电商场景应用,旨在教授如何处理高并发环境下的数据访问和优化商品秒杀功能。下面将详细介绍SSM框架的核心知识点及其在高并发场景中的应用。 1. **...

    基于SpringBoot + MySQL开发的高并发商品限时秒杀系统.zip

    在构建一个基于SpringBoot + MySQL的高并发商品限时秒杀系统时,我们涉及了许多关键的IT知识点。首先,SpringBoot是Java开发中的一个流行框架,它简化了设置和配置过程,使得开发人员能够快速地搭建应用程序。这个...

    秒杀系统架构设计-许大牛

    1. **高并发处理**:秒杀活动中,瞬间涌入的用户请求可能会超出系统正常处理能力,因此,架构设计必须具备应对高并发的能力。这通常包括负载均衡、分布式缓存、数据库优化等技术。 2. **负载均衡**:通过负载均衡器...

    Redis 高并发秒杀商品系统源代码 Spring MVC+bootstrap+redis+mybatis学习案例

    1. **库存存储**:Redis可以用来存储秒杀商品的实时库存,使用`INCR`命令实现减库存操作,并通过原子性确保在高并发下不会出现超卖问题。 2. **队列服务**:利用Redis的发布订阅(Pub/Sub)功能,将用户请求放入消息...

    seckill-code-note:Java高并发秒杀API之业务分析与DAO层原始码和整理的笔记seckill是项目源码note是整理的笔记

    本资源“seckill-code-note”是一个关于Java实现高并发秒杀API的业务分析和DAO层源码解读的笔记,配合“seckill”项目源码,提供了深入理解秒杀系统设计与实现的宝贵资料。 在秒杀业务分析方面,首先我们需要理解的...

    基于SpringBoot+Zookeeper+Dubbo打造分布式高并发商品秒杀系统.zip

    这个项目是利用SpringBoot、Zookeeper和Dubbo这三个核心技术构建的分布式高并发商品秒杀系统。让我们逐一深入理解这些技术及其在项目中的应用。 **SpringBoot** SpringBoot是由Pivotal团队提供的全新框架,它旨在...

Global site tag (gtag.js) - Google Analytics