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语句。极大提升性能
- 浏览: 421807 次
- 性别:
- 来自: 北京
最新评论
-
zgw06629:
或者<pre>aaaabbbbcccc</p ...
javaDoc注释换行 -
ddnzero:
...
StringBuffer换行 -
maosijun:
。。。。
EXT CExt.form.ComboBox选择一次后只剩一个选项 -
ysa198584:
你这有问题,当我的代码出现User.class的时候,反编绎的 ...
java的class文件批量反编译 -
dongj0325:
看到您的博客,很受启发,但还有关于jbpm4.4 timer使 ...
JBPM定时器(Timer)之Repeat属性不能使用变量
相关推荐
这里,我们将围绕“高并发秒杀案例”这一主题,结合使用SpringMVC和Mybatis两大技术框架,深入探讨如何设计和实现一个能够承受高并发压力的秒杀功能。 首先,我们需要理解SpringMVC作为一款强大的Web MVC框架,它...
代码设计风格基于RESTful,以c3p0作为连接池,Redis数据库为媒介实现高并发技术。其中,对于相关的DAO,Service操作,均添加了Junit单元测试实例。 开发文档 一、业务分析 1.秒杀系统业务流程 2.秒杀业务的核心...
demo.git准备使用docker-compose启动redis服务器(可以用其他方式命令启动)理念启动测试项目jmeter测试高并发杀-重新超卖问题.jmx高并发秒杀-有事务方式减少库存.jmx删除秒时出现的超卖问题核心测试代码如下/** ...
在IT行业中,尤其是在Java开发领域,高并发秒杀API的设计是相当重要的一项技术。它涉及到如何在短时间内处理大量用户请求,保证系统稳定性和性能。在这个主题下,我们主要讨论两个关键部分:业务分析和DAO(Data ...
在Java开发领域,高并发秒杀API是电商、抢购等场景中不可或缺的一部分。这个"java高并发秒杀api源码"很可能是一个实现这类功能的示例项目,它结合了Spring和MyBatis两大主流框架,以提升系统性能和可维护性。下面,...
【标题】:基于SpringBoot的高并发限时抢购秒杀系统设计与实现 【描述】:这个项目是一个使用SpringBoot框架构建的高并发限时抢购(秒杀)系统,它涵盖了从后端服务到数据库的设计与实现。系统的核心目标是处理大量...
秒杀系统设计与实现是互联网行业中一个至关重要的领域,它涉及到高并发、高性能以及稳定性等核心挑战。在本文中,我们将深入探讨秒杀系统的设计原理、关键技术及其在实际项目中的应用,尤其关注Java语言下的解决方案...
在电子商务领域,商城系统的开发是至关重要的,其中包含了多个核心功能模块,如商品秒杀、订单处理、库存管理以及支付系统。以下是对这些关键模块的详细解析: **1. 秒杀功能** 秒杀活动是一种促销策略,可以短时间...
在构建分布式高并发的商品秒杀系统中,SpringBoot、Zookeeper和Dubbo是三个关键的技术组件,它们共同协作以实现高效、稳定且可扩展的架构。以下是对这些技术及其在秒杀系统中应用的详细解释: 1. **SpringBoot**: ...
在设计这样的系统时,技术选型至关重要,本项目选择了Spring MVC、Bootstrap、Redis和MyBatis作为核心组件,构建了一个高并发的秒杀商品系统。接下来,我们将深入探讨这些技术如何协同工作以实现高效、稳定的秒杀...
在IT行业中,尤其是在互联网电商领域,秒杀活动是一种常见的促销手段,它考验着系统的高性能和高并发处理能力。本文将围绕“Java高并发秒杀完整代码”这一主题,结合描述中提到的技术栈,如Spring、SpringMVC、...
《IT学习资料》-SSM实战项目-Java高并发秒杀API是一份全面的教程,旨在帮助学习者掌握如何在Java环境下使用Spring、SpringMVC和MyBatis(简称SSM)框架构建高并发的秒杀系统。这个项目涵盖了从项目初始化到实现完整...
秒杀系统在电商、票务等场景中广泛应用,其核心挑战在于如何处理短时间内大量用户同时请求的高并发问题,确保数据一致性,避免超卖或漏卖。我们将使用Spring框架作为服务层容器,MyBatis作为持久层框架,通过具体的...
这个"基于SSM+mysql框架的高并发和商品秒杀项目"是一个典型的电商场景应用,旨在教授如何处理高并发环境下的数据访问和优化商品秒杀功能。下面将详细介绍SSM框架的核心知识点及其在高并发场景中的应用。 1. **...
在构建一个基于SpringBoot + MySQL的高并发商品限时秒杀系统时,我们涉及了许多关键的IT知识点。首先,SpringBoot是Java开发中的一个流行框架,它简化了设置和配置过程,使得开发人员能够快速地搭建应用程序。这个...
1. **高并发处理**:秒杀活动中,瞬间涌入的用户请求可能会超出系统正常处理能力,因此,架构设计必须具备应对高并发的能力。这通常包括负载均衡、分布式缓存、数据库优化等技术。 2. **负载均衡**:通过负载均衡器...
1. **库存存储**:Redis可以用来存储秒杀商品的实时库存,使用`INCR`命令实现减库存操作,并通过原子性确保在高并发下不会出现超卖问题。 2. **队列服务**:利用Redis的发布订阅(Pub/Sub)功能,将用户请求放入消息...
本资源“seckill-code-note”是一个关于Java实现高并发秒杀API的业务分析和DAO层源码解读的笔记,配合“seckill”项目源码,提供了深入理解秒杀系统设计与实现的宝贵资料。 在秒杀业务分析方面,首先我们需要理解的...
这个项目是利用SpringBoot、Zookeeper和Dubbo这三个核心技术构建的分布式高并发商品秒杀系统。让我们逐一深入理解这些技术及其在项目中的应用。 **SpringBoot** SpringBoot是由Pivotal团队提供的全新框架,它旨在...