秒杀项目总结
项目架构Springboot+Mybaties+RabbitMQ+Redis+thymeleaf
项目完成对商品的展示,详情,秒杀,及其秒杀页面的展示
在登陆模块使用了2次MD5加密的形式来保证登录的安全问题
使用了SpringSession和Redis解决了分布式会话的问题
完成基本功能后使用JEMTER进行压测,先把项目打包形成jar包,在把jar包发到linux服务器上,在服务器上运行jar包开始使用jemter进行压测,因为linux服务器本身的内存不高,压测数据不是很高,因此后面换到了window上进行压测,经过一系列的优化使其最终在100000个用户的同时访问的并发下依然能够保证不超卖现象,订单正常
后面优化先添加唯一索引使其效率大大提高,减少库存数量为负数的情况
然后将页面缓存存入redis当中来减小服务器对thymeleaf的加载,因为每次访问页面都需要服务器渲染解析模板然后再返回到页面.
然后在使用静态页面将模板全部转化为静态的,实现了前后端分离,加强了QPS的值
然后是使用InitializingBean接口进行页面初始化时将订单的数量存入redis中来减少数据库的访问
访问redis时使用了lua脚本实现了对订单的扣减来保证事务的原子性
使用rabbitMQ异步处理来减小高并发情况下消息堆积的问题,异步消峰
下单秒杀的过程:
数据库的减库存过程
先在server的实现类中通过goodsId获取当前商品数据
通过对象的set方法对商品数量进行重新定位(递减)
通过update语句对商品数据库进行更新
通过以下语句对商品进行判断结果为false说明库存已经为0
boolean result = seckillGoodsService.update(new UpdateWrapper<TSeckillGoods>().setSql("stock_count =" + "stock_count-1")
.eq("id", seckillGoods.getId()).ge("stock_count", 0));
然后通过商品对象查看商品数量小于1证明库存为空返回null不为空则继续
然后将更新完的信息插入订单数据库和秒杀订单的数据库创建订单和秒杀订单
然后将生成的秒杀订单存入redis
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。