-
Notifications
You must be signed in to change notification settings - Fork 0
lsx1014426766/seckill
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
使用idea启动tomcat eidtCOnfiguration 选择tomcat7,点击右侧绿色向右三角运行 Running war on http://localhost:9090/,我在pom.xml插件中指定了端口号9090 jdbc在spring中的获取方式问题 Connections could not be acquired from the underlying database! 1bootstrap做页面 2使用jquery的2个插件,coutdown,cookie 3对于js的模块化方式,把url放在一个地方统一管理 获取 对象封装 属性等 第一部分 秒杀之dao层 1maven项目管理 新建maven项目,通过pom.xml引入需要的依赖--》 对于依赖包的groupid和artifactid可以通过在网上找到maven repository 输入所需的artifactid即可找到在pom.xml中的写法 --》在项目上右击--》Run As-->maven install 把依赖包下载到本地 2配置文件的加载顺序: spring-dao.xml mybatis-config.xml mapper/*.xml spring统一管理mybatis,数据库,dao层,entity类 3完成顺序: 1pom.xml-->maven install 2entity类 3db table创建 4dao层接口定义 5写mybatis的配置文件 做简单的设置 列名和类字段的映射关系等 6sql的xml文件 7spring配置文件 管理mybatis 8spring junit单元测试 4遇到的问题: 1xml文件,没有属性提示--通过windows-->preferences-->xml catalog -->add-->location指定dtd位置 关于获取dtd,可从项目下的MAVEN Project里面找到相对应的jar包,在某个位置有个schema的文件,里面有这个dtd所在的位置提示 2 上面的操作只是解决了属性名的提示,但是关于属性值则没有 我下了intellij,它可以做到智能提示但是只对有的类,在写包名类名时可以提示 也做不到把某个类下的name值提示出来 第二部分 秒杀之service层 秒杀 “事务性” 秒杀 红包常见 Java web 常用的框架:springMVC+spring+mybatis dao:接口设计+sql 代码和sql分离 方便review dto:关注web和service的数据传递 entity包内的和table表对应 业务接口: 三方面: 方法定义粒度 简单参数 返回类型 spring管理service依赖 spring IOC 对象工厂 一致性的访问接口 依赖管理 业务对象的依赖图 seckillService SeckillDao,successKilledDAO sqlSessionFacotry dataSource why IOC 对象创建统一托管 not new 规范的生命周期管理 初始化 销毁 灵活的依赖注入 一致的获取对象 从容器获取已知的实例 Spring-IOC的注入方式 XML applicationzContext.xml Bean实现类来自第三方类库 DataSource等 需要命名空间配置 context aop mvc 强大的spring配置 注解 自定义类 @Service @Controller JAVA配置 spring的配置类 需要通过代码控制对象创建逻辑 自定义修改依赖类库等 使用: XML配置 package-scan 包扫描 Annotaiton注解 spring声明式事务 开启事务 修改sql-1 修改sql-2 提交/回滚事务 全自动方式 使用方式 ProxyFactoryBean+XML 早期 tx:advice+ap命令空间 一次配置 注解@Transactional 注解控制(推荐) 事务方式嵌套 传播行为 propagation_required 何时回滚事务: 抛出运行期异常RuntimeException 小心不当的try-catch spring 配置声明式事务 logback的官网http://logback.qos.ch/demo.html 查看配置文件xml示例 日志级别 权重由大到小: FATAL(CRITICAL) ERROR WARN INFO DEBUG service层总结: 1log日志的输出级别为debug时,可以打印sql执行语句,info时不可以,应该有默认设置 2抛出异常如果有自定义异常可以使用具体的异常catch,最后用Exception类型的 3对象工厂,对象bean间的依赖管理由spring来托管 需要使用事务的地方,用注解的方式配置 java高并发API之web层 前端交互设计 Restful 规范url设计规范 SpringMVC 配置 应用 bootstrp+jquery 页面布局 交互实现 1前端交互设计 需求设计 配合 友好的系统 产品 前端 后端 存储展示 列表页 秒杀产品列表 详情页 login-------->展示逻辑 登录--cookie 1获取标准系统时间 服务器时间 2时间判断 开始 结束时间 结束 倒计时--》秒杀地址--》秒杀操作--》秒杀结果 Restful接口 是什么 起于Rail 优雅的url表达方式 资源的状态 和状态的转移 怎么用 GET /seckill/list POST /seckill/execute/{seckillId} 不好 POST /seckill/{seckillId}/execution 好 DELETE /seckill/{id}/delete GET 查询 POST 添加修改 非幂等操作 PUT 修改 DELETE URL设计 /模块/资源/{标示}/集合1/... /user/{uid}/friends ->好友列表 /user/{uid}/followers ->关注者列表 秒杀API的URL设计 GET /seckill/list GET /seckill/{id}/detail GET /seckill/time/now 系统时间 POST /seckill/{id}/exposer 暴露秒杀 POST /seckill/{id}/{md5}/execution >执行秒杀 Spring MVC理论 Handler 数据Model 页面View 运行流程: 用户发送请求 DispatcherServlet HandlerMapping HandlerAdapter Controller ModelAndView /seckill/list InternalResourceViewResolver jsp Model list.jsp Http请求地址映射原理 Servlet (tomcat,jetty等) SpringMVC Handler Mapping 注解 xml Handler处理 @RequestMapping注解 标注url ant风格url {xxx}占位符的url 例如: /user/*/creation /user/aa/creation /user/**/creation /user/a/b/c/creation /user/{userId} /company/{companyId}/user/{userId}/detail 请求方法的细节处理 1请求参数绑定 2请求方法限制 3请求转发和重定向 4数据模型赋值 5返回json数据 6cookie访问 @RequestMapping(value="/{seckillId}/detail, method=RequestMethod.GET") public String detail(@PathVariable("seckillId"Long seckillId,Model model)){} json返回 @RequestMapping(value="/{seckillId}/{md5}/execution, method=RequestMethod.POST, produces={"application/json;charset=UTF-8"}) @ResponseBody //返回json public SeckillResult<Exposer>exportSeckillURL( @PathVariable("seckillId") long id){} cookie访问 @RequestMapping(value="/{seckillId}/{md5}/execution, method=RequestMethod.POST) public SeckillResult<Exposer>exportSeckillURL( @PathVariable("seckillId") long id, @PathVariable("md5") String md5, @CookieValue(value="killPhone",required=false)Long phone){} 配置整合SpringMVC框架 Bootstrap前端框架 js复习 太久没用过,犯了好多基础的错误 引入controller中放入model的attribute的key,需要用${}来获取 访问路径不想写项目名,可以通过设置web root=/ 通过jquery插件开发交互 http://www.bootcdn.cn/ CDN服务 测试js使用: 在用alert调试时,一定要在调用某个方法前,明确是否为空 否则的话,不会报错,反而会给测试带来混乱 当获取到某个对象时,比如是个数字对象,在进行操作时,必须 知道自己在操作的是对象还是在对对象的值做操作 js文件的引入的一段js代码不知道为什么总是红色注释错误 但是不影响运行??? 1验证手机登录 手机号存储在cookie 2计时交互 技术回顾 前端交互设计 Restful接口规范 SpringMVC使用技巧 Bootstrap和JS的使用 倒计时 未开始 结束 产品——前端--后端 秒杀API的url设计 SpringMVC使用 配置 运行流程 DTO数据传递 注解映射驱动 javascript模块化 类似java的分包 Jquery&plugin的使用 计时插件 cookie插件 高并发分析和优化分析 Java高并发秒杀API之高并发优化 1分析 发生在哪:详情页 地址暴露接口 执行秒杀 why 单独获取系统时间? 用户大量刷新 CDN detail页静态化 静态资源css,js等 理解CDN:加速用户获取数据的系统 静 动 部署在离用户最近的网络节点上 命中CDN不需要访问后端服务器 互联网公司自己搭建或是租用 获取系统时间不用优化 访问一次内存大约10ns 1s可以1亿次 获取秒杀地址解耦分析 无法使用CDN缓存 随着时间会变 适合服务器缓存的redis,memache等 后端缓存 业务控制 一致性为本成本低 秒杀地址接口优化 请求地址--》redis-->mysql 超时穿透 主动更新 秒杀操作优化分析: 无法cdn缓存 后端缓存困难:库存问题 一行数据竞争:热点商品 其他解决方案分析: 常用: 执行秒杀--》原子计数器 redis nosql 减库存--》记录行为消息 分布式MQ 消息队列 消费消息并落地 mysql 好处:抗并发 成本分析: nosql mq 运维成本和稳定性 分布式组件的稳定性要支持 开发成本:数据一致性,回滚方案等 幂等性难保证:重复秒杀问题 不适合新手的架构 why not mysql? mysql低效? 1s 4w qps 低效的原因? java控制事务的行为分析 update table set num=num-1 where id=10 and num>0 insert购买 另一个人执行这一操作,就要等待行锁,只有等上个操作 完成后,释放锁后,才能被第二个人获得行锁 同样的并行操作变成了串行等待 阻塞操作 瓶颈分析: update 减库存 网络延迟 GC garbage collection insert 购买明细 网络延迟 GC commit/rollback 一个线程结束 慢的不是mysql,java java和数据库的通信有延迟 执行时间 行级锁在commit后释放 优化方向:如何减少行级锁的持有时间 延迟分析 更新成功判断: 自身没报错 客户端确认update影响的记录数 优化思路: 客户端逻辑放在mysql服务器,避免网络延迟和GC影响 解决: 1定制sql 但是需要修改mysql源码 不需要再返回给java做判断 2使用存储过程:整个事务在mysql端完成 前端控制:暴露接口 按钮防重复 动静态数据分离:CDN缓存静态资源,后端缓存redis 事务竞争优化:减少事务锁时间 在mysql服务端完成,不再mysql和java间在通讯 Redis后端缓存优化编码 详情页做静态化 CDN 系统时间 不用优化 计时在浏览器端 对服务器没有影响 地址暴露接口 Resful请求访问后端 执行秒杀请求 使用Redis优化地址暴露接口 引入jedis-client,protostuff的依赖后,pom.xml报错,编译也不能通过 是引入的顺序问题放在前面就解决了 秒杀操作:并发优化1 减库存rowLock insert购买明细 commit freeLock 瓶颈主要在网络延迟 GC 简单优化: 缩短时间 调整顺序 insert 主键冲突不多 update减库存 rowLock commit freeLock insert ignore 0 1 客户端会根据返回值判断是否继续执行 降低rowLock的持有时间 存储过程 深度优化 事务sql放在mysql端执行 bootcdn地址:http://www.bootcdn.cn/ 降低行级锁到commit的时间,使得mysql获得更高的qps 在cmd控制台执行存储过程: mysql -uroot -proot -Dseckill show tables; show create procedure execute_seckill\G select * from seckill where seckill_id=1003;\G DELIMITER ; set @r_result=-3; call execute_seckill(1003,13501234567,now(),@r_result); --获取结果 select @r_result; 存储过程优化:事务行级锁持有的时间 不要过度依赖存储过程 简单的逻辑可以应用存储过程 在项目中调用存储过程 db创建存储过程--》通过mybatis调用存储过程,dao层逻辑--》service层直接调用dao层的方法 --》web层调用service的存储过程方法 系统部署架构 bootstrap 公网的CDN加速获取内容的方式 静态化数据 强制静态化内容 推送CDN 降低服务器的请求量 WEBserver :Nginx+Jetty Redis Mysql 系统架构: 流量: cdn缓存 只能DNS解析 Nginx 帮service容器做集群 逻辑集群 Jetty Jetty Jetty 缓存集群 Redis Redis Redis 分库分表 DB-1 DB-2 DB-N TDDL做分表用 统计分析 handoop 角色: 开发: 前端+后端 测试 DBA 运维 机器监控 脚本 数据层技术回顾 数据库设计和实现 db schema mybatis理解和使用技巧 mybatis整合spring技巧 业务层技术回顾 业务接口设计和封装 springIOC配置技巧 声明式事务xml,自定义类注解方式 Spring的声明式事务使用和理解 何时回滚和提交 WEB技术回顾 Restful 接口运用 get post SpringMVC使用技巧 前端交互分析过程 Bootstrap和JS的使用 并发优化 系统瓶颈点分析 事务 锁 网络延迟的理解 前端 CDN 缓存等理解使用 集群化部署
About
秒杀
Resources
Stars
Watchers
Forks
Releases
No releases published
Packages 0
No packages published