一、优惠券秒杀6——Redis优化秒杀
1、 问题引出——
之前由于使用了大量的分布式锁与数据库的大量交互,虽然保证了一致性,但也造成了性能上的一些缺失。接下来就讲解如何在性能上提升——
重新梳理秒杀业务——
2、秒杀业务再梳理
总共有几下几个业务——
方法实现——
问题分析——
目前为止——
目前执行业务效率测试——
解决方案分析——
拆分业务解耦
用两个线程来执行不同业务(同步操作变为异步操作)**——这一点很重要,很多业务都可以这么做(类似于微服务)
———将优惠券信息、购买券的用户信息存入Redis
这全用lua脚本执行保证原子性,将下单用消息队列读取
二、解决方案执行
(一)、基于Redis完成秒杀资格判断
1、 优化NO1——将优惠券库存保存在Redis中
2、优化NO2——编写lua脚本——判断秒杀库存、一人一单,决定用户是否抢购成功
在Java中实现lua——
重要——任何业务的固定步骤————
1、编写控制类返回接口方法(事先没有该函数)
2、在接口里面自动生成方法
3、进入接口实现类里面使用快捷键自动实现该方法模版
4、流程图
5、列出主要步骤
6、代码实现
1、编写控制类返回接口方法(事先没有该函数)
2、在接口里面自动生成方法
3、进入接口实现类里面使用快捷键自动实现该方法模版
4、流程图
5、列出主要步骤
6、代码实现
补充——TODO
在IntelliJ IDEA中,TODO是一种特殊的代码注释,用于标记代码中需要注意、尚未完成或需要进一步处理的部分。开发者可以通过查看IDEA的TODO工具窗口,轻松地找到和管理项目中的所有TODO注释。这有助于团队更好地追踪和处理待办事项。
结果测试——
(二)、基于JDK阻塞队列完成异步下单
1、 优化NO3——如果抢购成功,将优惠券id和用户id封装后存入阻塞队列
子线程里面是不能拿到ThreadLocal里的内容的——
创建代理字段即可——
IDEA快速创建方法——
三、剩余问题——
内存溢出——
这里我们使用的是JDK里面的阻塞队列,而这个队列使用的是JDK里面的内存。如果不加以阻止,在高并发情况下可能会有无数订单对象需要创建并且放到阻塞队列里面。可能会导致将来内存溢出。
数据安全问题——
现在的服务是基于JVM内存保存的,没有持久化机制
情况一:”如果服务突然宕机了,那内存里的所有的订单信息都丢失了。用户已经付款,但是后台没有收到相关信息,出现不一致的情况。
情况二:当我们从队列里面取出订单后,在正准备执行之时,出现了异常。等回复后原本取出的订单已经不复存在了。也相当于订单丢失了。
如何解决上述问题?请点击这里——Java项目——黑马点评(优惠券秒杀7之Redis消息队列MQ实现异步秒杀。