-
2021-12-30 16:57:57
Java 消息队列、缓存、同步、
消息队列
我的理解:消息队列,将消息存入消息队列,然后就OK了。
系统之间原先调用通用接口,但引入了消息队列后,系统之间调用MQ消息队列。
好处:响应快,能累积请求,甩手掌柜。
// 为什么要使用MQ消息队列 解耦复用、异步、削峰 // 使用了MQ消息队列会带来那些隐患 降低系统可用性、提高系统复杂度、数据一致性 // 如何使用MQ消息队列 // 常见的消息队列 activeMQ、rabbitMQ、rocketMQ、kafka
缓存
我的理解:缓存,将数据备份到本地。
系统原先调用数据库数据,但引用了缓存,系统调用缓存数据,没有调到数据,然后调用数据库数据
好处:响应快,请求多。
// 为什么要使用缓存 高性能、高并发 // 使用了缓存会带来那些隐患 缓存与数据库双些不一致、缓存击穿、缓存穿透、缓存雪崩、缓存并发竞争 // 如何使用缓存
锁
加锁的目的是为了同步,为了数据的一致性。
实现同步的方式有很多:加锁,ThreadLocal当前线程变量、线程阻塞、使用线程池,
实现加锁的方式也有很多:volatile关键字、synchronized关键字、Lock接口
实现线程阻塞的方式也有很多:sleep() 、wait()
分布式锁
用在分布式系统中,每一个系统的指定进程放一个锁,同一时间,同一进程,只能有一个进程被执行。
负载均衡
我的理解:负载均衡,将请求合理的分配到指定的服务器。
系统原先发送请求到xxx服务器,但引用了负载均衡,系统发送的请求到了yyy服务器。
好处:合理分配资源
更多相关内容 -
java实现消息队列的两种方式(小结)
2020-08-26 14:58:30本文主要介绍了两种java实现消息队列的方式,利用Spring消息模板发送消息和Apache ActiveMQ官方实例发送消息,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 -
Java 队列实现原理及简单实现代码
2020-09-01 11:12:06主要介绍了Java 队列实现原理及简单实现代码的相关资料,需要的朋友可以参考下 -
java多线程加队列上传文件_后台处理
2016-05-12 09:55:37java多线程加队列上传文件_后台处理 -
用Java实现HTTP文件队列下载.pdf
2021-10-04 07:03:05用Java实现HTTP文件队列下载.pdf -
java 任务队列
2021-02-12 10:06:47Java任务队列在不断的学习中需要我们掌握很多相关的技术信息。首先,下面我们就看看如何应用TaskQueue的具体问题。Java任务队列需要我们详细的学习,当然我们在不断的使用中还需要注意相关信息的学习。下面我们就先...Java任务队列在不断的学习中需要我们掌握很多相关的技术信息。
首先,下面我们就看看如何应用TaskQueue的具体问题。
Java任务队列需要我们详细的学习,
当然我们在不断的使用中还需要注意相关信息的学习。
下面我们就先来看看TaskQueue(任务队列)的具体应用。
下面我们就详细的学习下。
在同一时刻,可能有很多任务需要执行,
而程序在同一时刻只能执行一定数量的任务,
当需要执行的任务数超过了程序所能承受的任务数时怎么办呢?
这就有了先执行哪些任务,后执行哪些任务的规则。
TaskQueue类就定义了这些规则中的一种,它采用的是FIFO(先进先出,英文名是First In
First Out)的方式,也就是按照任务到达的先后顺序执行。TaskQueue类的定义。
Java任务队列代码如下:
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
public class TaskQueue {
private List queue = new LinkedList(); // 添加一项任务
public synchronized void addTask(Task task) {
if (task != null) {
queue.add(task);
}
} // 完成任务后将它从任务队列中删除
public synchronized void finishTask(Task task) {
if (task != null) {
task.setState(Task.State.FINISHED);
queue.remove(task);
}
} // 取得一项待执行任务
public synchronized Task getTask() {
Iterator it = queue.iterator();
Task task;
while (it.hasNext()) {
task = it.next(); // 寻找一个新建的任务
if (Task.State.NEW.equals(task.getState())) { // 把任务状态置为运行中
task.setState(Task.State.RUNNING);
return task;
}
}
return null;
}
}
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
public class TaskQueue {
private List queue = new LinkedList(); // 添加一项任务
public synchronized void addTask(Task task) {
if (task != null) {
queue.add(task);
}
} // 完成任务后将它从任务队列中删除
public synchronized void finishTask(Task task) {
if (task != null) {
task.setState(Task.State.FINISHED);
queue.remove(task);
}
} // 取得一项待执行任务
public synchronized Task getTask() {
Iterator it = queue.iterator();
Task task;
while (it.hasNext()) {
task = it.next(); // 寻找一个新建的任务
if (Task.State.NEW.equals(task.getState())) { // 把任务状态置为运行中
task.setState(Task.State.RUNNING);
return task;
}
}
return null;
}
}
-
Java高效读取大文件实例分析
2020-08-28 09:10:01主要介绍了Java高效读取大文件实例分析,具有一定借鉴价值,需要的朋友可以参考下 -
Java-PriorityQueue:任务优先级队列的实现
2021-04-02 22:02:48任务的优先队列 基于任务的PriorityQueue的实现在此程序中,用户可以: 注册新任务,并传递名称和优先级 提取并返回列表中优先级最低的任务 清除任务列表 列出所有待处理的任务及其优先级 导入和导出CSV文件中的... -
dbqueue:Java中基于数据库的队列抽象
2021-06-17 12:12:18根据给定的liquibase.xml文件创建QueueMessage表 在应用程序的 Spring 上下文中注册一个QueueMessageDaoImpl实例 对于您想要实现的每个队列,子类QueueReader并实现其onMessage(QueueMessage)方法 每个QueueReader... -
java队列模拟实现
2013-01-06 18:00:25这是一个java队列实现的全部工程文件,包含了所有代码,具体的设计文档在上传的另外文件中。这个工程能够实现所有队列的操作,运行没有问题。设计的是在应用程序上的基于界面的队列操作的实现。 -
Java异步发送文件demo
2015-09-08 17:42:15java写的异步文件发送程序,由于win7带外数据的发送存在问题无法作连通性测试,因此本程序只做了简单的isReachable()连通性测试。程序采用了文件长度->文件名字->文件内容的顺序发送方式,没有对非文件进行甄别. -
Java中使用阻塞队列控制线程集实例
2020-09-03 23:49:12主要介绍了Java控制阻塞队列线程集实例,本文用一个程序展示了如何使用阻塞队列来控制线程集,程序功能是在一个目录及它的所有子目录下搜索所有文件,打印出包含指定关键字的文件列表,需要的朋友可以参考下 -
filequeue:轻量级,高性能,简单,可靠和持久的Java应用程序队列-源码
2021-05-26 19:35:33如果所有使用者都忙,则文件队列将自动将排队的项目保留到数据库中。 文件队列还提供固定和指数退避重试。 为什么要重新发明轮子? 对于我们的项目,我们需要一个用Java编写的简单,轻量,高性能的持久队列。 ... -
rabbitmq根据配置文件动态生成队列
2019-03-23 17:54:12支持配置文件动态生成队列,创建交换器,根据配置好的对应关系绑定队列和交换器 -
Java实现简单延迟队列和分布式延迟队列
2021-02-12 10:38:37在我们的工作中,很多地方使用延迟队列,比如订单到期没有付款取消订单...我们知道目前JAVA可以有DelayedQueue,我们首先开一个DelayQueue的结构类图。DelayQueue实现了Delay、BlockingQueue接口。也就是DelayQueue是...在我们的工作中,很多地方使用延迟队列,比如订单到期没有付款取消订单,制订一个提醒的任务等都需要延迟队列,那么我们需要实现延迟队列。我们本文的梗概如下,同学们可以选择性阅读。
1. 实现一个简单的延迟队列。
我们知道目前JAVA可以有DelayedQueue,我们首先开一个DelayQueue的结构类图。DelayQueue实现了Delay、BlockingQueue接口。也就是DelayQueue是一种阻塞队列。
我们在看一下Delay的类图。Delayed接口也实现了Comparable接口,也就是我们使用Delayed的时候需要实现CompareTo方法。因为队列中的数据需要排一下先后,根据我们自己的实现。Delayed接口里边有一个方法就是getDelay方法,用于获取延迟时间,判断是否时间已经到了延迟的时间,如果到了延迟的时间就可以从队列里边获取了。
我们创建一个Message类,实现了Delayed接口,我们主要把getDelay和compareTo进行实现。在Message的构造方法的地方传入延迟的时间,单位是毫秒,计算好触发时间fireTime。同时按照延迟时间的升序进行排序。我重写了里边的toString方法,用于将Message按照我写的方法进行输出。
里边的main方法里边声明了两个Message,一个延迟5秒,一个延迟7秒,时间到了之后会将接取出并且打印。输出的结果如下,正是我们所期望的。
这个方法实现起来真的非常简单。但是缺点也是很明显的,就是数据在内存里边,数据比较容易丢失。那么我们需要采用Redis实现分布式的任务处理。
2. 使用Redis的list实现分布式延迟队列。
本地需要安装一个Redis,我自己是使用Docker构建一个Redis,非常快速,命令也没多少。我们直接启动Redis并且暴露6379端口。进入之后直接使用客户端命令即可查看和调试数据。
我本地采用spring-boot的方式连接redis,pom文件列一下,供大家参考。
加上Redis的配置放到application.properties里边即可实现Redis连接,非常的方便。
接下来实现一个基于Redis的list数据类型进行实现的一个类。我们使用RedisTemplate操作Redis,这个里边封装好我们所需要的Redis的一些方法,用起来非常方便。这个类允许延迟任务做多有10W个,也是避免数据量过大对Redis造成影响。如果在线上使用的时候也需要考虑延迟任务的多少。太多几百万几千万的时候可能数据量非常大,我们需要计算Redis的空间是否够。这个代码也是非常的简单,一个用于存放需要延迟的消息,采用offer的方法。另外一个是启动一个线程, 如果消息时间到了,那么就将数据lpush到Redis里边。
接下来我们看一下,我们写一个测试的controller。大家看一下这个请求/redis/listDelayedQueue的代码位置。我们也是生成了两个消息,然后把消息放到队列里边,另外我们在启动一个线程任务,用于将数据从Redis的list中获取。方法也非常简单。
我就不把运行结果写出来了,感兴趣的同学自己自行试验。当然这个方法也是从内存中拿出数据,到时间之后放到Redis里边,还是会存在程序启动的时候,任务进行丢失。我们继续看另外一种方法更好地进行这个问题的处理。
3. 使用Redis的zSet实现分布式延迟队列。
我们需要再写一个ZSet的队列处理。下边的offerMessage主要是把消息直接放入缓存中。采用Redis的ZSET的zadd方法。zadd(key, value, score) 即将key=value的数据赋予一个score, 放入缓存中。score就是计算出来延迟的毫秒数。
上边的Controller方法已经写好了测试的方法。/redis/zSetDelayedQueue,里边主要使用ZSet的zRangeByScore(key, min, max)。主要是从score从0,当前时间的毫秒数获取。取出数据后再采用removeRangeByScore,将数据删除。这样数据可以直接写到Redis里边,然后取出数据后直接处理。这种方法比前边的方法稍微好一些,但是实际上还存在一些问题,因为依赖Redis,如果Redis内存不足或者连不上的时候,系统将变得不可用。
4. 总结一下,另外还有哪些可以延迟队列。
上面的方法其实还是存在问题的,比如系统重启的时候还是会造成任务的丢失。所以我们在生产上使用的时候,我们还需要将任务保存起来,比如放到数据库和文件存储系统将数据存储起来,这样做到double-check,双重检查,最终达到任务的99.999%能够处理。
其实还有很多东西可以实现延迟队列。
1) RabbitMQ就可以实现此功能。这个消息队列可以把数据保存起来并且进行处理。
2)Kafka也可以实现这个功能。
3)Netty的HashedWheelTimer也可以实现这个功能。
有兴趣的同学可以进一步研究这些内容的实现。
欢迎大家留言评论,做进一步探讨!
-
Java数据结构队列(Queue)用法
2021-04-24 02:47:42Java数据结构队列(Queue)用法队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的...以下实例演示了队列(Queue)的用法:Main.java 文件import java.util.LinkedList;import java.util.Queue;public c...Java数据结构队列(Queue)用法
队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。
LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用。
以下实例演示了队列(Queue)的用法:
Main.java 文件
import java.util.LinkedList;
import java.util.Queue;
public class Main {
public static void main(String[] args) {
//add()和remove()方法在失败的时候会抛出异常(不推荐)
Queue queue = new LinkedList();
//添加元素
queue.offer("a");
queue.offer("b");
queue.offer("c");
queue.offer("d");
queue.offer("e");
for(String q : queue){
System.out.println(q);
}
System.out.println("===");
System.out.println("poll="+queue.poll()); //返回第一个元素,并在队列中删除
for(String q : queue){
System.out.println(q);
}
System.out.println("===");
System.out.println("element="+queue.element()); //返回第一个元素
for(String q : queue){
System.out.println(q);
}
System.out.println("===");
System.out.println("peek="+queue.peek()); //返回第一个元素
for(String q : queue){
System.out.println(q);
}
}
}
以上代码运行输出结果为:
a
b
c
d
e
===
poll=a
b
c
d
e
===
element=b
b
c
d
e
===
peek=b
b
c
d
e
序号
相关信息
1
sum
数字求和运算
2
intopost
利用堆栈将中缀表达式转换成后缀
3
insert
在链表(LinkedList)的开头和结
4
element
获取链表(LinkedList)的第一个
5
replace
删除链表中的元素
6
7
vecsort
获取向量元素的索引值
8
9
search
链表元素查找
10
reverse
压栈出栈的方法实现字符串反转
11
vecmax
获取向量的最大元素
12
13
swap
旋转向量
本文网址:http://www.santii.com/java/tutorial-data-structures_queue.html
-
使用Java程序来实现HTTP文件的队列下载
2020-03-04 12:46:09许多用户可能会遇到这样的情况:在网站上发现一个很好的资源,但是这个资源是分成了很多个文件存放的,如果想把它保存到本地,只有靠用户点击另存来完成保存,如果...本文介绍了使用Java程序来实现HTTP文件的队列下载。 -
java 使用Queue来队列执行异步任务
2021-02-27 10:06:28importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.stereotype.Component;importjavax.annotation.PostConstruct;importjavax.annotation....importjava.util.concurrent.Ex... -
JAVA延迟队列(实现数据的缓存和定时清理)
2020-10-24 23:44:43在延迟队列中所保存的每一个元素内容.每当时间一到,(compareTo进行比较,getDelay()获取延迟时间),都会自动进行队里数据的弹出操作; 使用延迟队列(模拟讨论会依次离开的场景) public class Student implements ... -
Java 阻塞队列实现串口数据读取监听
2021-09-07 16:04:34这里使用BlockingQueue阻塞队列的方式实现串口数据的读取监听 提示:Java 环境需使用1.6版本及一下的,否则会有出现内存 gc,等等异常问题。 RXTXcomm.jar 等ddl 文件下载【附带 配置教程】 :... -
java实现RabbitMQ消息队列
2022-04-19 10:43:27MQ(Message Queue)消息队列,是基础数据结构中“先进先出”的一种数据结构。一般用来解决应用解耦,异步消息,流量削峰等问题,实现高性能,高可用,可伸缩和最终一致性架构。 -
如何用Java来实现优先级队列,实现文件读写时,定时定量的输出
2017-12-02 11:50:03 ## 请教各位大神,如何实现呢,求一个demo呢? -
java链表应用--基于链表实现队列详解(尾指针操作)
2020-08-19 12:23:37主要介绍了java链表应用--基于链表实现队列,结合实例形式分析了java基于链表实现队列尾指针相关操作使用技巧,需要的朋友可以参考下 -
java多线程读取文件
2015-07-08 23:09:57Java多线程读大文件 java多线程写文件:多线程往队列中写入数据 -
java版bs公交服务网源码-queue:队列
2021-06-04 21:28:27文件中存在写锁(以防止对队列的并发写入),在 Chronicle Queue 5 中,这被移动到称为表存储(queuelock.txt)的单个文件中。 cq4t)。 这在内部简化了锁定代码,因为只需要检查表存储文件。 您可以使用 Chronicle ... -
Java实现多线程写数据到文件【队列-文件】
2018-06-24 19:28:08大致流程先将要写入文件的数据写入到一个队列中,然后单开一个线程专门读取队列数据写入文件,可以保证写入到文件的数据的顺序,生产者类即多线程写入文件模拟package com.ldl.test.domain; import java.text.... -
java多线程文件搜索
2021-09-28 10:14:05java本地文件多线程文件搜索