基于Spring+SpringMVC+MyBatis实现高并发秒杀APIM-阿里云开发者社区

开发者社区> daleychao> 正文

基于Spring+SpringMVC+MyBatis实现高并发秒杀APIM

简介: 基于Spring+SpringMVC+MyBatis实现高并发秒杀API 项目地址:https://github.com/DaleyChao/SecondKill 项目下载链接:https://github.
+关注继续查看

基于Spring+SpringMVC+MyBatis实现高并发秒杀API

项目地址:https://github.com/DaleyChao/SecondKill 项目下载链接:https://github.com/DaleyChao/SecondKill/archive/master.zip

一、项目概述

一、为什么使用SSM框架

1.互联网公司常用框架
2.框架易于使用和轻量级
3.低代码倾入性
4.成熟的社区和用户群

二、相关技术

MySQL:1.表设计2.SQL技巧3.事务和行级锁
MyBatis:1.DAO层的设计和开发2.MyBatis合理使用3.MyBatis和Spring的整合和使用
Spring:1.Spring IOC整合Service2.声明式事务
SpringMVC:1.Restful接口设计和使用技巧2.框架运作流程3.Controller开发技巧
前端:1.交互设计2.Bootstrap3.JQuery
高并发:1.高并发点和高并发分析2.优化思路并实现

三、项目效果








二、建立项目

一、使用Maven建立项目

1.使用maven建立项目:mvn archetype:generate -DgroupId=org.seckill -DartifactId=seckill -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false -DarchetypeCatalog=internal
也可以使用mvn archetype:generate命令根据提示建立项目。
2.使用Eclipse导入项目
3.修改web.xml文件schema,使用servlet4.0版本,默认2.3版本EL表达式不工作。
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
	version="3.1" metadata-complete="true">
	<!--修改servlet版本为3.1 -->
</web-app>
4.补全目录
5.补全pom.xml,导入相关依赖

二、相关依赖

