1 Star 0 Fork 0

任宗 / nightningDeals

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

秒杀项目总结

  1. 项目架构Springboot+Mybaties+RabbitMQ+Redis+thymeleaf

  2. 项目完成对商品的展示,详情,秒杀,及其秒杀页面的展示

  3. 在登陆模块使用了2次MD5加密的形式来保证登录的安全问题

  4. 使用了SpringSession和Redis解决了分布式会话的问题

  5. 完成基本功能后使用JEMTER进行压测,先把项目打包形成jar包,在把jar包发到linux服务器上,在服务器上运行jar包开始使用jemter进行压测,因为linux服务器本身的内存不高,压测数据不是很高,因此后面换到了window上进行压测,经过一系列的优化使其最终在100000个用户的同时访问的并发下依然能够保证不超卖现象,订单正常

  6. 后面优化先添加唯一索引使其效率大大提高,减少库存数量为负数的情况

  7. 然后将页面缓存存入redis当中来减小服务器对thymeleaf的加载,因为每次访问页面都需要服务器渲染解析模板然后再返回到页面.

  8. 然后在使用静态页面将模板全部转化为静态的,实现了前后端分离,加强了QPS的值

  9. 然后是使用InitializingBean接口进行页面初始化时将订单的数量存入redis中来减少数据库的访问

  10. 访问redis时使用了lua脚本实现了对订单的扣减来保证事务的原子性

  11. 使用rabbitMQ异步处理来减小高并发情况下消息堆积的问题,异步消峰

  12. 下单秒杀的过程:

    • 先从redis中拿到商品信息(一开始通过初始化把商品信息存在redis里面),如果没有订单表示秒杀商品已经卖完此时返回null
    • 然后通过redis分布式锁加lua脚本去redis里面减库存,然后再判断库存是否为0,是的话返回商品为空信息,不是的话继续
    • 将商品的id和用户封装到类中去,然后将对象转成字符串,使用rabbitMQ去发送消息
    • 在生产者端:使用rabbitMQ将消息发送到TOPIC交换机上,交换机通过路由的匹配规则将消息发送给队列,再由队列将消息发送给消费者,有消费者开始异步处理订单业务
    • 在消费者端先获取生产者发送过来的消息,先将消息转化为对象,通过消息来获取商品订单和用户对象,通过商品id来获取商品对象,然后判断商品对象中的商品数量是否还有,若没有则返回信息,若有的话,开始下单去数据库减订单.
    • 最后将信息返回
  13. 数据库的减库存过程

    • 先在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

空文件

简介

秒杀 展开 收起
Java 等 4 种语言
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
1
https://gitee.com/ren_zong/nightningDeals.git
git@gitee.com:ren_zong/nightningDeals.git
ren_zong
nightningDeals
nightningDeals
master

搜索帮助