使用Springboot+MyBatis+Redis+Rabbit+Mysql实现商品秒杀的功能。
项目的整体流程
在秒杀开始之前,将数据库中的参加秒杀的商品同步至Redis中。秒杀开始,用户发起请求,为了流程简洁,直接在网关层中的Controller中负责对部分请求进行过滤,与Redis进行交互。然后发送消息,即将用户请求信息放入Rabbitmq中。在serivce项目中消费消息,即获取到Rabbitmq中的用户请求信息,随后完成与Mysql的交互,将信息持久化到数据库中。
网关项目中的Controller
1 |
|
布隆过滤器工具类:
1 |
|
1 | public class HashFun { |
Service项目
数据同步类
可写成任务调度的形式,需要在主启动类上添加注解@EnableScheduling
,开启任务调度功能。
这里采用每次项目启动时进行数据同步。
1 |
|
消息监视类
用来监听消息和获取消息,从消息队列中获取请求信息,完成与数据库的交互。
1 |
|
处理秒杀业务方法
1 | .class) (rollbackFor = RuntimeException |
业务方法的优化
使用Redisson解决分布式锁问题,保证线程操作的原子性,防止线程释放掉其他线程获取的锁。
引入Redisson依赖
1 | <dependency> |
编写配置类
1 |
|
改写业务方法
1 | .class) (rollbackFor = RuntimeException |