高并发秒杀接口的设计:https://github.com/lizhixiong1994
参考:https://www.cnblogs.com/twoheads/p/8360830.html (写的很详细,并且拥有漂亮的个人博客)
version-1.0:springboot+mysql+mybatis
sql建表
```
CREATE TABLE `seckill`(
`seckill_id` bigint NOT NULL AUTO_INCREMENT COMMENT '商品ID',
`title` varchar (1000) DEFAULT NULL COMMENT '商品标题',
`image` varchar (1000) DEFAULT NULL COMMENT '商品图片',
`price` decimal (10,2) DEFAULT NULL COMMENT '商品原价格',
`cost_price` decimal (10,2) DEFAULT NULL COMMENT '商品秒杀价格',
`stock_count` bigint DEFAULT NULL COMMENT '剩余库存数量',
`start_time` timestamp NOT NULL DEFAULT '1970-02-01 00:00:01' COMMENT '秒杀开始时间',
`end_time` timestamp NOT NULL DEFAULT '1970-02-01 00:00:01' COMMENT '秒杀结束时间',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`status` int(1) NOT NULL DEFAULT 1 COMMENT '状态1:在用 0:废弃',
PRIMARY KEY (`seckill_id`),
KEY `idx_start_time` (`start_time`),
KEY `idx_end_time` (`end_time`),
KEY `idx_create_time` (`end_time`),
KEY `idx_status` (`status`)
) CHARSET=utf8 ENGINE=InnoDB COMMENT '秒杀商品表';
CREATE TABLE `seckill_order`(
`seckill_id` bigint NOT NULL COMMENT '秒杀商品ID',
`money` decimal (10, 2) DEFAULT NULL COMMENT '支付金额',
`user_phone` bigint NOT NULL COMMENT '用户手机号',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',
`state` tinyint NOT NULL DEFAULT -1 COMMENT '状态:-1无效 0成功 1已付款',
PRIMARY KEY (`seckill_id`, `user_phone`) /*联合主键,保证一个用户只能秒杀一件商品*/
) CHARSET=utf8 ENGINE=InnoDB COMMENT '秒杀订单表';
```
Bean
```
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* 秒杀商品的单条记录
*/
@Data
@ToString
public class Seckill implements Serializable {
public static final int STATUS_NEW = 1;
public static final int STATUS_DEAD = 0;
private long seckillId; //商品ID
private String title; //商品标题
private String image; //商品图片
private BigDecimal price; //商品原价格
private BigDecimal costPrice; //商品秒杀价格
private int status = STATUS_NEW; //状态
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime; //创建时间
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date startTime; //秒杀开始时间
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date endTime; //秒杀结束时间
private long stockCount; //剩余库存数量
}
```
```
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* 秒杀商品的订单
*/
@Data
@ToString
public class SeckillOrder implements Serializable {
private long seckillId; //秒杀到的商品ID
private BigDecimal money; //支付金额
private long userPhone; //秒杀用户的手机号
public SeckillOrder(long seckillId, long userPhone) {
this.seckillId = seckillId;
this.userPhone = userPhone;
}
/**
* @DateTimeFormat()(来自springframework)和@JsonFormat()
* (来自jackson)标识可以实现Controller在返回JSON数据(用@ResponseBody标识的方法或@RestController标识的类)的时候能将Date类型的参数值(经Mybatis查询得到的数据是英文格式的日期,因为实体类中是Date类型)
* 转换为注解中指定的格式返回给页面(相当于经过了一层SimpleDateFormate)。
*/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime; //创建时间
private boolean status; //订单状态, -1:无效 0:成功 1:已付款
private Seckill seckill; //秒杀商品,和订单是一对多的关系
}
```
### 流程如下:
1、查询所有秒杀商品信息(select * from seckill where status = 1)
```
@GetMapping(name = "/getSecKillInfo")
public Object getSecKillInfo() {
//获取秒杀的信息,这里只是一个简单的事例
return seckillService.findSeckillAll();
}
```
2:前端根据拼接的地址,开始调用秒杀接口秒杀"/{seckillGoodsId}/execution"
```
@RequestMapping(value = "/{seckillGoodsId}/{md5}/execution")
public Boolean execution(@PathVariable("seckillGoodsId") Long seckillGoodsId, @PathVariable("md5") String md5) {
//获取用户信息
long userPhone = 123456;//这个是编造的,一般都是通过认证服务获取当前用户的userPhone
//开始执行秒杀
try {
return seckillService.executionSeckillId(seckillGoodsId, userPhone);
} catch (Exception e) {
log.warn(e.getMessage());
return false;
}
}
```
3:秒杀
3.1:获取秒杀商品的信息
判断是否超时,是否已经开始,是否用户重复秒杀 -从redis-mysql(利用redis做一级缓存,先访问redis,如果redis缓存中没有所需资源或者访问访问超时,则直接进入mysql获取系统资源,将获取的内容更新在redis当中)
3.2:Mysql执行update,执行秒杀。成功修改数据则返回true,表示秒杀成功
```
@Override
@Transactional//关于事务回滚,默认对runtimgexception 以及其他限定的几个异常进行回滚。
public Boolean executionSeckillId(Long seckillGoodsId, long userPhone) {
//1:获取秒杀商品的记录。
Seckill seckill = getSeckillBySeckillId(seckillGoodsId);
if (seckill == null) {//没有找到抢购记录
return false;
}
//2:查看是否已经过期
if (seckill.getEndTime().getTime() < System.currentTimeMillis()) {
throw new RuntimeException("秒杀时间已经结束");
}
//3:开始保存订单,如果下过订单,则不能继续秒杀。seckillGoodsId 以及 userPhone是联合主键。保证一个人对于一个抢购只能有一次下订单的记录
if (seckillMapper.insertOrder(seckillGoodsId, seckill.getCostPrice(), userPhone) == 0) {
throw new RuntimeException("订单重复");//重复订单
}
//4:开始执行秒杀策略,将抢购的商品库存减1
if (seckillMapper.reduceStock(seckillGoodsId, new Date()) > 0) {
return true;
} else {
//秒杀失败,交给事务处理回滚
throw new RuntimeException("秒杀失败");
}
}
```
涉及到的sql如下:这里因为篇幅有限,暂时只贴出核心部分,如果想要看全部的话,请去github上查看源码
```
<!--减少库存数量-->
<update id="reduceStock">
UPDATE seckill
SET stock_count = stock_count - 1
WHERE seckill_id = #{seckillId}
<![CDATA[
AND start_time < #{killTime}
AND end_time >= #{killTime}
]]>
AND stock_count > 0
AND status = 1
</update>
<!--插入订单-->
<insert id="insertOrder">
INSERT ignore INTO seckill_order(seckill_id, money, user_phone)
VALUES (#{seckillId}, #{money}, #{userPhone})
</insert>
<!--查询秒杀-->
<select id="findBySeckillId" resultMap="seckillResult
没有合适的资源?快使用搜索试试~ 我知道了~
高并发秒杀系统springboot+mysql+mybatisSecKill.zip
共105个文件
xml:78个
java:15个
prefs:3个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 65 浏览量
2024-05-14
13:48:00
上传
评论
收藏 85KB ZIP 举报
温馨提示
该项目利用了基于springboot + vue + mysql的开发模式框架实现的课设系统,包括了项目的源码资源、sql文件、相关指引文档等等。 【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。 【技术】 Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes
资源推荐
资源详情
资源评论
收起资源包目录
高并发秒杀系统springboot+mysql+mybatisSecKill.zip (105个子文件)
.classpath 1KB
seckill.iml 8KB
SeckillServiceImpl.java 6KB
RedisService.java 5KB
SeckillController.java 4KB
SpringbootTestEntFileTest.java 3KB
RedisConfig.java 2KB
SeckillOrder.java 1KB
Seckill.java 1KB
SeckillMapper.java 1KB
ISeckillService.java 815B
Exposer.java 601B
Applaction.java 532B
SeckillCloseException.java 266B
RepeatSeckillException.java 263B
FailedSeckillException.java 263B
SeckillException.java 221B
README.md 20KB
README.md 19KB
item.pdf 6B
org.eclipse.jdt.core.prefs 238B
org.eclipse.core.resources.prefs 120B
org.eclipse.m2e.core.prefs 86B
.project 548B
application.properties 2KB
manualType.properties 10B
系统.txt 7B
workspace.xml 53KB
uiDesigner.xml 9KB
logback.xml 3KB
pom.xml 3KB
SeckillMapper.xml 2KB
mybatis-config.xml 1KB
Maven__org_springframework_boot_spring_boot_starter_data_redis_1_5_4_RELEASE.xml 757B
Maven__org_springframework_boot_spring_boot_test_autoconfigure_1_5_4_RELEASE.xml 757B
Maven__org_springframework_boot_spring_boot_starter_logging_1_5_4_RELEASE.xml 736B
Maven__org_springframework_boot_spring_boot_starter_tomcat_1_5_4_RELEASE.xml 729B
compiler.xml 725B
Maven__org_springframework_boot_spring_boot_autoconfigure_1_5_4_RELEASE.xml 722B
Maven__org_springframework_boot_spring_boot_starter_cache_1_5_4_RELEASE.xml 722B
Maven__org_mybatis_spring_boot_mybatis_spring_boot_autoconfigure_1_2_0.xml 718B
Maven__org_springframework_boot_spring_boot_starter_jdbc_1_5_4_RELEASE.xml 715B
Maven__org_springframework_boot_spring_boot_starter_test_1_5_4_RELEASE.xml 715B
Maven__org_springframework_boot_spring_boot_starter_web_1_5_4_RELEASE.xml 708B
Maven__com_vaadin_external_google_android_json_0_0_20131108_vaadin1.xml 688B
Maven__org_springframework_data_spring_data_keyvalue_1_2_4_RELEASE.xml 687B
Maven__org_springframework_data_spring_data_commons_1_13_4_RELEASE.xml 687B
Maven__org_springframework_spring_context_support_4_3_9_RELEASE.xml 681B
Maven__org_springframework_boot_spring_boot_starter_1_5_4_RELEASE.xml 680B
Maven__org_mybatis_spring_boot_mybatis_spring_boot_starter_1_2_0.xml 676B
Maven__org_springframework_data_spring_data_redis_1_8_4_RELEASE.xml 666B
Maven__org_springframework_boot_spring_boot_test_1_5_4_RELEASE.xml 659B
Maven__org_apache_tomcat_embed_tomcat_embed_websocket_8_5_15.xml 648B
Maven__org_springframework_spring_expression_4_3_9_RELEASE.xml 646B
Maven__com_fasterxml_jackson_core_jackson_annotations_2_8_0.xml 632B
Maven__org_springframework_spring_context_4_3_9_RELEASE.xml 625B
Maven__org_springframework_boot_spring_boot_1_5_4_RELEASE.xml 624B
Maven__org_hibernate_hibernate_validator_5_3_5_Final.xml 622B
Maven__org_springframework_spring_webmvc_4_3_9_RELEASE.xml 618B
Maven__org_apache_tomcat_embed_tomcat_embed_core_8_5_15.xml 613B
Maven__com_fasterxml_jackson_core_jackson_databind_2_8_8.xml 611B
Maven__org_springframework_spring_beans_4_3_9_RELEASE.xml 611B
Maven__org_springframework_spring_test_4_3_9_RELEASE.xml 604B
Maven__org_springframework_spring_jdbc_4_3_9_RELEASE.xml 604B
Maven__org_springframework_spring_core_4_3_9_RELEASE.xml 604B
Maven__org_apache_tomcat_embed_tomcat_embed_el_8_5_15.xml 599B
Maven__javax_validation_validation_api_1_1_0_Final.xml 599B
Maven__org_springframework_spring_aop_4_3_9_RELEASE.xml 597B
Maven__org_springframework_spring_oxm_4_3_9_RELEASE.xml 597B
Maven__org_springframework_spring_web_4_3_9_RELEASE.xml 597B
Maven__org_jboss_logging_jboss_logging_3_3_1_Final.xml 596B
Maven__org_springframework_spring_tx_4_3_9_RELEASE.xml 590B
Maven__com_fasterxml_jackson_core_jackson_core_2_8_8.xml 583B
Maven__ch_qos_logback_logback_classic_1_1_11.xml 563B
Maven__mysql_mysql_connector_java_5_1_42.xml 562B
Maven__org_apache_commons_commons_pool2_2_4_2.xml 558B
Maven__org_slf4j_log4j_over_slf4j_1_7_25.xml 550B
Maven__org_apache_tomcat_tomcat_juli_8_5_15.xml 547B
Maven__org_apache_tomcat_tomcat_jdbc_8_5_15.xml 547B
Maven__ch_qos_logback_logback_core_1_1_11.xml 542B
Maven__org_hamcrest_hamcrest_library_1_3.xml 541B
Maven__org_mybatis_mybatis_spring_1_3_1.xml 537B
Maven__org_mockito_mockito_core_1_10_19.xml 537B
Maven__org_slf4j_jcl_over_slf4j_1_7_25.xml 536B
Maven__com_jayway_jsonpath_json_path_2_2_0.xml 534B
Maven__net_minidev_accessors_smart_1_1.xml 530B
Maven__org_skyscreamer_jsonassert_1_4_0.xml 525B
Maven__org_assertj_assertj_core_2_6_0.xml 523B
Maven__org_slf4j_jul_to_slf4j_1_7_25.xml 522B
Maven__org_hamcrest_hamcrest_core_1_3.xml 520B
Maven__org_projectlombok_lombok_1_16_10.xml 519B
Maven__com_fasterxml_classmate_1_3_3.xml 510B
Maven__net_minidev_json_smart_2_2_1.xml 509B
Maven__org_slf4j_slf4j_api_1_7_25.xml 501B
Maven__org_objenesis_objenesis_2_1.xml 496B
modules.xml 496B
Maven__org_mybatis_mybatis_3_4_2.xml 488B
Maven__org_yaml_snakeyaml_1_17.xml 483B
Maven__redis_clients_jedis_2_9_0.xml 482B
Maven__com_alibaba_druid_1_1_9.xml 474B
共 105 条
- 1
- 2
资源评论
枫蜜柚子茶
- 粉丝: 6696
- 资源: 4871
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于C和C++的二维绘制工具设计源码 - DrawPro
- Object.defineProperty 的 IE 补丁object-defineproperty-ie-master.zip
- 整卷预览.mhtml
- MySQL是一种广泛使用的开源关系型数据库管理系统,它提供了丰富的SQL语句用于数据库的创建、查询、更新和管理 以下是一些常见的
- MySQL是一种广泛使用的开源关系型数据库管理系统,它提供了丰富的SQL语句用于数据库的创建、查询、更新和管理 以下是一些常见
- MySQL是一种广泛使用的开源关系型数据库管理系统,它提供了丰富的SQL语句用于数据库的创建、查询、更新和管理 以下是一些常见的
- 基于Javascript的结婚请帖设计源码 - Invitation
- mysql语句大全及用法
- mysql语句大全及用法
- mysql语句大全及用法
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功