贵阳网站建设培训学校,合肥瑶海区网站建设价格,Wordpress 仿站 工具,海外购物网站大全阻塞队列#xff08;RBlockingQueue#xff09;
作用和特点#xff1a;
实时性#xff1a;阻塞队列用于实时处理消息。生产者将消息放入队列#xff0c;消费者可以立即从队列中取出并处理消息。阻塞特性#xff1a;如果队列为空#xff0c;消费者在尝试获取消息时会被…阻塞队列RBlockingQueue
作用和特点
实时性阻塞队列用于实时处理消息。生产者将消息放入队列消费者可以立即从队列中取出并处理消息。阻塞特性如果队列为空消费者在尝试获取消息时会被阻塞即等待直到有新的消息进入队列。这种特性在需要确保消费者不空转的场景中特别有用。
使用场景
实时数据处理如日志处理、即时消息系统等。任务队列如线程池中的任务调度。
延迟队列RDelayedQueue
作用和特点
延迟处理延迟队列允许将消息在指定的延迟时间之后才加入实际的处理队列。这对于需要控制消息处理频率或需要在特定时间处理消息的场景非常有用。有序性消息按计划的处理时间顺序被放入实际队列。这种特性使得延迟队列非常适合于定时任务和延迟任务的实现。缓冲和节流通过延迟队列可以缓冲突发的高流量平滑处理高峰请求避免系统过载。
使用场景
定时任务如定时发送邮件、定时清理任务等。延迟处理如订单超时取消、延迟支付处理等。流量平滑缓冲高峰流量防止瞬时高负载对系统的冲击。
redis中的存储格式
阻塞队列存储
阻塞队列RBlockingQueue在Redis中存储为列表List。元素加入时使用 LPUSH取出时使用 RPOP。
延迟队列存储
延迟队列RDelayedQueue在Redis中存储为有序集合Sorted Set管理延迟时间。当元素的延迟时间到达时元素从有序集合移动到实际的阻塞队列中。
使用方式
写入队列
Override
public voidawardStockConsumeSendQueue(StrategyAwardStockKeyVO strategyAwardStockKeyVO) {// 写入队列操作奖品库存消耗的队列String cacheKey Constants.RedisKey.STRATEGY_AWARD_COUNT_QUERY_KEY;// 创建队列信息// 通过 redisService 获取一个阻塞队列RBlockingQueueStrategyAwardStockKeyVO blockingQueue redisService.getBlockingQueue(cacheKey);// 用阻塞队列 blockingQueue 创建一个延迟队列 delayedQueue// 将队列信息加入到延迟队列中希望固定一个时间段写入队列但是不要写的这么快消费完了写的时候慢一些让下游处理有一个反应时间RDelayedQueueStrategyAwardStockKeyVO delayedQueue redisService.getDelayedQueue(blockingQueue);// 这里3秒之后再加入到队列中去// 将 strategyAwardStockKeyVO 加入到延迟队列中设置延迟时间为 3 秒delayedQueue.offer(strategyAwardStockKeyVO, 3, TimeUnit.SECONDS);
}从队列中取
Override
public StrategyAwardStockKeyVO takeQueueValue() {String cacheKey Constants.RedisKey.STRATEGY_AWARD_COUNT_QUERY_KEY;// 通过 cacheKey 获取一个阻塞队列。RBlockingQueueStrategyAwardStockKeyVO destinationQueue redisService.getBlockingQueue(cacheKey);// 这里不用taketake需要一直等待。已经有定时任务了直接弹出即可// 从阻塞队列中取出一个元素如果队列为空返回 nullreturn destinationQueue.poll();
}