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

wp博客网站怎么做如何做好互联网营销

wp博客网站怎么做,如何做好互联网营销,香港服务器推荐,安装wordpress文章目录 需求创建订单类创建延时队列优缺点 Reference JDK DelayQueue是一个无阻塞队列&#xff0c;底层是 PriorityQueue 需求 经典的订单超时取消 创建订单类 放入DelayQueue的对象需要实现Delayed接口 public interface Delayed extends Comparable<Delayed> {…

文章目录

  • 需求
  • 创建订单类
  • 创建延时队列
    • 优缺点
  • Reference

JDK DelayQueue是一个无阻塞队列,底层是 PriorityQueue

需求

经典的订单超时取消

创建订单类

放入DelayQueue的对象需要实现Delayed接口

public interface Delayed extends Comparable<Delayed> {long getDelay(TimeUnit unit);
}

可以看到,Delayed包含一个getDelay抽象方法,同时继承了Comparable<Delayed>接口,因此要实现Delayed接口需要实现getDelayComparable<Delayed>两个抽象方法,最后完成订单类CancelOrder,实现Delayed接口:

public class CancelOrder implements Delayed {// 订单号private String orderNo;// 过期时间 nano secondsprivate long timeout;public CancelOrder(String orderNo, long timeout) {this.orderNo = orderNo;this.timeout = timeout + System.nanoTime();}@Overridepublic String toString() {return "CancelOrder{" +"orderNo='" + orderNo + '\'' +", timeout=" + timeout +'}';}@Overridepublic long getDelay(TimeUnit unit) {// 以JVM高分辨率时间源的值为参考,获取过期时刻return unit.convert(timeout - System.nanoTime(), TimeUnit.NANOSECONDS);}@Overridepublic int compareTo(Delayed o) {if (o == this){return 0;}CancelOrder t = (CancelOrder) o;long d = (getDelay(TimeUnit.NANOSECONDS) - t.getDelay(TimeUnit.NANOSECONDS));return (d == 0) ? 0 : ((d < 0)?  -1 : 1);}
}

这里有几个地方需要啰嗦下:

  • 订单类CancelOrder包含两个成员属性:
    • orderNo:订单编号
    • timeout:过期时间,单位为纳秒(1ns = 10^-9s),所以要用long
  • getDelay()方法:用于获取订单过期的时刻,订单过期时刻是以JVM的时间作为起点计算的
    • System.nanoTime(): 返回正在运行的Java虚拟机的高分辨率时间源的当前值,以纳秒计
    • 订单过期的时刻 =JVM时间源的当前值+过期时间timeout
  • compareTo方法:就是实现了优先队列的比较方法,根据各个订单的过期时刻排序,这里其实就是一个小顶堆,队头为过期时刻最小的订单。

创建延时队列

创建一个DelayQueue其实就跟创建PriorityQueue差不多,只不过这里不需要重写个Comparator,因为订单对象已经重写了CompareTo了,是一个队头为最早过期(过期时刻最小的)元素的小顶堆。

下面主要用到DelayQueue的两个方法,分别用于加入/取出订单:

  • put(): 非常亲切的入队方法,跟普通队列一样,将对象加入队尾;
  • take(): 取出队头【过期】对象(不是跟poll()一样直接取出了)

弄个测试类测试一下

