{"id":14983083,"url":"https://github.com/joryun/seckill","last_synced_at":"2025-08-24T22:42:59.593Z","repository":{"id":201363515,"uuid":"87780770","full_name":"Joryun/seckill","owner":"Joryun","description":"基于SpringMVC，Spring，MyBatis实现的秒杀系统（参见慕课网，做了些改动）","archived":false,"fork":false,"pushed_at":"2017-05-24T14:56:40.000Z","size":68,"stargazers_count":92,"open_issues_count":0,"forks_count":54,"subscribers_count":13,"default_branch":"master","last_synced_at":"2025-02-02T04:41:15.860Z","etag":null,"topics":["java","maven","mybatis","redis","spring","springmvc","ssm"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Joryun.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2017-04-10T07:35:31.000Z","updated_at":"2024-01-26T12:52:14.000Z","dependencies_parsed_at":null,"dependency_job_id":"7f42a38b-ca16-4b96-9ee1-23d3a440d607","html_url":"https://github.com/Joryun/seckill","commit_stats":null,"previous_names":["joryun/seckill"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Joryun%2Fseckill","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Joryun%2Fseckill/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Joryun%2Fseckill/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Joryun%2Fseckill/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Joryun","download_url":"https://codeload.github.com/Joryun/seckill/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":238892194,"owners_count":19548146,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["java","maven","mybatis","redis","spring","springmvc","ssm"],"created_at":"2024-09-24T14:06:43.048Z","updated_at":"2025-02-14T18:31:46.344Z","avatar_url":"https://github.com/Joryun.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 高并发秒杀系统\r\n开发环境：IDEA，Tomcat，MySQL，Redis\r\n\r\n项目构建：Maven\r\n\r\n软件环境：SSM(SpringMVC，Spring，MyBatis) \r\n\r\n项目描述：一套以秒杀商品为目的而搭建制作的高并发系统。基本实现用户根据商家设定的库存量进行秒杀的过程。\r\n\r\n技术描述：基于SpringMVC，Spring，MyBatis实现的高并发秒杀系统。代码设计风格基于RESTful，以c3p0作为连接池，Redis数据库为媒介实现高并发技术。其中，对于相关的DAO，Service操作，均添加了Junit单元测试实例。\r\n\r\n### 开发文档\r\n\r\n#### 一、业务分析\r\n\r\n1.秒杀系统业务流程\r\n\r\n![](https://github.com/Joryun/MarkdownPhotos/blob/master/seckillPhotos/seckill-operation.png)\r\n\r\n2.秒杀业务的核心：库存的处理\r\n\r\n3.针对库存业务分析：事务（1\u003e.减内存 2\u003e.记录购买明细）\r\n\r\n![](https://github.com/Joryun/MarkdownPhotos/blob/master/seckillPhotos/seckill-operation2.png)\r\n\r\n4.记录秒杀成功信息\r\n\r\n（1）购买成功的对象\r\n\r\n（2）成功的时间/有效期\r\n\r\n（3）付款/发货信息\r\n\r\n#### 二、异常情况分析\r\n\r\n1. 减库存没有记录购买明细\r\n\r\n2. 记录明细但没有减库存\r\n\r\n3. 出现超卖/少卖\r\n\r\n#### 三、难点分析\r\n\r\n1. MySQL：事务 + 行级锁\r\n\r\n2. 多用户秒杀 ——\u003e Update库存数量\r\n\r\n#### 四、功能模块\r\n\r\n1. 秒杀接口暴露（Exposer，封装的DTO）\r\n\r\n2. 执行秒杀\r\n\r\n3. 相关查询\r\n\r\n#### 五、开发流程\r\n\r\n1. DAO设计编码\r\n\r\n2. Service设计编码\r\n\r\n3. Web设计编码（restful接口和前端交互等）\r\n\r\n4. 高并发优化与分析\r\n\r\n--------------\r\n\r\n\u003cfont color=gray size=4\u003e（一）DAO设计编码\u003c/font\u003e\r\n\r\nPackage:\r\n\r\n（1）org.seckill.dao\r\n\r\n（2）org.seckill.entity\r\n\r\n#### 1. 接口设计与SQL编写\r\n\r\n注：Dao层不应夹杂着Service层的信息，Service层主要是对Dao层进行拼接，即为一系列逻辑！！！\r\n\r\n#### 2. 数据库设计与编码\r\n\r\n两张表：\r\n\r\n（1）\tseckill\t//秒杀库存表\r\n\r\n（2）\tsuccess_killed\t\t//秒杀成功明细表\r\n\r\n\r\n#### 3. DAO实体和接口编码\r\n\r\n（1）\tSeckillDao\t\r\n\r\n（2）\tSuccesskilledDao\t\t\r\n\r\n#### 4. Mybatis整合Spring\r\n\r\n（1）\t编写mybatis-config.xml（全局配置）\r\n\r\n（2）\t编写spring-dao.xml（配置dataSource，sqlSessionFactory等）\r\n\r\n#### 5. 完成Dao层集成测试（使用Junit4）\r\n\r\n\r\n\u003cfont color=gray size=4\u003e（二）Service设计编码\r\n\u003c/font\u003e\r\n\r\n\r\nPackage:\r\n\r\n（1）org.seckill.service 存放服务，即为一系列逻辑\r\n\r\n（2）org. seckill.exception\t存放service接口所需要的异常，如重复秒杀，秒杀与关闭等\r\n\r\n（3）org. seckill.dto 数据传输层，与entity类似，存放一些表示数据的类型，web与service间的数据传递\r\n\r\n（4）org. seckill.enums 封装枚举类，表述常量字段-状态值（“秒杀成功”，“秒杀结束”等等）\r\n\r\n#### 1. 接口设计与实现\r\n\r\n（1）业务接口：站在“使用者”角度设计接口\r\n\r\n（2）三个方面：方法定义粒度，参数，返回类型（return 类型/异常）\r\n\r\n\r\n#### 2. 使用Spring托管Service依赖（Spring IOC）\r\n\r\n![](https://github.com/Joryun/MarkdownPhotos/blob/master/seckillPhotos/service-2(1).png)\r\n\r\n(1) 业务对象依赖图\r\n\r\n![](https://github.com/Joryun/MarkdownPhotos/blob/master/seckillPhotos/service-2(2).png)\r\n\r\n(2) 编写spring-service.xml\r\n\r\n(3) 扩展\r\n\r\n* Spring IOC\r\n\r\n（1）\t为对象创建统一托管\r\n\r\n（2）\t规范的生命周期管理\r\n\r\n（3）\t灵活的依赖注入\r\n\r\n（4）\t一致的获取对象\r\n\r\n* Spring IOC注入方式及场景\r\n\r\n（1）\tXML：\r\n\r\n一.Bean实现类来自第三方类库，如DataSource等；\r\n\r\n二.需要命名空间配置，如context，aop，mvc等\r\n\r\n（2）\t注解：项目中自身开发使用的类，可直接在代码中使用注解，如：@Service，@Controller\r\n\r\n（3）\tJava配置类：需要通过代码控制对象创建逻辑的场景，如：自定义修改依赖类库\r\n\r\n\r\n#### 3. 配置并使用Spring声明式事务\r\n\r\nProxyFactoryBean + XML   ——\u003e   早期使用方式（2.0）\r\n\r\ntx:advice + aop           ——\u003e   一次配置永久生效\r\n\r\n注解@Transactional       ——\u003e   注解控制（推荐）\r\n\r\n* 什么时候回滚事务？\r\n\r\n抛出的是运行期异常（RuntimeException）\r\n避免使用不当的try...catch...\r\n\r\n* 使用注解控制事务方法的优点\r\n\r\n(1) 开发团队达成一致约定，明确标注事务方法的编程风格\r\n\r\n(2) 保证事务方法的执行时间尽可能短，不要穿插其它网络操作，RPC/HTTP请求或者剥离到事务方法外部\r\n\r\n(3) 不是所有的方法都需要事务，如只有一条修改操作，只读操作不需要事务控制\r\n\t\r\n\r\n#### 4. 完成Service集成测试（使用Junit4）\r\n\r\n\r\n\r\n\u003cfont color=gray size=4\u003e（三）Web设计编码\r\n\u003c/font\u003e\r\n\r\n#### 1. 前端交互逻辑\r\n\r\n(1) 秒杀系统前端页面流程\r\n\r\n![](https://github.com/Joryun/MarkdownPhotos/blob/master/seckillPhotos/web-1(1).png)\r\n\r\n\r\n(2) 详情页流程逻辑\r\n\r\n![](https://github.com/Joryun/MarkdownPhotos/blob/master/seckillPhotos/web-1(2).png)\r\n\r\n#### 2. 基于RestFul接口设计\r\n\r\n秒杀API的URL设计\r\n\r\n* GET\t/seckill/list\t（秒杀列表）\r\n* GET\t/seckill/{id}/detail\t（详情页）\r\n* GET\t/seckill/time/now\t（系统时间）\r\n* POST\t  /seckill/{id}/exposer\t（暴露秒杀）\r\n* POST  /seckill/{id}/{md5}/execution\t（执行秒杀）\r\n\r\n#### 3. 整合SpringMVC框架及相关配置\r\n\r\n（1）编写web.xml\r\n\r\n（2）添加spring-web.xml\r\n\r\n#### 4. 实现秒杀相关的Restful接口\r\n\r\n（1）编写SeckillController\r\n\r\n（2）创建一个DTO类SeckillResult，封装所有ajax请求返回类型（json）\r\n\r\n\r\n#### 5. 基于Bootstrap框架开发页面\r\n\r\n(1) 抽取公共部分，开发common包下的内容\r\n\r\n![](https://github.com/Joryun/MarkdownPhotos/blob/master/seckillPhotos/web-5(1).png)\r\n\r\n* head.jsp  -\u003e  bootstrap中包含于head标签之内的内容，一般为css，编码设置及主题文件\r\n* tag.jsp   -\u003e  引入库文件，例如jstl库中的fmt等\r\n\r\n(2) 开发商品列表页list.jsp\r\n\r\n(3) 开发商品详情页detail.jsp\r\n\r\n#### 6. Cookie登录交互\r\n\r\n（1）编写js代码（基于模块化的js代码），完成登录验证（重点：验证手机号）\r\n\r\n（2）完成弹出层组件的逻辑设计\r\n\r\n\r\n#### 7. 计时交互\r\n\r\n(1) 判断时间（已开始，未开始，已结束）\r\n\r\n(2) 根据时间判断，对应前端组件显示不同内容\r\n\r\n#### 8. 秒杀交互\r\n\r\n（1）绑定按钮点击事件（one click），预防用户连续点击\r\n\r\n（2）考虑浏览器计时偏差\r\n\r\n（3）显示秒杀的结果\r\n\r\n\r\n\r\n\u003cfont color=gray size=4\u003e（四）高并发优化与分析\r\n\u003c/font\u003e\r\n\r\n###待续。。。\r\n\r\n\r\n\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjoryun%2Fseckill","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjoryun%2Fseckill","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjoryun%2Fseckill/lists"}