这篇博客是笔者学习慕课网若鱼老师的《Java秒杀系统方案优化 高性能高并发实战》课程的学习笔记。若鱼老师授课循循善诱,讲解由浅入深,欢迎你们支持。html
本文记录课程中的注意点,方便之后code review。此外,本文将注意点相关的优质讲解连接在了一块儿,方便初学者系统学习。前端
本文并不是单纯介绍秒杀系统特有的技术点,不适合高手。进阶学习的话,极客时间有个不错的小专栏——如何设计一个秒杀系统,阿里高级技术专家讲解秒杀系统的设计要点,那个课程挺干货的。java
用户的数据库表设计,须要增长一字段保存密码的Salt值mysql
两次MD5操做(敏感数据必定要使用https协议传输
):nginx
不用盐的话,MD5字符串有可能会被彩虹表或者社工库破解程序员
此次加盐MD5,能够有效防止内部员工泄露或者数据库被拖库后,明文密码泄露算法
能够参照javax.validation.constraints.NotNull注解,自定义本身的校验器,将校验代码与业务代码分离。不过因为校验失败会输出BindException异常,因此最好配合全局捕获异常进行友好的输出。sql
自定义校验器很简单,只须要定义一个注解和对应的校验类数据库
使用@ControllerAdvice注解,定义全局的异常捕获,并从异常中获取异常信息解析出来,发送给前端
能够自定义一个GlobalException异常,利用全局异常捕获,将全部服务器处理异常集中处理。(Service层处理异常后不设置状态码,而是直接抛GlobalException全局异常)后端
不返回状态码的好处是Controller层不须要再繁琐的判断Service层的返回值,代码更简洁
另外,自增ID的缺点也就是没法在多个表中,或者多个数据库中保持ID主键惟一不重复,因此如果使用分布式数据库以及数据合并的状况下时不能使用自增ID的。
Service的api相比dao会多一些防护代码(例如,直接修改了别的模块dao数据,但缓存未清理),更加安全
秒杀有两个事务:
PROPAGATION_REQUIRED是Spring默认的传播机制,若是外层有事务,则当前事务加入到外层事务,一块提交,一块回滚。本工程的场景使用默认事务传播机制便可
有关Spring事务传播机制能够查看这篇博客
接口测试能够还使用Postman和ApacheBench
缓存方法:将渲染好的html文件存放到Redis。在访问Url时,首先检测Redis是否有html缓存。有缓存的话则直接返回缓存;没有缓存的话则渲染后存入Redis,并返回给前端。页面缓存过时时间具体根据业务场景判断。
页面局部缓存。热点数据缓存,当Ajax请求信息更新,涉及的多是须要保存在数据库的操做,例如表格信息等时,能够采用Redis缓存,方法同页面缓存同样,定义好能够区分业务的Key便可
若是须要采用JS/CSS压缩或者减小链接数等方法,能够使用HTTP2来提高性能
顺序:
优化:
使用计数法,在拦截器作限制请求频率。利用Redis缓存的有效期(以用户ID拼接Url做为key,以访问次数为value),指定缓存有效期为1秒,访问接口每次将value+1,到达阈值跳转全局异常。
优化:使用拦截器+自定义注解,减小对业务代码的侵入。有关拦截器能够查看这篇博客
另外对于接口限流也能够考虑使用令牌桶,控制对mysql的访问。
最后,限于笔者经验水平有限,欢迎读者就文中的观点提出宝贵的建议和意见。若是想得到更多的学习资源或者想和更多的技术爱好者一块儿交流,能够关注个人公众号『全菜工程师小辉』后台回复关键词领取学习资料、进入先后端技术交流群和程序员副业群。同时也能够加入程序员副业群Q群:735764906 一块儿交流。