public class DelayQueueTest {public static void main(String[] args) throws InterruptedException {DelayQueue<CancelOrder> queue = new DelayQueue<>();// 每秒生成1个订单,共生成5个订单for (int i = 0; i < 5; i++){// 10s过期CancelOrder cancelOrder = new CancelOrder("orderNo"+i, TimeUnit.NANOSECONDS.convert(10, TimeUnit.SECONDS));// 获取当前时间String time = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));System.out.println(time + ": 生成订单, 10s有效,order: " + cancelOrder);// 将订单放入延时队列queue.put(cancelOrder);// 控制每秒生成一个订单Thread.sleep(1000);}// 延时队列取出超时订单try {while (!queue.isEmpty()){// 轮询获取队头过期元素CancelOrder order = queue.take();// 获取当前时间String timeout = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));System.out.println(timeout + ": 订单超时,order:"+order);}} catch (InterruptedException e){throw  new RuntimeException(e);}}
}

输出:

2024-03-30 18:54:37: 生成订单, 10s有效,order: CancelOrder{orderNo='orderNo0', timeout=636498762218800}
2024-03-30 18:54:38: 生成订单, 10s有效,order: CancelOrder{orderNo='orderNo1', timeout=636499784320900}
2024-03-30 18:54:39: 生成订单, 10s有效,order: CancelOrder{orderNo='orderNo2', timeout=636500788490700}
2024-03-30 18:54:40: 生成订单, 10s有效,order: CancelOrder{orderNo='orderNo3', timeout=636501792751100}
2024-03-30 18:54:41: 生成订单, 10s有效,order: CancelOrder{orderNo='orderNo4', timeout=636502796614500}
2024-03-30 18:54:47: 订单超时,order:CancelOrder{orderNo='orderNo0', timeout=636498762218800}
2024-03-30 18:54:48: 订单超时,order:CancelOrder{orderNo='orderNo1', timeout=636499784320900}
2024-03-30 18:54:49: 订单超时,order:CancelOrder{orderNo='orderNo2', timeout=636500788490700}
2024-03-30 18:54:50: 订单超时,order:CancelOrder{orderNo='orderNo3', timeout=636501792751100}
2024-03-30 18:54:51: 订单超时,order:CancelOrder{orderNo='orderNo4', timeout=636502796614500}

优缺点

优点

  • 简单,不需要借助其他第三方组件,成本低,适合单体应用

缺点

  • 不适合数据量较大的场景:所有可能超时的数据都要进入DelayQueue中,全部保存在JVM内存中,内存开销大,可能引发内存溢出
  • 无法持久化:因为存在JVM内存中,不像Redis可以通过AOF或者RDB,宕机数据就丢失了
  • 无法较好地适配分布式集群:真要分布式就只能在集群中选一台leader专门处理,效率低

Reference

订单超时自动取消的技术方案解析及代码实现

http://www.hkea.cn/news/999548/

相关文章:

  • 水利厅网站集约化建设龙岗网站建设公司
  • 学校营销型网站建设网站优化教程
  • 解释自己做的网站搜一搜站长工具
  • wordpress最新版获取标签seo简单优化操作步骤
  • 电子工程师网站舆情监测软件免费版
  • 建设一个网站需要用到几个语言seo搜索引擎优化试题
  • 云南省住房与城乡建设厅网站关键词排名零芯互联排名
  • 山东坤泰建设集团网站手机百度搜索app
  • wordpress php推送示例seozou是什么意思
  • 做网站多久天津seo网站管理
  • 建设局查询网站网络上市场推广
  • 怎么做装修网站b2b多平台一键发布
  • ASP做网站源代码大专网络营销专业好不好
  • 网络公司网站 优帮云做网站排名服务热线
  • 制作网页设计软件列表案例谷歌seo 优化
  • wordpress网站备案上海搜索推广
  • 网站建设套餐有哪些安卓在线视频嗅探app
  • 做电影网站要买什么重庆seo网站哪家好
  • 广州北京网站建设公司网站外部优化的4大重点
  • 网站建设书优化大师是干什么的
  • 优秀的网站建设公司百度指数人群画像
  • wordpress企业中文模板太原seo哪家好
  • 广东网广东网站建设网站推广方案模板
  • 网站运营知识快手seo
  • 咖啡公司网站建设策划书微信营销方式
  • 柳江区城乡住房建设局网站上海seo优化服务公司
  • 西城企业网站建设企业网站怎么优化
  • 初学者做动态网站项目例子游戏特效培训机构排名
  • 汽车类网站搭建直链平台
  • 做网站遇到的困难总结网络营销软件代理