基於Redis的延時隊列

之前有一篇文件講到延時隊列,用的是jdk的 DelayQueue實現的。

使用jdk的DelayQueue實現的缺點: 1.基於應用內存,重啓或宕機後數據會丟失 2. 如果要集羣,不好擴展

此處基於redis做一個可用性較高的延時隊列。

Redisson中有延時隊列的實現,可以直接拿來用

@Controller
@RequestMapping("order")
public class OrderController extends BaseController {

    /**
     * 下訂單
     */
    @PostMapping()
    @ResponseBody
    public WSResponseVO doOrder(){
        //調用生成訂單邏輯,並返回訂單id
        String orderId = UUID.randomUUID().toString();
       RBlockingQueue<RedPacketMessage> blockingRedPacketQueue
                = redissonClient.getBlockingQueue("orderDelayQueue");
    
        RDelayedQueue<RedPacketMessage> delayedQueue
                = redissonClient.getDelayedQueue(blockingRedPacketQueue);

        
        //訂單延時進入隊列.延遲3秒後失效
        delayedQueue.offer(new MyDelayMessage("001A"), 3, TimeUnit.SECONDS);
    }

}

對於從隊列中取元素消費跟使用jdk的差不多,只是隊列要從redis中獲取。其獲取元素的API也是take().此處省略代碼

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章