一、说明需求
上一个项目中实现了一个给办信用卡的用户发优惠券的功能。其中有一种类型的优惠券是有数量限制的,此种优惠券要在后台提前生成,可能是一百张,也可能是几千张上万张。这时,就涉及到一个问题:在后台循环构造优惠券并依次把其插入数据库时,频繁的对数据库进行频繁的插入操作,大家都知道对数据库的操作很费时,所以这造成了操作人员等待时间长的很不好的体验。那么,该怎样解决这个问题呢?
二、解决思路
所有人都能想到的一点就是另外开启一个线程来专门用于优惠券插入操作,而当前线程只需给当前操作成功即可,如果另一个构造优惠券的线程插入过程发生异常,那么可以给用户发邮件等提示操作。怎样用一种很好的机制去是实现这一种协同操作呢?没错,就是redis队列以及监听器的合作。把当前优惠券批次信息存入redis队列,另一端监听器一直监听该队列,一旦发现队列有批次信息键值对,那么立即在监听器那个线程循环生成优惠券。
三、实现
1、对于后台主线程,只需把该优惠券批次信息插入到redis中即可,用redis客户端jedis
2、对于监听器,要求项目一启动就开始运行,那么就用到了SpringBoot的ApplicationRunner这个类,此类执行的时机是容器启动完成的时候,这个接口中有一个run方法,实现类在此run方法开启生成优惠券的进程即可。
RedisCouponTaskThread类为专门用于生成优惠券的线程
3、RedisCouponTaskThread类
这个线程自Spring容器初始化完成后就被ApplicationRunner这个类唤醒了,并且一直运行,一旦发现redis队列中有CouponTaskList这个键,就把这个键的value弹出,也就是优惠券批次对象,从而进行该批次的一些操作。
四、总结
此处的redis队列主要起一个缓存的作用,这个也是redis众多功能之一的生产者消费者模式,感叹redis就像一把多功能的瑞士军刀,有种四两拨千斤的感觉,特别巧妙。此篇文章写的比较笼统,只是提供一个大体的思路,刚入行不到半年,特此记录学习日志。如有不对的地方,请各位大神指正。