RocketMQ-消息存储设计
消息存储是RocketMQ中最为复杂和最为重要的一部分
消息存储整体架构消息存储是RocketMQ中最为复杂和最为重要的一部分,将分别从RocketMQ的消息存储整体架构、PageCache与Mmap内存映射以及RocketMQ中两种不同的刷盘方式三方面来分别展开叙述。
先看这个图,这个图看着复杂,但是多理解几遍历,不要着急跳过去
从这个图理梳理出几个关键词
CommitLog
ConsumeQueue
CommitLogOffset
IndexFile
producer send
CommitLog和producer发送消息有关,ConsumeQueue和consumer消费端有关。
消息存储相关的文件消息都是存储在 Broker服务器上的以文件形式存储分:Producer端和Consumer端,消息查询也是通过Broker节点查询。
CommitLog 发送端消息主体---Producer端
CommitLog:消息真正的存储文件,所有消息都存储在 CommitLog 文件中。
CommitLog 文件是存放消息数据的地方,所有的消息都将存入到 CommitLog 文 ...
java反射01-简述
简述理解意义:反射的意义是在于改变程序运行时的状态。比如我在程序没运行之前,我不知道我需要什么对象,但是我想在程序运行的过程中去动态的说我想要什么东西,这时可以通过反射去实现。通过反射可以调用运行时类的指定方法和属性。任何一个类对反射来说结构都是暴露的。java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。
反射需要四个类实现一些常用的功能:
Class
Field
Medthod
Constrator
使用反射机制要遵循以下三步:
获取要操作的类的Class对象
通过拿到这个Class对象,就可以拿到类的属性和方法
可以通过上面拿到的属性和方法去操作属性和方法
反射有什么用通过反射API可以获取任何,是任何在运行时的对象和属性。
反射的功能:
构建对象
在运行时操作对象属性、方法、构造器
生成动态代理
Class 对象使用反射第一步,获取Class对象。拿到Class对象才能接着往下操作。Java 类在运行的时候,某个类 ...
计算机原理-原码、补码、反码
简述二进制数字表示法三兄弟:
原码
补码
反码
原码就是原来的编码,就是字面意思,而补码和反码比较奇怪,为什么需要这两种编码,意义是什么?
原码原码表示法,正数没有区别,负数首位为1。3的原码 0000 0011-3的原码 1000 0011
这个就这么简单,没什么可说的。
补码这个是操作系统在对负数进行计算时的一种策略。作用:解决二进制下表示负数的问题。
为什么需要补码,是什么情况下需要使用到补码。不用行不行?不行因为使用两个原码做加法,没法运算!!
不用行不行?不行,不用玩不了。因为两个原码在二进制下无法做加法!!
使用二进制的第一位表示数字的正负位:0表示正数,1表示负数。
原码加法原码之间无法直接进行计算,举个反例
2 + (-2) 结果应该是0,但是如果直接使用原码进行计算,结果溢出
12340000 00101000 0010---------1000 0100
结果期望是: 0实际为: -4
现在解释为什么需要补码为了得到正确的计算结果!!如何能得到正确的计算结果?
再举个例子,这次是正确的例子: 2 + (-2) = 0转换成二进制:
12340000 0010? ...
javascript--自定义对象
前言JS对象是一种复合类型,它允许你通过变量名存储和访问,换一种思路,对象是一个无序的属性集合,集合中的每一项都由名称和值组成(听起来是不是很像我们常听说的HASH表、字典、健/值对?),而其中的值类型可能是内置类型(如number,string),也可能是对象。这种方式不能用new方式创建,所以不可重用。
字面量方式-最简单方式这种创建对象的方式通过{}来组织对象属性和方法。
12345678910111213var emptyObj = { 'id': 1, //注意是逗号 'name': 'zhagnsan', 'fn1': function(){ //使有 this 调用方法 this.fn2() //"此处是js对象的方法,可以写不限个,注意冒号,逗号" alert(this.id); //同样可以用this方法。 }, ...
linux-系统默认目录说明
很多目录是看着眼熟,但是不知道用来干什么的,了解清楚每个目录的作用在开发开发功能、定位问题都致关重要。比如从网下安装了一个二进制的工具,这个工具安装在哪个目录下?比如wget在哪个目录下可以找到?挂载了USB设备,去个目录下读文件?SSH-KEY 在哪个目录下?等等,都需要对系统目录有一个基本了解。
系统目录/ 根目录每一个文件和目录都是从根目录开始的root用户具有该目录下的写权限。
/root是root 用户的主目录,这与/.不一样
/bin 用户二进制文件bin即,binary。二进制文件,就是可执行文件,说白就是可执行的程序,一般以命令形式执行。用户的可执行文件一般放在这里。存储linux系统自有的所有命令,可以cd bin去查看,里面有比如cp、ls这样系统命令。就连 cd 这个命令也是在bin下面的。
常用的可执行文件
/bin 如:bash、cat、ls、cd、rm、touch/usr/bin 主要放置应用程序工具的必备执行文件,如:c++、g++、gcc、ncftp
/sbin 系统二进制文件就像/bin一样,/sbin 同样包含二进制可执行文件。sbi ...
设计模式-策略模式
前言策略模式在多种相似业务抽象相似性,提供扩展性上是非常好用。
socket02 ServerSocket 服务端与客户端连接
ServerSocket 服务端是运行的服务端的ServerSocket。socket方式是点对点的属于TCP。
建立服务端频骤
建立端口并指定服务器IP
使用 accpet 方法接收连接,阻塞式方法
使用流通信
代码实现
建立服务器,建立通道对象
接收数据
发送数据
阻塞式的意思是,如果没有连接,就会一直等待。所以在while里面是一直处于等待状态。
1234567891011121314151617181920212223242526272829303132333435363738import java.io.BufferedWriter;import java.io.DataInputStream;import java.io.IOException;import java.io.OutputStreamWriter;import java.net.ServerSocket;import java.net.Socket;public class SocketServer { public static void main(String[] args) th ...
socket01 原理和简述
原理网络之间的通信,说穿了还是网络流在通信。客户端跟服务器之间建立的管道,就叫scoket。
套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。网络套接字是IP地址与端口的组合。
网络通信的三要素
IP
端口
协议
网络编程也需要输入流和输出流进行交互,交互步骤:
使用ServerSocket 指定端口,地址为本机。
使用accept 接收客户端连接。
发送数据(流)。
注意:1024以下端口保留给系统。
TCP/UDP
TCP:像打电话,双向的,建产连接的。数据安全,不易丢失。点对点。
UDP:像发知信,单向的,非面向连接。数据不安全,易丢失。
scoket 的由来Socket 最初是加利福尼亚大学Berkeley分校为Unix系统开发的网络通信接口。后来随着TCP/IP网络的发展,Socket成为最为通用的应用程序接口,也是在Internet上进行应用开发最为通用的API。
Windows系统流行起来之后,由 Microsoft 联合 ...
juc10-线程中断interrupt
interrupt作用
1.对运行中的线程,仅设置了一个停止的标记,但程序照常运行。2.对阻塞中的线程,该线程会抛出InterruptedException异常。
interrupt方法用于中断线程。调用该方法的线程的状态为将被置为"中断"状态。interrupt方法只能打上一个停止标记(改变状态),不能终止一个正在运行的线程,还需要加入一个判断才停止线程。
interrupt方法的使用效果并不像 for+break 语句那样,马上就停止循环。调用interrupt方法是在当前线程中打了一个停止标志,并不是真的停止线程。
三个主要API1.interrupt() :中间当前线程,实际并不是马上执行;2.interrupted(): 获取前线程的interrupt状态,关置重置interrupt状态为false,即未打interrupt状态 ;3.isInterrupted(): 获取前线程的interrupt状态,不重置;
看个小例子,子线程中断自己
12345678910111213141516171819202122232425262728/** * 主动中断线 ...
juc08-守护线程
守护线程所谓守护线程可以理解为后台线程,用户线程理解为前台线程,那么后台线程依赖前台线程。当前台线程远行结束后,后台线程自动结束,不管后台线程是不是无限循环。守护线程地位比用户线程底,用户线程退出后,就会随JVM线程退出,而不管工作是否完成!!!
java中有两种线程:
用户线程(User Thread)
守护线程(Daemon Thread)比如GC垃圾回收线程,这个线程具有最低的优先级。
两者几乎没有区别,唯一的不同之处就在于虚拟机的离开:
如果用户线程全部退出离开,只剩下守护线程,虚拟机就会退出。如果还有至少一个用户线程,那么虚拟机就不会退出。
别急大白话在下面。
守护线程有什么用守护线程的目的是守护其他线程、守护其他线程、守护其他线程!!!守护线程的目的就是:为其他线程服务的线程。所以守护线程需要有被守护的线程!!!
说这么多,跟普通线程到底有什么区别,不还是一个用户创建的线程?区别在于:
用户线程退出,守护线程立即结束这个和普通线程可不一样,一般情况下,普通线程在main线程结整后,依然会运行直到任务结束,可以自行实验。守护线程不一样,只要用户线程退出,就立马退出,不管 ...