关于秒杀项目的一些笔记和解释

本文详细介绍了一套高性能秒杀系统的架构与实现细节,涵盖Redis缓存策略、AJAX前端优化、加密技术、自定义注解验证、异常处理、RabbitMQ消息队列、限流算法、Nginx负载均衡等关键技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(1) 项目整体认识

(1)redis做对象缓存:(因为redis毕竟有网络开销,有些地方可以使用conCurrentHashMap代替redis

将商品秒杀对象缓存在redis中减少mysql的io

用户登录token(分布式session)

常用的数据标记在redis中(如:数据是否被秒杀了,是否重复秒杀等等)

(2)ajax前端静态化:将html缓存在客户端,减少网络数据传输(vue是更好的选择,如果会前端编程可以用nodejs相关框架)

(3)加密使用的是两次MD5:前端一次MD5传到后端,后端一次MD5,最后加入数据库

(4)validate自定义注解(JSR303):访问数据前对数据正则判断,不符合要求的一律不允许通过,用注解统一管理使得代码更加优雅简洁

(5)全局异常处理:使得就算报错,前端也不会跳出奇怪的异常界面,而是在后端控制台显示已经捕获的异常

(6)本项目的util也提供了雪花算法生成id的方式,虽然为了简化代码量没有使用,但是提供简单的demo供大家学习。
也可以参考雪花算法的使用:https://blog.youkuaiyun.com/qq_35688140/article/details/100152631

(7)rabbitmq:为了减少数据库一次性写入太多数据而无法承受,故设置了rabbitmq作为数据的缓冲稍后再写入到数据库

(8)隐藏秒杀的url:在调用秒杀的url之前多加了一层验证,防止机器人不停刷秒杀用的url,该验证层使用限流算法限制流量

(9)限流设置:使用自定义注解的方式限制用户的流量,一旦流量大于5秒内5次,就返回刷新频率过高。(因为采用注解的方式,可以手动传入秒数和次数)
限流算法https://blog.youkuaiyun.com/qq_35688140/article/details/100775820

(10)服务器可以nginx+多个tomcat实现分担负载
在这里插入图片描述

(2)access:access中定义了一个自定义注解@AccessLimit

1.AccessValidator:实现了相关的handler进行对带有@AccessLimit注解的方法做出处理
2.UserContext:用于保存一些某个线程中的全局数据,借用了ThreadLocal
3.AccessLimit接口:有三个属性,分别限制了用户的是否登陆和刷新页面的频率

在这里插入图片描述

(3)config:对全局的所有方法拦截,当访问方法时,如果url上带有user对象或者cookie中有MiaoshaUser的就取出改user,这样每个方法只需要在参数中写一个MiaoshaUser user就可以直接获取到user,不必每个方法都重复获取user这个动作

1.UserArgumentResolver:拦截获取参数的具体实现
2.WebConfig:将UserArgumentResolver配置到spring容器中

在这里插入图片描述

(4)controller:所有程序的入口

1.DemoController:主要是测试比如mybatis是否整合成功,thymleaf是否整合成功等等。
2.GoodsController: 实现获取某个商品和获取所有商品信息(里面有一些关于html静态化到redis的操作,但是改造成前后分离以后redis缓存html页面也就没有意义了,浏览缓存比redis缓存更有效),里面使用的商品对象大都是GoodsDetailVo或者GoodsVo,这一下都是经过多张表但关联起来的包装类
3.LoginController:实现用户登录
4.MiaoshaController:
(1)秒杀
(2)获取秒杀接口:对秒杀接口进行多一层封装,防止机器人刷url,并且限制了刷新频率
5.OrderController:获取订单详情

在这里插入图片描述

(5)dao:数据库访问

1.GoodsDAO:列出所有商品,列除某个商品,减少商品库存
2.MiaoshaUserDAO:查询某个用户,更新某个用户密码
3.OrderDao:操作订单数据和秒杀订单数据(有一个是普通的商品订单,有一个秒杀商品的订单)
4.UserDAO:修改用户密码,查询用户
在这里插入图片描述

(6)domain:和数据库一一对应

在这里插入图片描述

(7)exception:定义全局异常和异常处理器

1.GlobalExceptionHandler:将所有的异常以Result.error(ex.getCm())方式返回出去。可以被前端获取并弹窗。

在这里插入图片描述

(8)rabbitmq: 关于rabbitmq的使用方法和配置

1.MQConfig:配置rabbitmq
2.MiaoshaMessage:rabbitmq的消息传递的信息封装类
3.MQReceiver:监听相应的消息队列,一旦有数据,马上取出处理
4.MQSender:发送消息

在这里插入图片描述

(9)redis:所有redis的配置和redis封装方法

1.RedisConfig:配置好了redis的参数,与application.properties中的redis参数一一对应
2.impl:此包下的都是redis的自定义前缀
3.BaseKeyPrefix :自定义前缀的抽象类
4.KeyPrefix:自定义前缀的接口
5.JedisPoolFactory:jedis工厂,用于生产jedisPool
6.RedisService:封装了redis的增删改查方法(带有自定义前缀的增删改查方式)

在这里插入图片描述

(10)result:返回信息的规范化(rest风格)

1.CodeMsg:返回的错误类型
2.Result:封装了成功和失败方法

在这里插入图片描述

(11)service:业务逻辑

1.GoodsService:商品的查询和减少库存
2.MiaoshaService:作为正好个程序最复杂的类
(1)秒杀的事务处理
(2)秒杀的成功失败和排队中三种状态的查询,
(3)验证码的生成和验证
(4)获取秒杀path的验证和生成
3.MiaoshaUserService
(1)秒杀用户的登录和校验
(2)token放入到redis中和cookie中
4.OrderService:下订单,和订单缓存到redis
5.UserService:这是一个redis和mybatis整合是否通过的测试类
在这里插入图片描述

(12)util:工具包

1.MD5Util:md5加密解密(两次md5)
2.SnowFlowUtil:雪花算法
3.UUIDUtil:生成uuid
4.ValidatorUtil:@IsMobile标签的正则验证类
在这里插入图片描述

(13)validate:jsr303参数验证自定标签

1.IsMobile:标签类型定义
2.IsMobileValidator:验证@IsMobile标签的验证实现

在这里插入图片描述

(14)vo:关于数据库原生实体类的二次包装,便于使用,很多包装类都是多张表关联查询的结果

在这里插入图片描述

源码:https://github.com/LUK-qianliu/miaosha

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值