Zookeeper——入门
一、分布式介绍1.1 分布式环境特点:1)分布性:异地多活;
2)并发性:程序运行过程中,并发性操作很常见;同一个分布式系统中的多个结点同时访问一个共享资源,比如数据库或者分布式存储。分布式并发是基于多进程的。
3)无序性:进程之间的消息通信会出现顺序不一致的问题。
1.2 分布式环境下面临的问题:1)网络通信:网络通信异常导致分布式各结点间的消息收发过程出现问题。另外即使分布式系统各个结点之间的网络通信能够正常进行,其时延也会大于单机操作。(单机内存访问时延为纳秒数量级;分布式访问时延0.1~1ms);
2)网络分区(脑裂):网络发生异常,导致分布式系统中部分结点之间的网络遗憾吃不断增大,最终导致分布式架构中的所有结点只有部分能够正常运行;
3)三态:分布式下有三种状态(成功、失败、超时);超时通常包括以下两种情况 1.由于网络原因,该请求并没有被成功地发送到接收方,而是在发送过程中就发生了消息丢失现象;2. 该请求成功地被接收方接收后,进行了处理,但是在将响应反馈给发送方的过程中,发生了消息丢失现象。当出现这样的超时现象时,网络通信的发起方是无法确定当前请求是否被成功处理的;
...
计网(二)、网络层
一、网络层提供的服务
网络层只向上层提供简单灵活的、无连接的、尽最大努力交付的数据报服务。
网络层不提供端到端的可靠传输服务。
虚电路方式和数据报方式传递数据的不同:
二、网络层的协议
虚拟互联网络:
互联起来的各种网络之间的异构性本来是客观存在的,但是我们利用 IP 协议可以使这些性能各异的网络从用户看起来好像是一个统一的网络。
2.1 分类的 IP 地址
A类地址:以0开头, 1个字节的网络号3个字节的主机号;第一个可以指派的网络号为1,最后一个可以指派的网络号为126,最大可以指派的网络数为 2^7-2(因为网络号全0表示本网络、网络号127保留作为本地软件换回测试、本主机的进程之间通信使用),每个网络中最大的主机数为 2^24-2(因为主机号全0表示本主机、全1表示所有主机)。
B类地址:以10开头, 2个字节的网络号和2个字节的主机号;第一个可以指派的网络号为128.1,最后一个可以指派的网络号为191.255,最大可以指派的网络数为2^14-1(因为 128.0.0.0一般是不指派的),每个网络中的最大主机数为 2^16-2,同样要去除全0全 ...
计网(三)、传输层
一、传输层协议概述运输层的作用: 运输层提供应用进程间的逻辑通信
端口
端口的复用和分用功能:
TCP/IP 运输层端口: 16位二进制;
MAC地址:48位二进制;
IP地址:32位二进制;
两大类端口
(1)服务器端使用的端口号
* 熟知端口,数值一般为 0~1023
* 登记端口号,数值为 1024~49151 为没有熟知端口号的应用程序使用,不能重复;
(2)客户端使用的端口号
短暂端口号,数值为 49152 ~ 65535 留给客户进程选择暂时使用。
二、用户数据报协议 UDP [ User Datagram Protocol]
UDP 与 IP 协议都是无连接协议(不可靠),UDP只在 IP的数据报服务之上增加了很少一点功能:
复用和分用功能;
差错检测功能;
主要特点(1)UDP是无连接的,发送数据之前不需要建立连接,因此减少了开销和发送数据之前的时延;
(2)UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的连接状态表;
(3) ...
Java线程池
线程池一、Java线程池 ExecutorService1. ExecutorService介绍
ExecutorService 是Java中对线程池定义的一个接口,它存在于 java.util.concurrent 包中,这个接口中定义了后台执行任务相关的方法。
ExecutorService 继承自 Executor 接口(区分开工厂类 Executors),它有两个实现的子类 ThreadPoolExecutor、ScheduledThreadPoolExecutor。
2. ExecutorService的创建
Java 提供了一个工厂类 Executors 来创建各种类型的 ExecutorService 线程池,总共可以创建以下四种线程池。
newCachedThreadPool:创建一个可缓存的线程池,如果线程池长度超过需要可以灵活地回收空闲线程;如果没有可以回收的,则创建新线程。
newFixedThreadPool:创建一个固定大小的线程池,可以控制最大的线程并发数,超出的线程必须在队列中等待。
newScheduledThreadPool:创建一 ...
加密算法
常见的加密编码等算法解析包括: MD5、SHA、ASC、进制、时间戳、URL、BASE64、AES、DES等
常见加密形式算法解析:直接加密、带salt、带密码、带偏移、带位数、带模式、带干扰、自定义组合等;
常见解密方式:枚举、自定义逆向算法、可逆向
MD4介绍:
在执行MD4算法前,首先需要对输入的内容进行填充和分段。对于长于448位的信息,在其后添加一个1和n个0,使其按位长度对512求余后值为448。随后用64位的输入长度信息附加在已经填充好的原始信息后,使其长度为512 的整数倍。每次处理一段(512位),输出四个32位字。
MD4算法中包括四个32位无符号整数类型的参数H1、H2、H3、H4,四个参数在处理第一块内容前初始化为 H1=0x67452301、H2=0xefcdab89、H3=0x98badcfe、H4=0x10335476。在计算完第 i 块后,将更新这四个值作为第 i+1 块的输入。计算完最后一块,它们就作为MD4算法对整个输入内容的计算结果。
算法中涉及到不同的三类参数:常数y[j]、访问输入内容的索引z[ ...
计网(一)、数据链路层
数据链路层一、基本概念
链路:一条无源的点到点的物理线路段,中间没有任何其它的交换节点;
数据链路:除了物理线路外,还必须有通信协议来控制这些数据的传输;把这些协议的硬件和软件加到链路上,就构成了数据链路;
最常用的方法是:适配器(网卡)来实现软件和硬件,网卡一般都包括了数据链路层和物理层这两层;
数据链路层传送的是帧。网络层将 ip数据报传入数据链路层封装成帧,数据链路层再将帧传送给物理层转换为比特流的形式发送给对方机器,对方机器接收后再反过来进行转换。
二、三个基本问题
封装成帧;
透明传输;
差错控制;
(1) 封装成帧
在一段数据的前后分别添加首部和尾部,然后就构成了一个帧。确定帧的界限。首部和尾部的重要作用就是对帧进行定界。
MTU:Maximum Transfer Unit 最大传输单元,规定了链路层所能传输帧的数据部分的长度上限。
SOH:Start Of Header 控制字符,放在帧的最前端,表示帧的首部开始;
EOT:End Of Tail ,表示帧的尾部结束部分。
(2) 透明传输
当帧的首尾部分出现在帧的数据部分可能会造成数据的误识别,因此需要 ...
HashMap源码解读
HashMap一、JDK 1.7 的HashMap1. 数据结构123public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable
HashMap 继承了 AbstractMap 抽象类,实现了 Cloneable、Serializable接口。HashMap的拷贝是一种浅拷贝,即拷贝对象的改变会影响到原对象;HashMap是线程不安全的,不保证插入的键值对有序,但是允许存储键为null的值;HashTable是线程安全的,但是不能存储键为 null的值。
jdk 1.7 中的HashMap 是基于 数组+链表 的模式构建的。虽然 HashMap定义了hash函数来避免冲突,但是还是会存在两个 key在计算后桶的位置一样,因此考虑使用 链表的方式解决冲突;
结构: Entry节点(包括键、值、next、hash)
12345678910static class Entry i ...
RabbitMQ(一)、基础入门
一、什么叫做消息队列消息(Message)指在应用间传输的数据。消息包含 数字、文本、更复杂的嵌入对象等等。
消息队列(Message Queue)是一种应用间的通信方式,消息发送后可以立即返回,由消息系统来确保消息的可靠传输。消息发布者只管把消息发送到 MQ 中而不管谁来取,消费者只管从 MQ 中拿消息而不管谁发送的消息。消息的发送和接收都不知道双方的存在。
二、消息队列出现的原因消息队列是一种异步协作的机制。
比如说订单系统,一般订单涉及的业务操作包括:扣减库存、生成订单信息、发红包、发送短信提示等。业务量较少时这些操作可以放在一起同步执行,但随着业务量的增多,需要提升系统的服务性能,这时可以将一些不需要立即生效的操作单独抽取出来异步执行。比如说 发红包、发短信提示 这两个操作可以不用那么急,这种情况下使用 MQ,在下单的主流程(扣减库存、生成订单信息)完成后发送一条消息到 MQ 让主流程快速完结,而另外的由单独的线程拉取 MQ 的消息,当发现 MQ 中有对应的消息时进行执行。
常用场景包括: 最终一致性、广播、错峰流控等。
三、RabbitMQ 特点
RabbitMQ ...
牛客剑指offer(20~40题总结)
JZ23
解决方法:二叉搜索树遍历顺序为左右根;而且左子树的所有值都小于根,根的值小于右子树的所有值。
根据大小关系找出划分点后还需要对右子树的所有值进行比较遍历,在满足二叉搜索树的大小规定后才能再次划分为左子树和右子树进行比较。
123456789101112131415161718192021222324class BSTPreOrder { public boolean VerifySquenceOfBST(int[] sequence) { if (sequence == null || sequence.length == 0) { return false; } return isBST(sequence, 0, sequence.length - 1); } private boolean isBST(int[] seq, int start, int end) { if (start >= end) & ...
操作系统(四)、非连续内存分配
非连续内存分配:1.1、为什么需要非连续内存分配:
1.2 分段(Segmentation):
程序的分段地址空间:
逻辑地址空间是连续的,物理地址是离散的中间需要映射机制来建立联系。
通过硬件将内存中的不同区域划分,分别分开进行管理。如果用软件来实现就会涉及到拷贝,开销是很大的。
分段寻址方案:
一个段指一个 “内存块”,是一个逻辑地址空间。
方式一: 采用 段号(s) + 段内偏移(addr)的方式管理,也即是段寄存器+地址寄存器实现方案(x86是典型的例子);
方式二: 是单地址实现方案,此时没有段表寄存器。 在分段管理的过程中,段长不是固定的。如果是单地址实现方案则更加简单,没有段表寄存器。直接拿逻辑地址中的段号去段表中查,其他步骤和上述一样
硬件实现方案:
段表中包含 段号(和逻辑地址中的段号相同)、段长(限制段的长度为合理范围)、段的基址(对应物理地址);
段表是由操作系统提前建立好的,和硬件有着紧密的联系;
1.3 分页分页和分段的最大区别就是 段的大小是可变的而页的大小是固定的
1.3.1 物理地址 ...