当前位置: 首页 > news >正文

白领兼职做网站企业微信下载app

白领兼职做网站,企业微信下载app,昆明建网站公司,娄底网站建设优化企业一,延迟任务应用场景? 一般用于处理订单,将redis中的数据延迟存入数据库,实现异步存储减少DB的压力 二, 延迟任务的实现方案有很多 DelayQueue Redisson MQ 时间轮 原理 JDK自带延迟队列,基于阻塞队列…

一,延迟任务应用场景?


一般用于处理订单,将redis中的数据延迟存入数据库,实现异步存储减少DB的压力

二, 延迟任务的实现方案有很多


DelayQueue

Redisson

MQ

时间轮

原理

JDK自带延迟队列,基于阻塞队列实现。

基于Redis数据结构模拟JDK的DelayQueue实现

利用MQ的特性。例如RabbitMQ的死信队列

时间轮算法

优点

  • 不依赖第三方服务

  • 分布式系统下可用

  • 不占用JVM内存

  • 分布式系统下可以

  • 不占用JVM内存

  • 不依赖第三方服务

  • 性能优异

缺点

  • 占用JVM内存

  • 只能单机使用

  • 依赖第三方服务

  • 依赖第三方服务

  • 只能单机使用

三,延迟任务的原理


 1,DelayQueue的源码

public class DelayQueue<E extends Delayed> extends AbstractQueue<E>implements BlockingQueue<E> {private final transient ReentrantLock lock = new ReentrantLock();private final PriorityQueue<E> q = new PriorityQueue<E>();// ... 略
}
  •  DelayQueue实现了BlockingQueue接口,是一个阻塞队列。队列就是容器,用来存储东西的.
  • DelayQueue的泛型定义

    • <E extends Delayed> 

  • 这说明存入DelayQueue内部的元素必须是Delayed类型

 进一步查看Delay接口

public interface Delayed extends Comparable<Delayed> {/*** Returns the remaining delay associated with this object, in the* given time unit.** @param unit the time unit* @return the remaining delay; zero or negative values indicate* that the delay has already elapsed*/long getDelay(TimeUnit unit);
}

看完之后我们先不管 ,继续看他的父类Comparable<Delayed>

里面有一个方法,用于比较大小

2,从源码中可以看出,Delayed类型必须具备两个方法:

  • getDelay():获取延迟任务的剩余延迟时间

  • compareTo(T t):比较两个延迟任务的延迟时间,判断执行顺序

    • 根据源码中的注解可以看出

      • zero or negative values indicate * that the delay has already elapsed

      • 零或者负值表示延迟已经过去

四,DelayQueue的用法


1,定义一个延迟任务的工具类

package com.tianji.learning.utils;import lombok.Data;import java.time.Duration;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;@Data
public class DelayTask<D> implements Delayed {private D data;    //用于存放延迟任务的数据private long deadlineNanos;    //延迟任务延迟到什么时候/***    delayTime    延迟多长时间*/public DelayTask(D data, Duration delayTime) {this.data = data;//用当前时间和需要延迟的时间相加得到的结果就是延迟任务延迟结束的时间this.deadlineNanos = System.nanoTime() + delayTime.toNanos();}/***    这个方法是用于获取延迟任务的剩余时间*/@Overridepublic long getDelay(TimeUnit unit) {return unit.convert(Math.max(0, deadlineNanos - System.nanoTime()), TimeUnit.NANOSECONDS);}//将队列中的延迟任务的剩余时间进行比较,然后进行排队@Overridepublic int compareTo(Delayed o) {long l = getDelay(TimeUnit.NANOSECONDS) - o.getDelay(TimeUnit.NANOSECONDS);if(l > 0){return 1;}else if(l < 0){return -1;}else {return 0;}}
}

2,使用延迟队列

// 1.初始化延迟队列
DelayQueue<DelayTask<String>> queue = new DelayQueue<>();
// 2.向队列中添加延迟执行的任务                        //当前延迟时间是Second
queue.add(new DelayTask<>("延迟任务数据,可以是方法", Duration.ofSeconds(延迟时间)));
// 3.尝试执行任务
DelayTask<String> task = queue.take();
//执行延迟队列中的任务
task.getData()

http://www.yayakq.cn/news/310325/

相关文章:

  • 做商城网站流程wordpress怎么看html5
  • 中小型企业网站模板seo好seo
  • 太原模板建站定制校园在线网站怎么做
  • 始兴建设局网站免费的简历制作
  • 模板网站有利于优化wordpress有app模板吗
  • 网站app下载大全南宁做网站找哪家好
  • 哪个网站有手工活做图片制作表情包
  • 网站生成app 免费工具东平县住房和城乡建设局网站
  • 网站设计一般包括python怎么做专门的手机网站
  • 网站在线沟通工具网站建设硬件支撑
  • 公积金网站建设模板c 网站开发模式
  • 安防公司做网站图片没有网站可以做落地页
  • 网站备案填写电话手机优化大师怎么卸载
  • 怎样做企业网站备案安庆做网站
  • 个人建设网站网站建设要准备些什么
  • 厦门制作网站哪家好网站皮肤样板
  • 餐饮网站源码网站超市
  • 途牛旅游线路网站建设分析韶关网站设计公司
  • docker架设wordpress求职seo服务
  • 网站 网络推广wordpress 需要连接ftp
  • 茂名住房和城乡建设厅网站网站如何做百度才会收录
  • 做网站用什么配置笔记本wordpress链接不对清除缓存文件
  • 河南网站推广优化报价推广平台赚钱
  • 免费舆情网站下载大全最新版做悬赏的网站
  • 这2个代码 找做网站的 安装一下佛山 网站
  • 哪个网站可以做海报最新消息深圳龙岗确诊
  • 技术支持 东莞网站建设母婴护理建设小企业网站步骤
  • 女同性怎么做的视频网站手机网站怎么做域名解析
  • 电脑建立网站平台php网站开发培训
  • 重庆建设工程招标信息网站漳州台商投资区