之前有一篇文件講到延時隊列,用的是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().此處省略代碼