电商秒杀程序, 乐观锁,Spring Boot.
如果该项目对您有帮忙,您可以右上角’star’支持一下,谢谢!
演示地址
? http://jseckill.appjishu.com
Star me on GitHub
? https://github.com/bootsrc/jseckill
[外链图片转存失败(img-ehMOIcLq-1566535597258)(https://raw.githubusercontent.com/bootsrc/jseckill/master/doc/image/demo-1.jpg)]
[外链图片转存失败(img-TQKQzoB7-1566535597259)(https://raw.githubusercontent.com/bootsrc/jseckill/master/doc/image/demo-2.jpg)]
[外链图片转存失败(img-FPqm8Xba-1566535597260)(https://raw.githubusercontent.com/bootsrc/jseckill/master/doc/image/demo-3.jpg)]
1.Spring Boot
2.MyBatis
3.Redis
4.Thymeleaf
5.Bootstrap
6.RabbitMQ
1.使用Google guava的RateLimiter来进行限流
2.减库存时,在同一事务内,先"插入记录",再"更新库存", 能有效减少行锁的作用时间.
数据库更新操作,采用乐观锁,提高并发性
3.暴露秒杀接口,暴露信息,作为不常更新的热点数据,贮存到Redis里
4.前端静态文档部署到CDN, 缺少资金的公司可以选择动静分离
动静分离:把静态资源(js,css,图片)直接部署放到nginx, 动态服务还在原有的tomcat/SpringBoot里。
5.Java应用部署多个集群节点,之间使用nginx做负载均衡和反向代理,提高客户端的并发数
6.RabbitMQ异步处理秒杀记录
1.RateLimiter限流。 并发量大的时候,直接舍弃掉部分用户的请求
2.Redis判断是否秒杀过。避免重复秒杀。如果没有秒杀过,则在Redis秒杀(减库存,并记录已秒杀成功者的userPhone)
3.发送秒杀记录到RabbitMQ,并且马上返回结果到客户端
4.监听RabbitMQ的队列消息, 一条条地读取消息后,操作数据库。插入秒杀记录和减库存。
并手动ACK队列
详情见源码文档
TODO
进一步的优化:等到CountDownLatch每积累20个,才去操作redis, 直接decrby 10
演示地址
? http://jseckill.appjishu.com
现在工作略忙,后面抽空完善技术文档
?⭐⭐⭐❤❤❤
GitHub地址,路过的帮忙点个星星star,谢谢?
? https://github.com/bootsrc/jseckill
有代码改进优化的建议的统一在Issues里面提
加群讨论
[外链图片转存失败(img-SGM1QiW7-1566535597263)(https://raw.githubusercontent.com/bootsrc/jseckill/master/doc/image/group-qrcode.png)]