部分说明:
1.Java日志:slf4j,log4j,logback,common-logging等等(commons-logging 和 slf4j 都是日志规范/接口,区别是slf4j在加载时寻找接口的实现,而 commons-logging 在运行时寻找接口的实现
slf4j是规范/接口,log4j,logback,common-logging是日志实现
这里使用slf4j+logback
2.c3p0数据库连接池
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>org.seckill</groupId>
	<artifactId>seckill</artifactId>
	<packaging>war</packaging>
	<version>1.0.0SNAPSHOT</version>
	<name>seckill Maven Webapp</name>
	<url>http://maven.apache.org</url>
	<dependencies>
		<!-- https://mvnrepository.com/artifact/junit/junit -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
		</dependency>

		<!-- 日志 -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>1.7.12</version>
		</dependency>
		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-core</artifactId>
			<version>1.1.1</version>
		</dependency>
		<!-- 实现slf4j接口并整合 -->
		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-classic</artifactId>
			<version>1.1.1</version>
		</dependency>
		<!-- 数据库相关的依赖 -->
		<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.40</version>
			<scope>runtime</scope>
		</dependency>

		<!-- 数据库链接池 -->
		<dependency>
			<groupId>c3p0</groupId>
			<artifactId>c3p0</artifactId>
			<version>0.9.1.2</version>
		</dependency>
		<!-- Dao层 -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.4.1</version>
		</dependency>
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis-spring</artifactId>
			<version>1.3.0</version>
		</dependency>
		<!-- Servlet web 相关依赖 -->
		<!-- https://mvnrepository.com/artifact/taglibs/standard -->
		<dependency>
			<groupId>taglibs</groupId>
			<artifactId>standard</artifactId>
			<version>1.1.2</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/jstl/jstl -->
		<dependency>
			<groupId>jstl</groupId>
			<artifactId>jstl</artifactId>
			<version>1.2</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-core</artifactId>
			<version>2.8.5</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>2.8.5</version>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>4.0.0-b01</version>
			<scope>provided</scope>
		</dependency>
		<!-- Spring -->
		<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>4.3.4.RELEASE</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>4.3.4.RELEASE</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-beans</artifactId>
			<version>4.3.4.RELEASE</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>4.3.4.RELEASE</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-tx</artifactId>
			<version>4.3.4.RELEASE</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.springframework/spring-web -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
			<version>4.3.4.RELEASE</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>4.3.4.RELEASE</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>4.3.4.RELEASE</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
		<dependency>
			<groupId>redis.clients</groupId>
			<artifactId>jedis</artifactId>
			<version>2.8.1</version>
		</dependency>
		<!-- protostuff序列化依赖 -->
		<!-- https://mvnrepository.com/artifact/io.protostuff/protostuff-core -->
		<dependency>
			<groupId>io.protostuff</groupId>
			<artifactId>protostuff-core</artifactId>
			<version>1.5.2</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/io.protostuff/protostuff-runtime -->
		<dependency>
			<groupId>io.protostuff</groupId>
			<artifactId>protostuff-runtime</artifactId>
			<version>1.5.2</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/commons-collections/commons-collections -->
		<dependency>
			<groupId>commons-collections</groupId>
			<artifactId>commons-collections</artifactId>
			<version>3.2.2</version>
		</dependency>

	</dependencies>
	<build>
		<finalName>seckill</finalName>
	</build>
</project>

MySQL等关系型数据库提供的事务机制是目前可靠的数据落地方案

三、秒杀功能

1.秒杀接口暴露
2.执行秒杀
3.相关的查询


四、项目阶段

一、DAO层设计和编码
1.数据库表设计 2.DAO的接口 3.MyBatis实现DAO
二、Service设计编码
1.Service层设计以及编码实现 2.通过Spring管理Service,通过声明式事务标注事务操作(通过Spring声明式事务简化事务控制)
三、web设计
1.RESTful接口设计 2.前端交互
四、优化项目

三、详细设计

一、数据库设计

--数据库初始化脚本
CREATE DATABASE seckill;

--使用数据库
use seckill;
--创建秒杀库存表
CREATE TABLE seckill1(
`seckill_id` bigint NOT NULL AUTO_INCREMENT COMMENT '商品库存id',
`name` varchar(120) NOT NULL COMMENT '商品名称',
`number` int NOT NULL COMMENT '库存数量',
`start_time` timestamp NOT NULL COMMENT '秒杀开启时间',
`end_time` timestamp NOT NULL COMMENT '秒杀结束时间',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (seckill_id),
KEY idx_start_time(start_time),
KEY idx_end_time(end_time),
KEY idx_create_time(create_time)
)ENGINE=InnoDB AUTO_INCREMENT=1000  DEFAULT CHARSET=utf8 COMMENT="秒杀库存表";

--初始化数据
insert into seckill(name,number,start_time,end_time) values
('1000元秒杀iphone6s',100,'2016-12-19 00:00:00','2016-12-20 00:00:00'),
('100元秒杀iphone6',200,'2016-12-19 00:00:00','2016-12-20 00:00:00'),
('200元秒杀iphone5',300,'2016-12-19 00:00:00','2016-12-20 00:00:00'),
('10元秒杀iphone4',400,'2016-12-19 00:00:00','2016-12-20 00:00:00');

--秒杀成功明细表
--用户登录认证相关的信息
CREATE TABLE success_kill(
`seckill_id` bigint NOT NULL COMMENT '秒杀商品id',
`user_phone` bigint NOT NULL COMMENT '用户手机号',
`state` tinyint NOT NULL DEFAULT -1 COMMENT '创建标识:-1 无效  0 成功 1:已付款 2:已发货',
`create_time` timestamp NOT NULL COMMENT '创建时间',
PRIMARY KEY (seckill_id,user_phone),
KEY idx_create_time(create_time)
)ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT="秒杀成功明细表";

--连接数据库控制台
mysql -uroot -p


未完……

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
《UNIX网络编程 卷1:套接字联网API(第3版)》——2.10 TCP端口号与并发服务器
我们用冒号来分割IP地址和端口号,因为这是HTTP的用法,其他地方也常见。netstat程序使用点号来分割IP地址和端口号,不过如此表示有时候会让人混淆,因为点号既用于域名(如freebsd.unpbook.com.21),也用于IPv4的点分十进制数记法(如12.106.32.254.21)。
1351 0
[并发编程]并发编程第一篇:利用并发编程,实现查找大量数据中的素数
面试时,被提问:怎么判断一个数是素数?如果高效地判断大批量数据是否是素数? 由于工作中对并发编程没有了解,所以不太明白,面试官提示了下,也并没有自己的思路。 回来后,百度了下这个面试题,并浏览了下实现代码,并不是特别明白。
632 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
4478 0
【高并发】导致并发编程频繁出问题的“幕后黑手”
工作了3年的小菜同学,平时在公司只是做些CRUD的常规工作,这次,出去面试被面试官一顿虐啊!尤其是并发编程的知识简直就是被吊打啊。小菜心有不甘,回来找自己工作经验非常丰富的朋友大冰来帮助自己提升并发编程的知识,于是便有了接下来的一系列小菜学并发的文章。
70 0
SpringBoot实现Java高并发秒杀系统之Web层开发(三)
SpringBoot实现Java高并发秒杀系统之Web层开发(三) 接着上一篇文章:SpringBoot实现Java高并发之Service层开发,今天我们开始讲SpringBoot实现Java高并发秒杀系统之Web层开发。
5466 0
阿里云服务器2Mbps的实际下载速度及最高并发数是多少?
阿里云服务器2Mbps的实际下载速度及最高并发数是多少?
761 0
说说Android的广播(2) - 并发队列和串行队列
前面我们讲了,消息分为普通消息和有序消息两大类。普通消息是可以并发的,由于是并发的,这些广播的处理者之间互相是不依赖的。 另外,并发队列和串行队列都各维护了一条后台广播队列和前台广播队列。如果这个消息足够重要,想走快速通道的话,可以选择使用前台广播队列。 对于并发队列,如果是进程活着,动
3842 0
PHP中利用文件锁实现日志写入和网站接口访问等常见场景下的并发控制
针对并发环境下网站、日志文件写入产生的脏数据、更新丢失等情况的解决思路之一
2587 0
+关注
daleychao
初级码农
186
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载