点击上方“码农沉思录”,选择“设为星标”
优质文章,及时送达
前言
微信红包业务,发红包之后如果24小时之内没有被领取完就自动过期失效。
架构设计
业务流程
老板发红包,此时缓存初始化红包个数,红包金额(单位分),并异步入库。红包数据入延迟队列,唯一标识+失效时间红包数据出延迟队列,根据唯一标识清空红包缓存数据、异步更新数据库、异步退回红包金额
代码案例
这里我们使用Java内置的DelayQueue来实现,DelayQueue是一个无界的BlockingQueue,用于放置实现了Delayed接口的对象,其中的对象只能在其到期时才能从队列中取走。这种队列是有序的,即队头对象的延迟到期时间最长。
老板发了10个红包一共200人民币,假装只有9个人抢红包。
发红包,缓存数据进入延迟队列:
/** * 有人没抢 红包发多了 * 红包进入延迟队列 * 实现过期失效 * @param redPacketId * @return */ @ApiOperation(value="抢红包三",nickname="爪哇笔记") @PostMapping("/startThree") publicResult startThree(long redPacketId){ int skillNum = 9; finalCountDownLatch latch = newCountDownLatch(skillNum);//N个抢红包 /** * 初始化红包数据,抢红包拦截 */ redisUtil.cacheValue(redPacketId+"-num",10); /** * 初始化红包金额,单位为分 */ redisUtil.cacheValue(redPacketId+"-money",20000); /** * 加入延迟队列 24s秒过期 */ RedPacketMessage message = newRedPacketMessage(redPacketId,24); RedPacketQueue.getQueue().produce(message); /** * 模拟 9个用户抢10个红包 */ for(int i=1;i{ /** * 抢红包 判断剩余金额 */ Integer money = (Integ