From 8dfa8ab7d2b3bde5685389e0ccf45efb77481db2 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Wed, 25 Jul 2018 23:35:26 +0800 Subject: [PATCH 01/87] auto commit --- notes/Java 基础.md | 1 - notes/Java 并发.md | 20 ++-- notes/Linux.md | 14 ++- notes/Redis.md | 72 ++++++------ notes/剑指 offer 题解.md | 111 +++++++++++------- notes/计算机操作系统.md | 2 +- notes/计算机网络.md | 22 ++-- pics/026d3cb4-67f7-4a83-884d-8032f57ec446.png | Bin 0 -> 12288 bytes 8 files changed, 138 insertions(+), 104 deletions(-) create mode 100644 pics/026d3cb4-67f7-4a83-884d-8032f57ec446.png diff --git a/notes/Java 基础.md b/notes/Java 基础.md index bdd13aff..907eea00 100644 --- a/notes/Java 基础.md +++ b/notes/Java 基础.md @@ -1177,7 +1177,6 @@ Java 注解是附加在代码中的一些元信息,用于一些工具在编译 - Java 支持自动垃圾回收,而 C++ 需要手动回收。 - Java 不支持多重继承,只能通过实现多个接口来达到相同目的,而 C++ 支持多重继承。 - Java 不支持操作符重载,虽然可以对两个 String 对象支持加法运算,但是这是语言内置支持的操作,不属于操作符重载,而 C++ 可以。 -- Java 内置了线程的支持,而 C++ 需要依靠第三方库。 - Java 的 goto 是保留字,但是不可用,C++ 可以使用 goto。 - Java 不支持条件编译,C++ 通过 #ifdef #ifndef 等预处理命令从而实现条件编译。 diff --git a/notes/Java 并发.md b/notes/Java 并发.md index 800796db..ab3528f2 100644 --- a/notes/Java 并发.md +++ b/notes/Java 并发.md @@ -499,7 +499,7 @@ public synchronized static void fun() { ## ReentrantLock -ReentrantLock 是 java.util.concurrent(J.U.C)包中的锁. +ReentrantLock 是 java.util.concurrent(J.U.C)包中的锁。 ```java public class LockExample { @@ -952,7 +952,7 @@ produce..produce..consume..consume..produce..consume..produce..consume..produce. ```java public class ForkJoinExample extends RecursiveTask { - private final int threhold = 5; + private final int threshold = 5; private int first; private int last; @@ -964,7 +964,7 @@ public class ForkJoinExample extends RecursiveTask { @Override protected Integer compute() { int result = 0; - if (last - first <= threhold) { + if (last - first <= threshold) { // 任务足够小则直接计算 for (int i = first; i <= last; i++) { result += i; @@ -1134,7 +1134,7 @@ public static void main(String[] args) throws InterruptedException { 1000 ``` -除了使用原子类之外,也可以使用 synchronized 互斥锁来保证操作的完整性,它对应的内存间交互操作为:lock 和 unlock,在虚拟机实现上对应的字节码指令为 monitorenter 和 monitorexit。 +除了使用原子类之外,也可以使用 synchronized 互斥锁来保证操作的原子性。它对应的内存间交互操作为:lock 和 unlock,在虚拟机实现上对应的字节码指令为 monitorenter 和 monitorexit。 ```java public class AtomicSynchronizedExample { @@ -1176,9 +1176,13 @@ public static void main(String[] args) throws InterruptedException { 可见性指当一个线程修改了共享变量的值,其它线程能够立即得知这个修改。Java 内存模型是通过在变量修改后将新值同步回主内存,在变量读取前从主内存刷新变量值来实现可见性的。 -volatile 可保证可见性。synchronized 也能够保证可见性,对一个变量执行 unlock 操作之前,必须把变量值同步回主内存。final 关键字也能保证可见性:被 final 关键字修饰的字段在构造器中一旦初始化完成,并且没有发生 this 逃逸(其它线程可以通过 this 引用访问到初始化了一半的对象),那么其它线程就能看见 final 字段的值。 +主要有有三种实现可见性的方式: -对前面的线程不安全示例中的 cnt 变量用 volatile 修饰,不能解决线程不安全问题,因为 volatile 并不能保证操作的原子性。 +- volatile +- synchronized,对一个变量执行 unlock 操作之前,必须把变量值同步回主内存。 +- final,被 final 关键字修饰的字段在构造器中一旦初始化完成,并且没有发生 this 逃逸(其它线程通过 this 引用访问到初始化了一半的对象),那么其它线程就能看见 final 字段的值。 + +对前面的线程不安全示例中的 cnt 变量使用 volatile 修饰,不能解决线程不安全问题,因为 volatile 并不能保证操作的原子性。 ### 3. 有序性 @@ -1662,9 +1666,9 @@ JDK 1.6 引入了偏向锁和轻量级锁,从而让锁拥有了四个状态: - 缩小同步范围,例如对于 synchronized,应该尽量使用同步块而不是同步方法。 -- 多用同步类少用 wait() 和 notify()。首先,CountDownLatch, Semaphore, CyclicBarrier 和 Exchanger 这些同步类简化了编码操作,而用 wait() 和 notify() 很难实现对复杂控制流的控制。其次,这些类是由最好的企业编写和维护,在后续的 JDK 中它们还会不断优化和完善,使用这些更高等级的同步工具你的程序可以不费吹灰之力获得优化。 +- 多用同步类少用 wait() 和 notify()。首先,CountDownLatch, CyclicBarrier, Semaphore 和 Exchanger 这些同步类简化了编码操作,而用 wait() 和 notify() 很难实现对复杂的控制流;其次,这些同步类是由最好的企业编写和维护,在后续的 JDK 中还会不断优化和完善,使用这些更高等级的同步工具你的程序可以不费吹灰之力获得优化。 -- 多用并发集合少用同步集合。并发集合比同步集合的可扩展性更好,例如应该使用 ConcurrentHashMap 而不是 Hashtable。 +- 多用并发集合少用同步集合,例如应该使用 ConcurrentHashMap 而不是 Hashtable。 - 使用本地变量和不可变类来保证线程安全。 diff --git a/notes/Linux.md b/notes/Linux.md index 27094e5c..705b9b0d 100644 --- a/notes/Linux.md +++ b/notes/Linux.md @@ -871,7 +871,9 @@ $ ls -al /etc | less ## 提取指令 -cut 对数据进行切分,取出想要的部分。切分过程一行一行地进行。 +cut 对数据进行切分,取出想要的部分。 + +切分过程一行一行地进行。 ```html $ cut @@ -891,7 +893,7 @@ root pts/1 192.168.201.254 Thu Feb 5 22:37 - 23:53 (01:16) $ last | cut -d ' ' -f 1 ``` -示例 2:将 export 输出的讯息,取出第 12 字符以后的所有字符串。 +示例 2:将 export 输出的信息,取出第 12 字符以后的所有字符串。 ```html $ export @@ -906,7 +908,7 @@ $ export | cut -c 12 ## 排序指令 -**sort** 进行排序。 +**sort** 用于排序。 ```html $ sort [-fbMnrtuk] [file or stdin] @@ -1204,7 +1206,7 @@ pid_t wait(int *status) 如果成功,返回被收集的子进程的进程 ID;如果调用进程没有子进程,调用就会失败,此时返回 -1,同时 errno 被置为 ECHILD。 -参数 status 用来保存被收集的子进程退出时的一些状态,如果我们对这个子进程是如何死掉的毫不在意,只想把这个子进程消灭掉,可以设置这个参数为 NULL: +参数 status 用来保存被收集的子进程退出时的一些状态,如果对这个子进程是如何死掉的毫不在意,只想把这个子进程消灭掉,可以设置这个参数为 NULL: ```c pid = wait(NULL); @@ -1218,7 +1220,7 @@ pid_t waitpid(pid_t pid, int *status, int options) 作用和 wait() 完全相同,但是多了两个可由用户控制的参数 pid 和 options。 -pid 参数指示一个子进程的 ID,表示只关心这个子进程的退出 SIGCHLD 信号。如果 pid=-1 时,那么和 wait() 作用相同,都是关心所有子进程退出的 SIGCHLD 信号。 +pid 参数指示一个子进程的 ID,表示只关心这个子进程退出的 SIGCHLD 信号。如果 pid=-1 时,那么和 wait() 作用相同,都是关心所有子进程退出的 SIGCHLD 信号。 options 参数主要有 WNOHANG 和 WUNTRACED 两个选项,WNOHANG 可以使 waitpid() 调用变成非阻塞的,也就是说它会立即返回,父进程可以继续执行其它任务。 @@ -1238,7 +1240,7 @@ options 参数主要有 WNOHANG 和 WUNTRACED 两个选项,WNOHANG 可以使 w 系统所能使用的进程号是有限的,如果大量的产生僵尸进程,将因为没有可用的进程号而导致系统不能产生新的进程。 -要消灭系统中大量的僵尸进程,只需要将其父进程杀死,此时所有的僵尸进程就会变成孤儿进程,从而被 init 所收养,这样 init 就会释放所有的僵死进程所占有的资源,从而结束僵尸进程。 +要消灭系统中大量的僵尸进程,只需要将其父进程杀死,此时僵尸进程就会变成孤儿进程,从而被 init 所收养,这样 init 就会释放所有的僵死进程所占有的资源,从而结束僵尸进程。 # 参考资料 diff --git a/notes/Redis.md b/notes/Redis.md index 8bd8aed0..21840399 100644 --- a/notes/Redis.md +++ b/notes/Redis.md @@ -25,7 +25,7 @@ * [六、键的过期时间](#六键的过期时间) * [七、数据淘汰策略](#七数据淘汰策略) * [八、持久化](#八持久化) - * [快照持久化](#快照持久化) + * [RDB 持久化](#rdb-持久化) * [AOF 持久化](#aof-持久化) * [九、发布与订阅](#九发布与订阅) * [十、事务](#十事务) @@ -210,17 +210,7 @@ OK ## 字典 -以下是 Redis 字典的主要数据结构,从上往下分析,一个 dict 有两个 dictht,一个 dictht 有一个 dictEntry 数组,每个 dictEntry 有 next 指针因此是一个链表结构。从上面的分析可以看出 Redis 的字典是一个基于拉链法解决冲突的哈希表结构。 - -```c -typedef struct dict { - dictType *type; - void *privdata; - dictht ht[2]; - long rehashidx; /* rehashing not in progress if rehashidx == -1 */ - unsigned long iterators; /* number of iterators currently running */ -} dict; -``` +dictht 是一个散列表结构,使用拉链法保存哈希冲突的 dictEntry。 ```c /* This is our hash table structure. Every dictionary has two of this as we @@ -246,11 +236,21 @@ typedef struct dictEntry { } dictEntry; ``` -哈希表需要具备扩容能力,在扩容时就需要对每个键值对进行 rehash。dict 有两个 dictht,在 rehash 的时候会将一个 dictht 上的键值对重新插入另一个 dictht 上面,完成之后释放空间并交换两个 dictht 的角色。 +Redis 的字典 dict 中包含两个哈希表 dictht,这是为了方便进行 rehash 操作。在扩容时,将其中一个 dictht 上的键值对 rehash 到另一个 dictht 上面,完成之后释放空间并交换两个 dictht 的角色。 + +```c +typedef struct dict { + dictType *type; + void *privdata; + dictht ht[2]; + long rehashidx; /* rehashing not in progress if rehashidx == -1 */ + unsigned long iterators; /* number of iterators currently running */ +} dict; +``` rehash 操作不是一次性完成,而是采用渐进方式,这是为了避免一次性执行过多的 rehash 操作给服务器带来过大的负担。 -渐进式 rehash 通过记录 dict 的 rehashidx 完成,它从 0 开始然后每执行一次 rehash 都会递增。例如在一次 rehash 中,要把 dict[0] rehash 到 dict[1],这一次会把 dict[0] 上 table[rehashidx] 的键值对 rehash 到 dict[1] 上,dict[0] 的 table[rehashidx] 指向 null,并令 rehashidx++。 +渐进式 rehash 通过记录 dict 的 rehashidx 完成,它从 0 开始,然后每执行一次 rehash 都会递增。例如在一次 rehash 中,要把 dict[0] rehash 到 dict[1],这一次会把 dict[0] 上 table[rehashidx] 的键值对 rehash 到 dict[1] 上,dict[0] 的 table[rehashidx] 指向 null,并令 rehashidx++。 在 rehash 期间,每次对字典执行添加、删除、查找或者更新操作时,都会执行一次渐进式 rehash。 @@ -320,13 +320,13 @@ int dictRehash(dict *d, int n) {

-在查找时,从上层指针开始查找,找到对应的区间之后再到下一层去查找。例如下图演示了查找 22 的过程。 +在查找时,从上层指针开始查找,找到对应的区间之后再到下一层去查找。下图演示了查找 22 的过程。

与红黑树等平衡树相比,跳跃表具有以下优点: -- 插入速度非常快速,因为不需要平衡树的旋转操作; +- 插入速度非常快速,因为不需要进行旋转等操作来维护平衡性; - 更容易实现; - 支持无锁操作。 @@ -336,7 +336,7 @@ int dictRehash(dict *d, int n) { 可以对 String 进行自增自减运算,从而实现计数器功能。 -例如对于网站访问量,如果使用 MySQL 数据库进行存储,那么每访问一次网站就要对磁盘进行读写操作。而对 Redis 这种内存型数据库的读写性能非常高,很适合存储这种频繁读写的计数量。 +Redis 这种内存型数据库的读写性能非常高,很适合存储频繁读写的计数量。 ## 缓存 @@ -346,7 +346,7 @@ int dictRehash(dict *d, int n) { 例如 DNS 记录就很适合使用 Redis 进行存储。 -查找表和缓存类似,也是利用了 Redis 快速的查找特性。但是查找表的内容不能失效,而缓存的内容可以失效。 +查找表和缓存类似,也是利用了 Redis 快速的查找特性。但是查找表的内容不能失效,而缓存的内容可以失效,因为缓存不作为可靠的数据来源。 ## 消息队列 @@ -356,27 +356,29 @@ List 是一个双向链表,可以通过 lpop 和 lpush 写入和读取消息 ## 会话缓存 -在分布式场景下具有多个应用服务器,可以使用 Redis 来统一存储这些应用服务器的会话信息,使得某个应用服务器宕机时不会丢失会话信息,从而保证高可用。 +在分布式场景下具有多个应用服务器,可以使用 Redis 来统一存储这些应用服务器的会话信息。 + +当应用服务器不再存储用户的会话信息,也就不再具有状态,一个用户可以请求任意一个应用服务器。 ## 分布式锁实现 -在分布式场景下,无法使用单机环境下的锁实现。当多个节点上的进程都需要获取同一个锁时,就需要使用分布式锁来进行同步。 +在分布式场景下,无法使用单机环境下的锁来对多个节点上的进程进行同步。 -除了可以使用 Redis 自带的 SETNX 命令实现分布式锁之外,还可以使用官方提供的 RedLock 分布式锁实现。 +可以使用 Reids 自带的 SETNX 命令实现分布式锁,除此之外,还可以使用官方提供的 RedLock 分布式锁实现。 ## 其它 -Set 可以实现交集、并集等操作,例如共同好友功能。 +Set 可以实现交集、并集等操作,从而实现共同好友等功能。 -ZSet 可以实现有序性操作,例如排行榜功能。 +ZSet 可以实现有序性操作,从而实现排行榜等功能。 # 五、Redis 与 Memcached -两者都是非关系型内存键值数据库。有以下主要不同: +两者都是非关系型内存键值数据库,主要有以下不同: ## 数据类型 -Memcached 仅支持字符串类型,而 Redis 支持五种不同种类的数据类型,使得它可以更灵活地解决问题。 +Memcached 仅支持字符串类型,而 Redis 支持五种不同的数据类型,可以更灵活地解决问题。 ## 数据持久化 @@ -384,15 +386,15 @@ Redis 支持两种持久化策略:RDB 快照和 AOF 日志,而 Memcached 不 ## 分布式 -Memcached 不支持分布式,只能通过在客户端使用一致性哈希这样的分布式算法来实现分布式存储,这种方式在存储和查询时都需要先在客户端计算一次数据所在的节点。 +Memcached 不支持分布式,只能通过在客户端使用一致性哈希来实现分布式存储,这种方式在存储和查询时都需要先在客户端计算一次数据所在的节点。 Redis Cluster 实现了分布式的支持。 ## 内存管理机制 -在 Redis 中,并不是所有数据都一直存储在内存中,可以将一些很久没用的 value 交换到磁盘。而 Memcached 的数据则会一直在内存中。 +- 在 Redis 中,并不是所有数据都一直存储在内存中,可以将一些很久没用的 value 交换到磁盘,而 Memcached 的数据则会一直在内存中。 -Memcached 将内存分割成特定长度的块来存储数据,以完全解决内存碎片的问题,但是这种方式会使得内存的利用率不高,例如块的大小为 128 bytes,只存储 100 bytes 的数据,那么剩下的 28 bytes 就浪费掉了。 +- Memcached 将内存分割成特定长度的块来存储数据,以完全解决内存碎片的问题,但是这种方式会使得内存的利用率不高,例如块的大小为 128 bytes,只存储 100 bytes 的数据,那么剩下的 28 bytes 就浪费掉了。 # 六、键的过期时间 @@ -402,7 +404,9 @@ Redis 可以为每个键设置过期时间,当键过期时,会自动删除 # 七、数据淘汰策略 -可以设置内存最大使用量,当内存使用量超过时施行淘汰策略,具体有 6 种淘汰策略。 +可以设置内存最大使用量,当内存使用量超出时,会施行数据淘汰策略。 + +Reids 具体有 6 种淘汰策略: | 策略 | 描述 | | :--: | :--: | @@ -413,15 +417,15 @@ Redis 可以为每个键设置过期时间,当键过期时,会自动删除 | allkeys-random | 从所有数据集中任意选择数据进行淘汰 | | noeviction | 禁止驱逐数据 | -如果使用 Redis 来缓存数据时,要保证所有数据都是热点数据,可以将内存最大使用量设置为热点数据占用的内存量,然后启用 allkeys-lru 淘汰策略,将最近最少使用的数据淘汰。 +作为内存数据库,出于对性能和内存消耗的考虑,Redis 的淘汰算法实际实现上并非针对所有 key,而是抽样一小部分 key 从中选出被淘汰 key。 -作为内存数据库,出于对性能和内存消耗的考虑,Redis 的淘汰算法(LRU、TTL)实际实现上并非针对所有 key,而是抽样一小部分 key 从中选出被淘汰 key。 +使用 Redis 缓存数据时,为了提高缓存命中率,需要保证缓存数据都是热点数据。可以将内存最大使用量设置为热点数据占用的内存量,然后启用 allkeys-lru 淘汰策略,将最近最少使用的数据淘汰。 # 八、持久化 Redis 是内存型数据库,为了保证数据在断电后不会丢失,需要将内存中的数据持久化到硬盘上。 -## 快照持久化 +## RDB 持久化 将某个时间点的所有数据都存放到硬盘上。 @@ -435,9 +439,7 @@ Redis 是内存型数据库,为了保证数据在断电后不会丢失,需 将写命令添加到 AOF 文件(Append Only File)的末尾。 -对硬盘的文件进行写入时,写入的内容首先会被存储到缓冲区,然后由操作系统决定什么时候将该内容同步到硬盘,用户可以调用 file.flush() 方法请求操作系统尽快将缓冲区存储的数据同步到硬盘。可以看出写入文件的数据不会立即同步到硬盘上,在将写命令添加到 AOF 文件时,要根据需求来保证何时同步到硬盘上。 - -有以下同步选项: +使用 AOF 持久化需要设置同步选项,从而确保写命令什么时候会同步到磁盘文件上。这是因为对硬盘的文件进行写入并不会马上将内容同步到磁盘文件上,而是先存储到缓冲区,然后由操作系统决定什么时候同步到硬盘。有以下同步选项: | 选项 | 同步频率 | | :--: | :--: | diff --git a/notes/剑指 offer 题解.md b/notes/剑指 offer 题解.md index 7ff73846..a7b6db99 100644 --- a/notes/剑指 offer 题解.md +++ b/notes/剑指 offer 题解.md @@ -90,12 +90,20 @@ ## 题目描述 -在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复几次。请找出数组中任意一个重复的数字。例如,如果输入长度为 7 的数组 {2, 3, 1, 0, 2, 5},那么对应的输出是第一个重复的数字 2。 +在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 -要求复杂度为 O(N) + O(1),也就是时间复杂度 O(N),空间复杂度 O(1)。因此不能使用排序的方法,也不能使用额外的标记数组。牛客网讨论区这一题的首票答案使用 nums[i] + length 来将元素标记,这么做会有加法溢出问题。 +```html +Input: +{2, 3, 1, 0, 2, 5} + +Output: +2 +``` ## 解题思路 +要求复杂度为 O(N) + O(1),也就是时间复杂度 O(N),空间复杂度 O(1)。因此不能使用排序的方法,也不能使用额外的标记数组。牛客网讨论区这一题的首票答案使用 nums[i] + length 来将元素标记,这么做会有加法溢出问题。 + 这种数组元素在 [0, n-1] 范围内的问题,可以将值为 i 的元素放到第 i 个位置上。 以 (2, 3, 1, 0, 2, 5) 为例: @@ -158,7 +166,11 @@ Given target = 20, return false. ## 解题思路 -从右上角开始查找。因为矩阵中的一个数,它左边的数都比它小,下边的数都比它大。因此,从右上角开始查找,就可以根据 target 和当前元素的大小关系来缩小查找区间。 +从右上角开始查找。矩阵中的一个数,它左边的数都比它小,下边的数都比它大。因此,从右上角开始查找,就可以根据 target 和当前元素的大小关系来缩小查找区间。 + +当前元素的查找区间为左下角的所有元素,例如元素 12 的查找区间如下: + +

复杂度:O(M + N) + O(1) @@ -261,25 +273,14 @@ public ArrayList printListFromTailToHead(ListNode listNode) { } ``` -### 使用 Collections.reverse() - -```java -public ArrayList printListFromTailToHead(ListNode listNode) { - ArrayList ret = new ArrayList<>(); - while (listNode != null) { - ret.add(listNode.val); - listNode = listNode.next; - } - Collections.reverse(ret); - return ret; -} -``` - ### 使用头插法 利用链表头插法为逆序的特点。 -头结点和第一个节点的区别:头结点是在头插法中使用的一个额外节点,这个节点不存储值;第一个节点就是链表的第一个真正存储值的节点。 +头结点和第一个节点的区别: + +- 头结点是在头插法中使用的一个额外节点,这个节点不存储值; +- 第一个节点就是链表的第一个真正存储值的节点。 ```java public ArrayList printListFromTailToHead(ListNode listNode) { @@ -302,6 +303,20 @@ public ArrayList printListFromTailToHead(ListNode listNode) { } ``` +### 使用 Collections.reverse() + +```java +public ArrayList printListFromTailToHead(ListNode listNode) { + ArrayList ret = new ArrayList<>(); + while (listNode != null) { + ret.add(listNode.val); + listNode = listNode.next; + } + Collections.reverse(ret); + return ret; +} +``` + # 7. 重建二叉树 [NowCoder](https://www.nowcoder.com/practice/8a19cbe657394eeaac2f6ea9b0f6fcf6?tpId=13&tqId=11157&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking) @@ -322,22 +337,23 @@ inorder = [9,3,15,20,7] 前序遍历的第一个值为根节点的值,使用这个值将中序遍历结果分成两部分,左部分为树的左子树中序遍历结果,右部分为树的右子树中序遍历的结果。 ```java -private Map inOrderNumsIndexs = new HashMap<>(); // 缓存中序遍历数组的每个值对应的索引 +// 缓存中序遍历数组的每个值对应的索引 +private Map inOrderNumsIndexs = new HashMap<>(); public TreeNode reConstructBinaryTree(int[] pre, int[] in) { for (int i = 0; i < in.length; i++) inOrderNumsIndexs.put(in[i], i); - return reConstructBinaryTree(pre, 0, pre.length - 1, in, 0, in.length - 1); + return reConstructBinaryTree(pre, 0, pre.length - 1, 0, in.length - 1); } -private TreeNode reConstructBinaryTree(int[] pre, int preL, int preR, int[] in, int inL, int inR) { +private TreeNode reConstructBinaryTree(int[] pre, int preL, int preR, int inL, int inR) { if (preL > preR) return null; TreeNode root = new TreeNode(pre[preL]); int inIndex = inOrderNumsIndexs.get(root.val); int leftTreeSize = inIndex - inL; - root.left = reConstructBinaryTree(pre, preL + 1, preL + leftTreeSize, in, inL, inL + leftTreeSize - 1); - root.right = reConstructBinaryTree(pre, preL + leftTreeSize + 1, preR, in, inL + leftTreeSize + 1, inR); + root.left = reConstructBinaryTree(pre, preL + 1, preL + leftTreeSize, inL, inL + leftTreeSize - 1); + root.right = reConstructBinaryTree(pre, preL + leftTreeSize + 1, preR, inL + leftTreeSize + 1, inR); return root; } ``` @@ -350,16 +366,6 @@ private TreeNode reConstructBinaryTree(int[] pre, int preL, int preR, int[] in, 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。 -## 解题思路 - -① 如果一个节点的右子树不为空,那么该节点的下一个节点是右子树的最左节点; - -

- -② 否则,向上找第一个左链接指向的树包含该节点的祖先节点。 - -

- ```java public class TreeLinkNode { int val; @@ -373,6 +379,16 @@ public class TreeLinkNode { } ``` +## 解题思路 + +① 如果一个节点的右子树不为空,那么该节点的下一个节点是右子树的最左节点; + +

+ +② 否则,向上找第一个左链接指向的树包含该节点的祖先节点。 + +

+ ```java public TreeLinkNode GetNext(TreeLinkNode pNode) { if (pNode.right != null) { @@ -398,7 +414,7 @@ public TreeLinkNode GetNext(TreeLinkNode pNode) { ## 题目描述 -用两个栈来实现一个队列,完成队列的 Push 和 Pop 操作。队列中的元素为 int 类型。 +用两个栈来实现一个队列,完成队列的 Push 和 Pop 操作。 ## 解题思路 @@ -442,7 +458,7 @@ public int pop() throws Exception {

-递归方法是将一个问题划分成多个子问题求解,动态规划也是如此,但是动态规划会把子问题的解缓存起来,避免重复求解子问题。 +递归是将一个问题划分成多个子问题求解,动态规划也是如此,但是动态规划会把子问题的解缓存起来,从而避免重复求解子问题。 ```java public int Fibonacci(int n) { @@ -521,11 +537,11 @@ public int JumpFloor(int n) { ```java public int JumpFloor(int n) { - if (n <= 1) + if (n <= 2) return n; - int pre2 = 0, pre1 = 1; - int result = 0; - for (int i = 1; i <= n; i++) { + int pre2 = 1, pre1 = 2; + int result = 1; + for (int i = 2; i < n; i++) { result = pre2 + pre1; pre2 = pre1; pre1 = result; @@ -613,6 +629,8 @@ public int RectCover(int n) { 因为 h 的赋值表达式为 h = m,因此循环体的循环条件应该为 l < h,详细解释请见 [Leetcode 题解](https://github.com/CyC2018/Interview-Notebook/blob/master/notes/Leetcode%20%E9%A2%98%E8%A7%A3.md#%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE) 二分查找部分。 +但是如果出现 nums[l] == nums[m] == nums[h],那么此时无法确定解在哪个区间,因此需要切换到顺序查找。 + 复杂度:O(logN) + O(1) ```java @@ -622,13 +640,22 @@ public int minNumberInRotateArray(int[] nums) { int l = 0, h = nums.length - 1; while (l < h) { int m = l + (h - l) / 2; - if (nums[m] <= nums[h]) + if (nums[l] == nums[m] && nums[m] == nums[h]) + return minNumber(nums, l, h); + else if (nums[m] <= nums[h]) h = m; else l = m + 1; } return nums[l]; } + +private int minNumber(int[] nums, int l, int h) { + for (int i = l; i < h; i++) + if (nums[i] > nums[i + 1]) + return nums[i + 1]; + return nums[l]; +} ``` # 12. 矩阵中的路径 @@ -2022,7 +2049,7 @@ public int getDigitAtIndex(int index) { if (index < 0) return -1; - int place = 1; // 位数,1 表示个位,2 表示 十位... + int place = 1; // 1 表示个位,2 表示 十位... while (true) { int amount = getAmountOfPlace(place); int totalAmount = amount * place; @@ -2640,7 +2667,7 @@ private void swap(char[] c, int i, int j) ## 解题思路 -将 "abcXYZdef" 旋转左移三位,可以先将 "abc" 和 "XYZdef" 分别旋转,得到 "cbafedZYX",然后再把整个字符串旋转得到 "XYZdefabc"。 +先将 "abc" 和 "XYZdef" 分别翻转,得到 "cbafedZYX",然后再把整个字符串翻转得到 "XYZdefabc"。 ```java public String LeftRotateString(String str, int n) diff --git a/notes/计算机操作系统.md b/notes/计算机操作系统.md index 4a4077d3..52c74dd7 100644 --- a/notes/计算机操作系统.md +++ b/notes/计算机操作系统.md @@ -352,7 +352,7 @@ end monitor; 管程引入了 **条件变量** 以及相关的操作:**wait()** 和 **signal()** 来实现同步操作。对条件变量执行 wait() 操作会导致调用进程阻塞,把管程让出来给另一个进程持有。signal() 操作用于唤醒被阻塞的进程。 - **使用管程实现生成者-消费者问题**
+ **使用管程实现生产者-消费者问题**
```pascal // 管程 diff --git a/notes/计算机网络.md b/notes/计算机网络.md index 8603393c..f1460844 100644 --- a/notes/计算机网络.md +++ b/notes/计算机网络.md @@ -139,25 +139,17 @@ - **物理层** :考虑的是怎样在传输媒体上传输数据比特流,而不是指具体的传输媒体。物理层的作用是尽可能屏蔽传输媒体和通信手段的差异,使数据链路层感觉不到这些差异。 -### 2. 七层协议 +### 2. OSI 其中表示层和会话层用途如下: -- **表示层** :数据压缩、加密以及数据描述。这使得应用程序不必担心在各台主机中表示/存储的内部格式不同的问题。 +- **表示层** :数据压缩、加密以及数据描述,这使得应用程序不必担心在各台主机中数据内部格式不同的问题。 - **会话层** :建立及管理会话。 五层协议没有表示层和会话层,而是将这些功能留给应用程序开发者处理。 -### 3. 数据在各层之间的传递过程 - -在向下的过程中,需要添加下层协议所需要的首部或者尾部,而在向上的过程中不断拆开首部和尾部。 - -路由器只有下面三层协议,因为路由器位于网络核心中,不需要为进程或者应用程序提供服务,因此也就不需要运输层和应用层。 - -

- -### 4. TCP/IP +### 3. TCP/IP 它只有四层,相当于五层协议中数据链路层和物理层合并为网络接口层。 @@ -169,6 +161,14 @@ TCP/IP 协议族是一种沙漏形状,中间小两边大,IP 协议在其中

+### 4. 数据在各层之间的传递过程 + +在向下的过程中,需要添加下层协议所需要的首部或者尾部,而在向上的过程中不断拆开首部和尾部。 + +路由器只有下面三层协议,因为路由器位于网络核心中,不需要为进程或者应用程序提供服务,因此也就不需要运输层和应用层。 + +

+ # 二、物理层 ## 通信方式 diff --git a/pics/026d3cb4-67f7-4a83-884d-8032f57ec446.png b/pics/026d3cb4-67f7-4a83-884d-8032f57ec446.png new file mode 100644 index 0000000000000000000000000000000000000000..26d62519c21cc9276451c0551b859dad1ec70566 GIT binary patch literal 12288 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 D?`aRZ literal 0 HcmV?d00001 From 28c58a4c7413aae09fc11fea89f5730a3d2f2a98 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Wed, 25 Jul 2018 23:38:27 +0800 Subject: [PATCH 02/87] auto commit --- notes/剑指 offer 题解.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notes/剑指 offer 题解.md b/notes/剑指 offer 题解.md index a7b6db99..e1655922 100644 --- a/notes/剑指 offer 题解.md +++ b/notes/剑指 offer 题解.md @@ -170,7 +170,7 @@ Given target = 20, return false. 当前元素的查找区间为左下角的所有元素,例如元素 12 的查找区间如下: -

+

复杂度:O(M + N) + O(1) From 183f906fb0207579a05dd06c6fc84e3b67ee2b9d Mon Sep 17 00:00:00 2001 From: wangpc Date: Thu, 26 Jul 2018 20:56:49 +0800 Subject: [PATCH 03/87] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=AC=94=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- notes/数据库系统原理.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/notes/数据库系统原理.md b/notes/数据库系统原理.md index 87d210a9..a2969f3f 100644 --- a/notes/数据库系统原理.md +++ b/notes/数据库系统原理.md @@ -70,7 +70,7 @@ 一旦事务提交,则其所做的修改将会永远保存到数据库中。即使系统发生崩溃,事务执行的结果也不能丢失。 -可以通过数据库备份和恢复来实现,在系统发生奔溃时,使用备份的数据库进行数据恢复。 +可以通过数据库备份和恢复来实现,在系统发生崩溃时,使用备份的数据库进行数据恢复。 ---- @@ -79,7 +79,7 @@ - 只有满足一致性,事务的执行结果才是正确的。 - 在无并发的情况下,事务串行执行,隔离性一定能够满足。此时要只要能满足原子性,就一定能满足一致性。 - 在并发的情况下,多个事务并发执行,事务不仅要满足原子性,还需要满足隔离性,才能满足一致性。 -- 事务满足持久化是为了能应对数据库奔溃的情况。 +- 事务满足持久化是为了能应对数据库崩溃的情况。

From 41176bb717340873fb412ccfdac6b4f5b109d7ca Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Thu, 26 Jul 2018 23:12:25 +0800 Subject: [PATCH 04/87] auto commit --- notes/Java 容器.md | 44 ++++++-- notes/Linux.md | 14 +-- notes/一致性.md | 2 +- notes/分布式问题分析.md | 4 +- notes/剑指 offer 题解.md | 94 ++++++++++-------- notes/数据库系统原理.md | 6 +- pics/a58e294a-615d-4ea0-9fbf-064a6daec4b2.png | Bin 0 -> 18432 bytes 7 files changed, 103 insertions(+), 61 deletions(-) create mode 100644 pics/a58e294a-615d-4ea0-9fbf-064a6daec4b2.png diff --git a/notes/Java 容器.md b/notes/Java 容器.md index 9e6e2ac3..9918979a 100644 --- a/notes/Java 容器.md +++ b/notes/Java 容器.md @@ -8,6 +8,7 @@ * [三、源码分析](#三源码分析) * [ArrayList](#arraylist) * [Vector](#vector) + * [CopyOnWriteArrayList](#copyonwritearraylist) * [LinkedList](#linkedlist) * [HashMap](#hashmap) * [ConcurrentHashMap](#concurrenthashmap) @@ -25,23 +26,23 @@ ### 1. Set -- HashSet:基于哈希实现,支持快速查找,但不支持有序性操作,例如根据一个范围查找元素的操作。并且失去了元素的插入顺序信息,也就是说使用 Iterator 遍历 HashSet 得到的结果是不确定的; +- HashSet:基于哈希实现,支持快速查找,但不支持有序性操作,例如根据一个范围查找元素的操作。并且失去了元素的插入顺序信息,也就是说使用 Iterator 遍历 HashSet 得到的结果是不确定的。 -- TreeSet:基于红黑树实现,支持有序性操作,但是查找效率不如 HashSet,HashSet 查找时间复杂度为 O(1),TreeSet 则为 O(logN); +- TreeSet:基于红黑树实现,支持有序性操作,但是查找效率不如 HashSet,HashSet 查找时间复杂度为 O(1),TreeSet 则为 O(logN)。 - LinkedHashSet:具有 HashSet 的查找效率,且内部使用链表维护元素的插入顺序。 ### 2. List -- ArrayList:基于动态数组实现,支持随机访问; +- ArrayList:基于动态数组实现,支持随机访问。 -- Vector:和 ArrayList 类似,但它是线程安全的; +- Vector:和 ArrayList 类似,但它是线程安全的。 - LinkedList:基于双向链表实现,只能顺序访问,但是可以快速地在链表中间插入和删除元素。不仅如此,LinkedList 还可以用作栈、队列和双向队列。 ### 3. Queue -- LinkedList:可以用它来支持双向队列; +- LinkedList:可以用它来实现双向队列。 - PriorityQueue:基于堆结构实现,可以用它来实现优先队列。 @@ -85,14 +86,14 @@ java.util.Arrays#asList() 可以把数组类型转换为 List 类型。 public static List asList(T... a) ``` -如果要将数组类型转换为 List 类型,应该注意的是 asList() 的参数为泛型的变长参数,因此不能使用基本类型数组作为参数,只能使用相应的包装类型数组。 +应该注意的是 asList() 的参数为泛型的变长参数,不能使用基本类型数组作为参数,只能使用相应的包装类型数组。 ```java Integer[] arr = {1, 2, 3}; List list = Arrays.asList(arr); ``` -也可以使用以下方式生成 List。 +也可以使用以下方式使用 asList(): ```java List list = Arrays.asList(1,2,3); @@ -235,12 +236,12 @@ public synchronized E get(int index) { } ``` -### 2. ArrayList 与 Vector +### 2. 与 ArrayList 的区别 - Vector 是同步的,因此开销就比 ArrayList 要大,访问速度更慢。最好使用 ArrayList 而不是 Vector,因为同步操作完全可以由程序员自己来控制; - Vector 每次扩容请求其大小的 2 倍空间,而 ArrayList 是 1.5 倍。 -### 3. Vector 替代方案 +### 3. 替代方案 为了获得线程安全的 ArrayList,可以使用 `Collections.synchronizedList();` 得到一个线程安全的 ArrayList。 @@ -255,7 +256,15 @@ List synList = Collections.synchronizedList(list); List list = new CopyOnWriteArrayList<>(); ``` -CopyOnWriteArrayList 是一种 CopyOnWrite 容器,从以下源码看出:读取元素是从原数组读取;添加元素是在复制的新数组上。读写分离,因而可以在并发条件下进行不加锁的读取,读取效率高,适用于读操作远大于写操作的场景。 +## CopyOnWriteArrayList + +### 读写分离 + +写操作在一个复制的数组上进行,读操作还是在原始数组中进行,读写分离,互不影响。 + +写操作需要加锁,防止同时并发写入时导致的写入数据丢失。 + +写操作结束之后需要把原始数组指向新的复制数组。 ```java public boolean add(E e) { @@ -264,7 +273,7 @@ public boolean add(E e) { try { Object[] elements = getArray(); int len = elements.length; - Object[] newElements = Arrays.copyOf(elements, len + 1); + Object[] newElements = Arrays.copyOf(elements, len + 1); newElements[len] = e; setArray(newElements); return true; @@ -276,13 +285,26 @@ public boolean add(E e) { final void setArray(Object[] a) { array = a; } +``` +```java @SuppressWarnings("unchecked") private E get(Object[] a, int index) { return (E) a[index]; } ``` +### 适用场景 + +CopyOnWriteArrayList 在写操作的同时允许读操作,大大提高了读操作的性能,因此很适合读多写少的应用场景。 + +但是 CopyOnWriteArrayList 有其缺陷: + +- 内存占用:在写操作时需要复制一个新的数组,使得内存占用为原来的两倍左右; +- 数据不一致:读操作不能读取实时性的数据,因为部分写操作的数据还未同步到读数组中。 + +所以 CopyOnWriteArrayList 不适合内存敏感以及对实时性要求很高的场景。 + ## LinkedList ### 1. 概览 diff --git a/notes/Linux.md b/notes/Linux.md index 27094e5c..705b9b0d 100644 --- a/notes/Linux.md +++ b/notes/Linux.md @@ -871,7 +871,9 @@ $ ls -al /etc | less ## 提取指令 -cut 对数据进行切分,取出想要的部分。切分过程一行一行地进行。 +cut 对数据进行切分,取出想要的部分。 + +切分过程一行一行地进行。 ```html $ cut @@ -891,7 +893,7 @@ root pts/1 192.168.201.254 Thu Feb 5 22:37 - 23:53 (01:16) $ last | cut -d ' ' -f 1 ``` -示例 2:将 export 输出的讯息,取出第 12 字符以后的所有字符串。 +示例 2:将 export 输出的信息,取出第 12 字符以后的所有字符串。 ```html $ export @@ -906,7 +908,7 @@ $ export | cut -c 12 ## 排序指令 -**sort** 进行排序。 +**sort** 用于排序。 ```html $ sort [-fbMnrtuk] [file or stdin] @@ -1204,7 +1206,7 @@ pid_t wait(int *status) 如果成功,返回被收集的子进程的进程 ID;如果调用进程没有子进程,调用就会失败,此时返回 -1,同时 errno 被置为 ECHILD。 -参数 status 用来保存被收集的子进程退出时的一些状态,如果我们对这个子进程是如何死掉的毫不在意,只想把这个子进程消灭掉,可以设置这个参数为 NULL: +参数 status 用来保存被收集的子进程退出时的一些状态,如果对这个子进程是如何死掉的毫不在意,只想把这个子进程消灭掉,可以设置这个参数为 NULL: ```c pid = wait(NULL); @@ -1218,7 +1220,7 @@ pid_t waitpid(pid_t pid, int *status, int options) 作用和 wait() 完全相同,但是多了两个可由用户控制的参数 pid 和 options。 -pid 参数指示一个子进程的 ID,表示只关心这个子进程的退出 SIGCHLD 信号。如果 pid=-1 时,那么和 wait() 作用相同,都是关心所有子进程退出的 SIGCHLD 信号。 +pid 参数指示一个子进程的 ID,表示只关心这个子进程退出的 SIGCHLD 信号。如果 pid=-1 时,那么和 wait() 作用相同,都是关心所有子进程退出的 SIGCHLD 信号。 options 参数主要有 WNOHANG 和 WUNTRACED 两个选项,WNOHANG 可以使 waitpid() 调用变成非阻塞的,也就是说它会立即返回,父进程可以继续执行其它任务。 @@ -1238,7 +1240,7 @@ options 参数主要有 WNOHANG 和 WUNTRACED 两个选项,WNOHANG 可以使 w 系统所能使用的进程号是有限的,如果大量的产生僵尸进程,将因为没有可用的进程号而导致系统不能产生新的进程。 -要消灭系统中大量的僵尸进程,只需要将其父进程杀死,此时所有的僵尸进程就会变成孤儿进程,从而被 init 所收养,这样 init 就会释放所有的僵死进程所占有的资源,从而结束僵尸进程。 +要消灭系统中大量的僵尸进程,只需要将其父进程杀死,此时僵尸进程就会变成孤儿进程,从而被 init 所收养,这样 init 就会释放所有的僵死进程所占有的资源,从而结束僵尸进程。 # 参考资料 diff --git a/notes/一致性.md b/notes/一致性.md index 7209dccf..b00de8ff 100644 --- a/notes/一致性.md +++ b/notes/一致性.md @@ -91,7 +91,7 @@ ACID 要求强一致性,通常运用在传统的数据库系统上。而 BASE 主要用于实现分布式事务,分布式事务指的是事务操作跨越多个节点,并且要求满足事务的 ACID 特性。 -通过引入协调者(Coordinator)来调度参与者的行为,,并最终决定这些参与者是否要真正执行事务。 +通过引入协调者(Coordinator)来调度参与者的行为,并最终决定这些参与者是否要真正执行事务。 ## 运行过程 diff --git a/notes/分布式问题分析.md b/notes/分布式问题分析.md index 4f019525..dfeb7691 100644 --- a/notes/分布式问题分析.md +++ b/notes/分布式问题分析.md @@ -216,7 +216,9 @@ HTTP 重定向负载均衡服务器收到 HTTP 请求之后会返回服务器的 ### 2. DNS 重定向 -使用 DNS 作为负载均衡器,根据负载情况返回不同服务器的 IP 地址。大型网站基本使用了这种方式做为第一级负载均衡手段,然后在内部使用其它方式做第二级负载均衡。 +使用 DNS 作为负载均衡器,根据负载情况返回不同服务器的 IP 地址。 + +大型网站基本使用了这种方式做为第一级负载均衡手段,然后在内部使用其它方式做第二级负载均衡。 缺点: diff --git a/notes/剑指 offer 题解.md b/notes/剑指 offer 题解.md index 6f786cbe..e1655922 100644 --- a/notes/剑指 offer 题解.md +++ b/notes/剑指 offer 题解.md @@ -90,12 +90,20 @@ ## 题目描述 -在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复几次。请找出数组中任意一个重复的数字。例如,如果输入长度为 7 的数组 {2, 3, 1, 0, 2, 5},那么对应的输出是第一个重复的数字 2。 +在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 -要求复杂度为 O(N) + O(1),也就是时间复杂度 O(N),空间复杂度 O(1)。因此不能使用排序的方法,也不能使用额外的标记数组。牛客网讨论区这一题的首票答案使用 nums[i] + length 来将元素标记,这么做会有加法溢出问题。 +```html +Input: +{2, 3, 1, 0, 2, 5} + +Output: +2 +``` ## 解题思路 +要求复杂度为 O(N) + O(1),也就是时间复杂度 O(N),空间复杂度 O(1)。因此不能使用排序的方法,也不能使用额外的标记数组。牛客网讨论区这一题的首票答案使用 nums[i] + length 来将元素标记,这么做会有加法溢出问题。 + 这种数组元素在 [0, n-1] 范围内的问题,可以将值为 i 的元素放到第 i 个位置上。 以 (2, 3, 1, 0, 2, 5) 为例: @@ -158,7 +166,11 @@ Given target = 20, return false. ## 解题思路 -从右上角开始查找。因为矩阵中的一个数,它左边的数都比它小,下边的数都比它大。因此,从右上角开始查找,就可以根据 target 和当前元素的大小关系来缩小查找区间。 +从右上角开始查找。矩阵中的一个数,它左边的数都比它小,下边的数都比它大。因此,从右上角开始查找,就可以根据 target 和当前元素的大小关系来缩小查找区间。 + +当前元素的查找区间为左下角的所有元素,例如元素 12 的查找区间如下: + +

复杂度:O(M + N) + O(1) @@ -261,25 +273,14 @@ public ArrayList printListFromTailToHead(ListNode listNode) { } ``` -### 使用 Collections.reverse() - -```java -public ArrayList printListFromTailToHead(ListNode listNode) { - ArrayList ret = new ArrayList<>(); - while (listNode != null) { - ret.add(listNode.val); - listNode = listNode.next; - } - Collections.reverse(ret); - return ret; -} -``` - ### 使用头插法 利用链表头插法为逆序的特点。 -头结点和第一个节点的区别:头结点是在头插法中使用的一个额外节点,这个节点不存储值;第一个节点就是链表的第一个真正存储值的节点。 +头结点和第一个节点的区别: + +- 头结点是在头插法中使用的一个额外节点,这个节点不存储值; +- 第一个节点就是链表的第一个真正存储值的节点。 ```java public ArrayList printListFromTailToHead(ListNode listNode) { @@ -302,6 +303,20 @@ public ArrayList printListFromTailToHead(ListNode listNode) { } ``` +### 使用 Collections.reverse() + +```java +public ArrayList printListFromTailToHead(ListNode listNode) { + ArrayList ret = new ArrayList<>(); + while (listNode != null) { + ret.add(listNode.val); + listNode = listNode.next; + } + Collections.reverse(ret); + return ret; +} +``` + # 7. 重建二叉树 [NowCoder](https://www.nowcoder.com/practice/8a19cbe657394eeaac2f6ea9b0f6fcf6?tpId=13&tqId=11157&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking) @@ -322,22 +337,23 @@ inorder = [9,3,15,20,7] 前序遍历的第一个值为根节点的值,使用这个值将中序遍历结果分成两部分,左部分为树的左子树中序遍历结果,右部分为树的右子树中序遍历的结果。 ```java -private Map inOrderNumsIndexs = new HashMap<>(); // 缓存中序遍历数组的每个值对应的索引 +// 缓存中序遍历数组的每个值对应的索引 +private Map inOrderNumsIndexs = new HashMap<>(); public TreeNode reConstructBinaryTree(int[] pre, int[] in) { for (int i = 0; i < in.length; i++) inOrderNumsIndexs.put(in[i], i); - return reConstructBinaryTree(pre, 0, pre.length - 1, in, 0, in.length - 1); + return reConstructBinaryTree(pre, 0, pre.length - 1, 0, in.length - 1); } -private TreeNode reConstructBinaryTree(int[] pre, int preL, int preR, int[] in, int inL, int inR) { +private TreeNode reConstructBinaryTree(int[] pre, int preL, int preR, int inL, int inR) { if (preL > preR) return null; TreeNode root = new TreeNode(pre[preL]); int inIndex = inOrderNumsIndexs.get(root.val); int leftTreeSize = inIndex - inL; - root.left = reConstructBinaryTree(pre, preL + 1, preL + leftTreeSize, in, inL, inL + leftTreeSize - 1); - root.right = reConstructBinaryTree(pre, preL + leftTreeSize + 1, preR, in, inL + leftTreeSize + 1, inR); + root.left = reConstructBinaryTree(pre, preL + 1, preL + leftTreeSize, inL, inL + leftTreeSize - 1); + root.right = reConstructBinaryTree(pre, preL + leftTreeSize + 1, preR, inL + leftTreeSize + 1, inR); return root; } ``` @@ -350,16 +366,6 @@ private TreeNode reConstructBinaryTree(int[] pre, int preL, int preR, int[] in, 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。 -## 解题思路 - -① 如果一个节点的右子树不为空,那么该节点的下一个节点是右子树的最左节点; - -

- -② 否则,向上找第一个左链接指向的树包含该节点的祖先节点。 - -

- ```java public class TreeLinkNode { int val; @@ -373,6 +379,16 @@ public class TreeLinkNode { } ``` +## 解题思路 + +① 如果一个节点的右子树不为空,那么该节点的下一个节点是右子树的最左节点; + +

+ +② 否则,向上找第一个左链接指向的树包含该节点的祖先节点。 + +

+ ```java public TreeLinkNode GetNext(TreeLinkNode pNode) { if (pNode.right != null) { @@ -398,7 +414,7 @@ public TreeLinkNode GetNext(TreeLinkNode pNode) { ## 题目描述 -用两个栈来实现一个队列,完成队列的 Push 和 Pop 操作。队列中的元素为 int 类型。 +用两个栈来实现一个队列,完成队列的 Push 和 Pop 操作。 ## 解题思路 @@ -442,7 +458,7 @@ public int pop() throws Exception {

-递归方法是将一个问题划分成多个子问题求解,动态规划也是如此,但是动态规划会把子问题的解缓存起来,避免重复求解子问题。 +递归是将一个问题划分成多个子问题求解,动态规划也是如此,但是动态规划会把子问题的解缓存起来,从而避免重复求解子问题。 ```java public int Fibonacci(int n) { @@ -521,11 +537,11 @@ public int JumpFloor(int n) { ```java public int JumpFloor(int n) { - if (n <= 1) + if (n <= 2) return n; - int pre2 = 0, pre1 = 1; - int result = 0; - for (int i = 1; i <= n; i++) { + int pre2 = 1, pre1 = 2; + int result = 1; + for (int i = 2; i < n; i++) { result = pre2 + pre1; pre2 = pre1; pre1 = result; diff --git a/notes/数据库系统原理.md b/notes/数据库系统原理.md index 87d210a9..cabc2f97 100644 --- a/notes/数据库系统原理.md +++ b/notes/数据库系统原理.md @@ -70,7 +70,7 @@ 一旦事务提交,则其所做的修改将会永远保存到数据库中。即使系统发生崩溃,事务执行的结果也不能丢失。 -可以通过数据库备份和恢复来实现,在系统发生奔溃时,使用备份的数据库进行数据恢复。 +可以通过数据库备份和恢复来实现,在系统发生崩溃时,使用备份的数据库进行数据恢复。 ---- @@ -79,9 +79,9 @@ - 只有满足一致性,事务的执行结果才是正确的。 - 在无并发的情况下,事务串行执行,隔离性一定能够满足。此时要只要能满足原子性,就一定能满足一致性。 - 在并发的情况下,多个事务并发执行,事务不仅要满足原子性,还需要满足隔离性,才能满足一致性。 -- 事务满足持久化是为了能应对数据库奔溃的情况。 +- 事务满足持久化是为了能应对数据库崩溃的情况。 -

+

## AUTOCOMMIT diff --git a/pics/a58e294a-615d-4ea0-9fbf-064a6daec4b2.png b/pics/a58e294a-615d-4ea0-9fbf-064a6daec4b2.png new file mode 100644 index 0000000000000000000000000000000000000000..fdefb823686a563cdfb94cce17494f004af3cc18 GIT binary patch literal 18432 zcmeIZbyQVf^e+k`NJuw`baOzuK}qTEl5P;`wm>+P)S(d%C0&OuX=x4}0(y|{Zn*pC z_jlj@@BR12cw=10U@+M3SZnXK=A56Hk(%m?xY$(KC@3hnN-yQKQBWQjqoANtV`2bD z9@KNR0l!c^wH0Mh%154T0)ITTf1&mQ1*Iwu=f)Bp_#5l>OCwJd6aqEm52}4M>Ms-& z`8XxH7rK7tyIGICsAtml)7JcIi~?(_YMM9g6E9q*=So)={e(RbBIe?KJW~A%M;`ry zDodW34KMYpNL3)rgVl1R#m31{Y`vnTxt^u(OU<+5Jq(f1ms&|b_J>;=(D2?y$q=BR z4&A35$2}Z+W%rC?Y=5)b5XkiWmnK8GQHqewjbzX$$b-^T?V1~wkH z{@pT$E1|$~80Hoc{%%(tsa(e#;_G`$d4geyt)C@@AIfw2cc0RVhwNTgJzCKJd}dnZ zX}|yT0Sd}%P6E)cK$v&@J1m(oRj>o`XxcNd&KM4u%MhgV15e+)kPwTT%$Ro*S}s(D zyLo2zHHyLf)k21i{txd$6;Zp8poCS^%%qiUf88_V6%PmI7^SpEhobfAvpZB2lm`3= zvIC=1rWd4C8B<(Urkn&2ME*PXWuv)Q3m#2imR||$&>)IanPDn>Di4F86rrvI5qWNRdm4=e5WIBTH0dN-RnQGb$G1~8EW zZeSuAv!!&r{+|bJeNYYBTdEdR93&Sq-`P4*a@w5hb z%-v%-oC_B22ncEQp0EKhs;?Yt0fNJ%@ao>CZBi7JxApHFP?x)Lp|+*38@09gKDqY! z^w>KkGhH4w%EF@i!jyrNRCy*CjO#I|zO5f&ISpH=4bRciaTk=mmOK?S&x8Md>S2c# z!5#&nsIg%df_QLQmGTK(7SHO+_2EK$nnAYvGZF;6zzn#|Nz1ClWhb?oVv1KnRA|sS zH=K5#QaOlxY)HM^(sUX$Q`Y0<;XnkKX4;0@6zkD5LykJ+ty$13D$Qcvlsm`JWZ>xW zR)w;BG>zTa=`-}N@smyj=lfyzn-aQQ&n`}t0TJUnw>fc{c>SYqyvIC~+4qEtn<|V= zT5lWJ>&0@vv3sJ{lDiYxFWgs|HF^|4^T8N_t+-lm^aWC%iB9Pi%I{eGNM;1y%~_yV zG1QjcpAX)B0Ro1O2i&yoeeI+X1s5s0%@!r?kCo~voj}!0kNfb*w=G1g9~~U!K3IZS z*BET@Q<`uu?^w-+9pMNfwhB2>GEkWfAJh6E;sRLies~oT(=mGz#VR2&4s^@P1O(@+ z`t}0*3QuU77)Dy!JO6x#V2TidR-8f1YMgGS`cL|)KDjzqFNXKtI@>x_Lv7uI6`{64 z?qq!~EN;_%kANwA`pLuQql7fwSM`gY(Cw+2EIpc>d2OEQe=o;@!?F_vY31f^i&hHP zNyvY;=}7Y@nJ)v;jsD}v@DKExl>uzW`xDsq=2o^ExRo<-D{j`?v~Y25-%;J&C7-X@q_6|iKL14uF9rukDg-9xTfJ=%MvEbwwDGe5?kii?G+Wj%O8}DE z`yunD+mMOdFri#-?wI@Q(|XXmc$$p&`EM!X`a^2fxQ!M1`9pb%FRBc8OeD?wd4V1H znrDfyj3NS3k7$S5why{ISRe%@M`FiX$EOZ8Y47MJz*N0V(iO`}DdW2OSG?Jvy{_WE z+*xMiz|!Y@4tu~AVg?6x7s`Xj5&Cb@p~&QMfk#k=g7Y^vAJEVlqmo6C0Y`s{BhMxP z76Zz6-?t9vhIBwmLV3H70>`fW7tohcp{sQtbzYC@kZ6HSdJztdfe-%PJLnS%0f^<< zTHz`x`%H*GyfiUZK6Ux`U1mx z#oEjJ+oz^S^WSRQW48i1z7^MeRyM9-tLKdz=T?O04@{8g1$-PK+s$9`7vIo4W0}vW z3YXDInSgZnz$E?Ichyalu4|^Xp2FF%!t$fQ7jTu<*EUIh% zm>y74v|>zrisv&v98ZmS`Q3}?Gw}Vu`DV*6RL#Q9nrLILAFHQ-GvqzQHizyC*`yh| zwc?)t{Xk2ry=BgmlLlR3taS(xn*PhwI+j)qP6mryJ$Q|S+0USPuT8VnMrIh}sw}n& zPC;-Qz1Ooqe)&Icg~aHVUIh-)W||*4n{FQV7-Z$<&9f<&L=`3tRwZc$zq2BxkKz(n zSXagyFY0Xd;^Ild<3!X-JEQIXwyKkfug2e4={|Rmy?J0v%>QZs%Wj~?6^B?!3yT?{ zI7@&5#{A~UERDy>_lbuQ4n+@E*1!+~Q1kYY_v~F+T$kwua>e|r_}RuUlQm=V4ayj& z?ZiFCE+6ZYUzSr_rSNqwsq(W=VMRf%zc?wq*Z?|vyI=-KGiL$FHj6oFDz&p`*Go%; z=9!DOjZ4~Qs)%;AG!t(Xf`Nm-%ZK1{8QOe2DAkV~hMY}o6fx(Cl8(68XK8h^?G(~ zEoKt*mRrvvXQx1bW1k}#9LrN!2};r4Mz9y(h|r8K_mo(bQuQvaZ>7$WWK+r%36d8z z?pKR2e%JHjHpWA!$`6t#GOS9%o%py4;BYOfr%wysy+hsF-!J4eDA!a}d{hgAY0Ao? zO-)W}%FClCCnagVc!6qbZ?B`EfWgentYu@vlqKTv{%n6)L)>R4=X85!LXkFDE{Y5U z74=*jE2(HxZol1i-weH558X(!&;Ck#^Xt*ccQpLhN`VI*k2c|owD}hIS2F_6(_F?i zcDOWBK@@x#C? z#!H)>nx59SvSLVqk#g#feYwA}4>+5%-~9cFw%~fNIj()ZBJ_6qB+BCE{n~Jb;@7WV zO*@;Kn|t(uV00YKd2fx@M_e*;z^kfSTF2Bn+I&ak#I5b97_TdLLLqC-K`ULyY7I)^ zX0dS54DoPgF{9ohwI`WncrK^1Tac&=o2|eYF0dJsl^^u&b2vRaI~thVTWsFU@?HA9 zm~elhao>%;gJW^=;C4e%8fswfALgr8jZFcRKT+k|Wj5d93cKbqF6mBVQtmpNQRki? zzn^|mWJ5QtRMIS070CrDgVc;F*fbtJvizvWh2Zkx5#0s&DcLL2Y|B z1v+mX{BfuAe>CyN(MqcirtlQ9ehEq#oN2$?ZXbV-j>E>n67II#2AT$nnstgNlsTEb za^|(zu_1|_HPaJ4)tCcr$|=eZ`5G%x&m#rny||>4d>hLn{i8Ib;j<+@%#s%5tYQEd{>CA1cy^iGwG;G8*^K2k%nO6rbAst5f#j3r}2W%Q!nA#D+%@DgI= zJ?PV;BL1OyIHF&f-ni|BfdP4zgnxp$-*5D*@su{XQR#b$inl-{w|@Oc%zbvIuXT96 z)XGz5wbn){4COG0sF-Iwq)UOj*~P7Da4{c|I8Gh{G7hrRqw2A0rqfXycTQqKOMsbYUE?|3+ES~f{N`Rh&F4;ynot>r$+@C^AbCIJbKx!|zWf?wr6x40XK9iR(^3o) zc0rNMVDh%Uc_76ZOos+!*9{|>u8_;@_Y#vrjW1-QK(0ph(Rd*ggHrN}W^kb>LrD%z zG^Kd-7<*hBiQ{8s_2?abAD0?w~sd>#8PR@I4TNe*}OxQKgItvi1Ry0*hSsS_BjfU(e> zhMve=d-lNHYmR5y2A7{G)zZ@=tRSSDHO;ko>)w+^=5KA`tY2ZS7AJ8O;rGymH>eCk z#lM^%4ilX;X^g=zQHN_@`*-)4R!F}DD(9sAcJfW-VJ#2HJARmj^Pd-?DH_mRw?npoGe=tB3He)m|YVtnA+414)eGz>0(Lg};3ZROZ;MQg(hM>~#sac$=JMqlZjYw!-9(3VvHm+wA$GwFtUGYz* z=l*E?6Cm?5C8Ny#o7kSOfRDXlrhiV@VuYV(C&R!ujU=Hu%r_FD*0ICLR%{715yc417_#D8L(A8&od(RDwF-E ztfgazE?ker)sV284@eoLa{*b)@B3*Fzz)1(D!!V|d)mOw`A(zH3N(YaxVGG*N$j5( z9+kNVN8!;*aXm%t-FS_!*LUl_DHzru9jv$DA4W^jX!z!{PXTw~cr1hC2QXdTo2nhQ zc61%*(5!~^Ao7YxvY0q6XY*%*)MVpjBW#-~1PEg{0h*PSUk5z4*OjP;p6er|aVTie z)y3y9mWUD&^@W5KXfuI_C{PR?@|s8ri*@U*X838q9!l0K`WwjCSQ66KPnk5*cT=%K`@Gi(bIy1KXp>4K}}Xpk#L+&9ANUWUuIE#he_}n-#z9RVEnO#BqMeL(^UBWk3skr;ZjAcfJ0TVWMM@r(HGl z?)Xa&BMSV;jm}tZCj5#`E}l#E_uB?e7psNtVtxenv1EZf3?-EtNR5{{7p0|KhtX~C z9Q=g|Ku{n;D1`PUy%UBc_D~Kzm^qm}m??)wxM1Ko3D7u%L zi3zpj@euz>Ck~IMlT)#uzVvfg3-v8{TEw;KgqvB{;qd}w0R;Qv$3$Djqn6pbG*b$7x}GVETEXjrWSI^;R(GQJXyZKU4{joyHQb$ z_3d1}qc=Vz;bn}l3-42bL^2ISa{v^={1>fcKn>s=&ZA$m*lCri6*O2uCyqtGULP7! zSe|7rK1-`)SH?qV%H5d2c2x3wyKF)f2lzZzFEIc}B=9jT4Bmc!-99nXb|z?C`3hN* zMKQmNtccP#xX`&VfF4Q66HW~TOmztGJCIQ_RS3(oXzz%gdJ}-+-ZZ@y&f@sV=}I9< z;~NP{Q@S=ImBfDQV9yUX=UP{>H8sBCR*t<~=4>e=qX&4ppx zdF#HGt!=&`-@DKVGU^Y4TEmEBHhTHqa`|IrauX?D^C+xj2GifFd3IWrVh|Nlo=0f} zV&_bs<$$O-=#{NsW-Ko&D{B=g>aW%h4m=UGGB@QoN7f+Q-}UT z6h3aAfw$rVSI+ltPbc8?G5>-U^J`S;+#P(*X<`(^4g=~g4|H{DVD%L|2Y^9OPY?X+ zbbAv&^aAbn*CXj1jnJzJul?5Zao~t-$l#arrNB5DS=mduB9|p@cl{1SJ(cVHbK3hu zS^(JaK&~Pk*tKnh#<5+t8kF8AfTLV#PD79hr=a{n4}SEMgER zWx9>L%2i7ZKrChTQmhW17!P`1Sno&aTbgi}MFhq4_V#t_iL?T2!U2k&o}Sm;jsJYL zEl%t4h`4~~nyS=~?BSQAZLjZt)84&{L)DRY*`2S2xh@D{XPK=qj~{I(}_yYg1C0&l30bll^vEec#P0^&(FCPNcTJ{u+qJJxYN$c4>!64BFGse0`{2 zPZU;?eqKY6qebpR=qk}pddqrtpz4>t<-6VGBj=#LSQ-H_v4I&;izn)ZQJwj?P+=&T zY@bg+Dcs+?mx7wlx-oh%rpMcXk$9ncw(c|aoHMNIGCts*fwYKt|Oc?MAcJ+OHS)H-NOCOAEk^7V#q$iz}jv=(OO*$e=Bq zFVNATHU5*i(GbYpR>d7y>b!CEu()&iW_Wol_Cn^m5ap?= z_GIM_-LB>ft~2o>HiQmGh_{12T-%C>4X29FoAgcOxNf}wgCOscvsK^{N!dxwvA=<5 z&L8UK3yk)swO_KX@WH{?XNQ5*3dvtS3xz+8QvgS6=VL>v1_wpqd~FIW+;+dO6AbcG ze;LNurt3!c6||8T@+rX++`6nJAROMNO#)En;4=0JMq_Hk^4C~rHH3+80I=zPF=IS> zRMgUvX;3oTenHM{`jV&hgoxJk9;kbcJI+FHXF^@in0ub`|Gv7KX&+gQDm(wd7BeG?M)Vq(Q~6G`ml@bkW*NZm@T_;!OWGWJSUUeQ*V4&r2FzF zz|6eOutZy%%PTxyA1$Qhw;RiilX9XGai6pO7Q1Lwk7h+QJv;lO&^C2QV|}-yE?+3b z$uKM`@@bcQfv={O3ao(%tFgK{cGLgSVtm2NkFH=WSh=jw+GnihfDuFVv!cRmXnHzT z6^0goTEvVR6z3@d7=fiLXVSwP`Ki`{lG&NNj6brco3G@DoQjSXzr|XC@@HIlHR+68 zR2I1{EtMl5IY^}{Jp>L=6RT#QgcXCV5spBr)Oj1zV>KZ?l*a!Fhs4=ywtdY=4~c!# z>RudhxNt$PdWM^*3`z~@Aryz+a0J4}$&bs5h;=3B;un*e!Pg$2pdu*gOK1;A!A{L9 zv)P?=9!^eT6_%GJF?q70CV9Y4VIT%shxK0k>|PesW8{9uGlrvY#ao3740OT%RJVF9;FT&WIpzQP8g?vw9Lr?V0-TqH=Y6N0WBSEFne#iZ`KQ~Y;pXZ-SA zU53syGSL)Z7qeXXgjK9o1fcrrfK#V|A3q4%N-=e=336a{JF?{^oDa2IZ0_MV=0Se935h zQ>7IC=MBF%oNu{2plxUdo{2WNa;)uB5F(fFis5mphD=5Rm5n8{8q;%LSfx}SGn6&l zhYBJpGZS9a1X%?<^3G{4^RLdN!Q?^MU5=MH^d!;dN3_t4E5LPrCooDWa-$IuR)cZ1 zJQQHj*Pi+unPm=h1YCkb@^)4`lcRSR5AP>VXGQEG+WEoU#*%T$Pq2zJa@F+%JpY6@ zTooYcV{FyR*#=G_*0E~a!3#q!$zK|zpkqwSYI+%`(?Obwf5+ zid*_O@am_SZjyV0U1A{J#6ZS7IQ^6=WBqt`PR*{9`o{YG*rF)W|iks66X{X z0000rTh;5%==_j5hVgv^Be`Gk!!#!$^D7)ZZ?gX>t-p>yM%;dt`qCLM#VpB}7&|_k=^pyp0^xF$jif7I z^Sk2~`&?^o>ez-ZhqHm_Q}I1tB?YW_g#o~u4Ko)g;WRS1mBpSx zhILVm3u`U8>vPiqg{|UQ*_j0$$DQ(Xcm18Xp>)A0yP;HiB+M%_FOIz})5Rt@FRXu) z!C<`5GdCl=^E9GE%UyG8Rm2euOc(nG;I_l;!^ak@#1X|uYAxKxi&Kw^IM(EyhW)<; zaMWpr4s!#v0sF#BwKSY>EO+OV%OuPr&nkO}H6&gDJR5l&ignNp_x-*Hj8%yPBO-9Z zh(uK~MI)jH{|$BG#VVHi*PzJYhf{7vCf@LIHs?);VFpU z6ZwZJ>oTF?lXH`LZ6=wnbSwLJd;1#zNrE8MbnG{KaXZzVH$#S4nq+QO5WXJhPJ0wR z)MO~t+dHYrJP~8*BLscRUI~e1W{@a`dqZ`7Ahu~H~h6N z{1_3922xW~3kuQ?4sP|s`1aU~>Kpf^H&uH!XKNk7d0x9%5*7ccqx$NUK?K0_UL`be5uAB^ft(5j@J<_YC}BC)gLAv zOiCl*lG72tjVM0EZ(%SlO`pRxA~8mB3afW5}`ZpK&r7mEv%3H9&O zYnJlAo*j=n<9N`cT?U~@B$hh6Dj{6ZOe!-pY6hkcZ=N|?M{V$Lo?^j7EeXxIMA^zo z?mIc5Jx$C9tGij1dy#cA%b7I3V*Z=?DgVfsN_qE1_Tt!U8o`3m+}O_KNxc>f58kpy zl?!~m^qLg7W@x@h*LT9;4`xB1kK2X_hUntPda83_d`I3=kWmZZ&FJ;C$>p~8Yx6$; znencd@t<6mb2KK4uce?6?)Pwq7odOKywv$xzz2y%>SA!`2FQ8R)hGRR-)rBLW?wl@U`Lic7EpK&;}Y@RdqRte zk8;4{l#Btv4N~w{v9NqI%p~5#^H5&R~P0x13pzVm%xXvZb?;*;8!R+(PU`pqUoQ+hl z&UiT0;pm?_oAHjFxR`p|VyX3G{#FgLzn2N3Hv69lw_mCqVxkaWCe=|on2Zz6r!{3J zIK8fr3sqNAq`wbiC+6~L?{t=JMd;vh{nZK~M?A|-VgX1oAztw*A(F0)*$G!6Arg-B zu`ez7xP>zw{^W4@Prcnlk-_svReKCN%j8QT6;N3n@M3Ez}O^z3@ zXDgA4l>*crfRVAP)}hs~ljWlsnCs*;WId8CDymQjN_dA0(3b#wcXD$p0CbK64zlZH zdX(oDNia$W-+*UjaiO1p=(VCpY-AnhCtVtqg8RmT@)YBq*>W^S{jg{gEdnwOD3_W9 z!;j-qxQ-V$)L@S>(2&>}sf~lwbC#DWIZczr#(JPH&DeP&>0J{W?1^p}VBV zLWbFV9`w zi!_(po-EQiN&Is2@xJ&q94asH>=_*d5I5o9%Svn<8ssb;IUT%*T*NYK!nC>jl=D$M zG_V)mYzA#w&c`2p^$?4NzAoM`BKQ&!a_9-?)6beseWC;Tm}nW<<0;fxtT$5b%-Nwd zZ(T*gzH&%8^UgsnY-!0{Eci;G6(F%sx@hk{hX9n)M7ddWH{da<#HDtjvG7kYFqrOX zRlBYc($u~57;qg)!bU@w8su6FlsM423&*xKn51gK&(N? zU$8XQS7ONjzG%>ia$$yx&rq^L0jb%NQ0iEq!P6i6?*07Q-7RjVBqq4X_#%6#9` zz-S1!neyD+oE4xfr#^8tpk~YEPRFw;D@@j^m{|K5<|Sg!*`t@053Q3Z(xfBq|E7^w z)APu|!1x)hXD#!gWK)g=_x_LE48{$k&x9gSJsMShK?a+4ZQJIfNj;j8u;GSmkHD=u zyYNq(gFP$Eztd+lTx6SF+p?AB>5S`MY4`LR?=Ci{AY~;DsY@p5Wf#2Cxf=Tkc&_3m z0I0280gWBs#Y%O$mejyQhVT<<3qw~(s~vB>!rptfzr7(*1K!kDoUBLiT-d$>+0s@0;P_SgiYjc;Uq04k&U5k&ry`Xn*5f^ z1_~@^0eKjy8{tt2X)BniejoK+Wq%+CD=m=+%5Q~Ot|t5#v=zaXCe;NYA0wx@cOZPE z07R3V3xWdB2$B$MAH)DjCejS~x(B7xEotC-7*QM|M11^4l z`b$QXnYX5EbZMHIf$9LCL0ivMhNSLf!V7!sbGFXf1OuUvg?2 zi?MXZWO56flJP2whrI?_D-Zm?S4P$qa`CqcpW$>MiOj~UCxU1C6Bic^BGljY9>~Hv zW2RVL<-voWIn?w$pio;@JE$#@aM{cL-Y9<^7}>G}CYGN*x`U{QX4 z7!?)Ow}OIj4i1iQd3hhPv9T{23ZtVRha9i++mDR31z$THuML}~&Z3-1-yO!C+#HWi zOlU|CKgyLp8IwIZ54}G}5-dla03RBXynM6Q*XR~)GD0Bo3 z9@|u39BKgd-)bPvgI%k{qQrU$>Ix9v9cP8u=US$#lmiYgp*sa$QWXXsfnOClt@5*a zbY~%ojUXe_f&}N>O&Q0BNd3O@FoXvsf;)__7fse1S z-|;I9y8ODdvHlrb`*|*spe(ZEm@2-Sf=8$dACNKRJ58^UJjnS^PyFCL&o8;x`|V%a zE_!(0@LI`q_euq?i!XoO4>@l>x!n)_@-+BFi(3iFnb6Yq*leD+-%GZhPMfqu@c@k3 zedqpcl{Ed_-;vMJCVT4ls>Ti( z9chG2pIhZHi-Q?pI?z{WbDO{0+L*h!q+zFJt5{UWN-ivF5KJ__-riXIf$P!z-Q;1c zgX3Mf&+%NG^=8#Aj-1hx$fR>QPJ%*TAhw3upX|AEiy3?h_!gL>M))N_isFl2(rglD zV~kP|m#)>R5f~(`Kn_0F(cQF^5|nq^mFJu6)3H<$ORitncJ*biD6R6)0r=LSrAnX@ z6ez%?Jpes;31ey6Rz+JeN>&k9kJ3v|6)}pQs9qj+5MMKkSz}nu+%a;q-U7%EU<7Tl z-yr+CNqcVHpr1*qFqlli+;q3+yu*1(@Q8WO0Q}AQ!~eWEsPx7K*zp@{83Z6( zn%d%?JKbhfnn;L`S=G;gSK|L1lxJ8u;Ay#NDCtm%_Pm>zV6O%HJQ2u*Xmv=80JPkd zlX?DX_1<-i>;=C?L=N}in3RjjzQbdl{6X$WD-~emxx;(~uQvNyZ2*5GP&Z&W z_uk&$$4*-=!*ArHR_1$iO}QbbG#Q`DBe9q~UUus*%}TJQZzXCjvQ5EA zSI#47zC_*A+*P(S`N8jx} zRp(z@-`jrFzeN?3su8UFyI%>n%;58G;MCNAwbtY&SpmVI1wQ!QVF#z(d?x?kl|c;f z-zajNzaGG=!+o!n3e8^wCc3P(cV#?9#+ElopA-NYkv1u3m(iuYj}DPekfzvLm}q(& z;C+3YeHiP|BLiz8jes!smdp9q_QyL=S~#;i8hh~LCHUH90+}Y+yX$r`7?1H;ui2q(kSaM7@{X=Rg}vL8@vYD*O7}6rc>&0m9q=TQ z*qg75JQ24w0TMGav4C}Ql+yGNd1|+%3vz@DfH;UzK{B?QCk?+iHAOn+`d=$D>Gia{ z%WWR)RPD@wORl~_;L2XN*I%qKD>qj%Rn zuKiNjdvXc5A=NU0Bn#ND9+(q@dM{?#ypum2?vZfrhF=lk-MP&4K;wW*4At4 z@1jKpk!K%}ws078Fn(~IGzg6a%zxU>OUm6nUP&(bCBq(G_J5j0YW|+ajFiNX|4vZ; zZI=K4`HyK=Miv*mj?ZwZC}|1~4|xx{4ix{n?=mR0nTi0X+Q7Ug(p>iV^e{==Guw(Y zcH$Co>s3vc6#FMg^>-RQjMEj}RmE6_n&&obx_2ZWSzCdB%nVhF1qhYJ1!hR82gUj1 zapg*GmTbJWM57sAR0k5Yrp=~hldgaIIFF)^n>7(>y&Vw$umH~*J5-1}7F+cZ!1n+K z9Q3`|#jl*g^F_rqnuM8bVmh!CoG}1$n#QJzgyo}8EDhDdmMi1&)?M_eWvud<~o9&4`P24!#EM`1WVY0M7}I4ccm2QeGLje;WuWpTJw8 z3U|ZTwzWrk>6#D?fTnOU#^zFUguK^)3#5AwPnRy0o3ygO_&F0v@j@tccNV zgwFSO;XTL(VA;1y<}CF;`+v-=xqgFfs!%sYhbgripZ~Emi|wz4dqL@<<20;EpPvo( ze=MGuEWqS?_6V8N=w21=a_3KkHT#pY=*GYE?0LjqL$Aa^5aG=3G`imYULv76=3eA& z%<({JRK9apFhXYxAe4ZqqoPx{1Q#8V+}kc9aY6Mfd|TmsC1zBQP(<;__|g!8`KA@x zmde6oL?WE^-xVFJd)iV4y00gxz1RYAm}h!l%A*{rW6uK^svn7==#j_}U`V#!NRT6= z!&?iT$%KwROxFmD=l0+;9go0wu-}RWJT9s;Qd+B4HM70|+pocM@HdeksLVdm$RJu; z<N+bsn?qO$|57r1?i4dh)V#fevfi#WRlQEg!?D8vjI2i z?vL9+9wMj9JA_}{exV|bvcJeHEeNUuv8s*ctvNMRs9$%tC(Ky=I!@vJZ8aeq{gaaH zi_b4WSq09Vs7(72x8|1ndDcJZb!};f!i~7g0IpDYRB-Q3cEY>AofU6KJE_ckmRlo! z(&*0r78iC>kRYBWZ2<@r^6e7YcknDs;8v-;KK7{?O^+u{e8J_Da)7P9ojpCgVk)u* zn+3<&#>je*$}GBT++cR-n6Po7@fEp1A(*o>6!`*FPbQxhZq23?@vgXTaT&`4Hi!rn zBNbPFTFu@3dquTyX0MtG(@e`>k6kLSoy>dYN2tw=tfL=>0Oq_maH;J2EWlJ4S<-cn z+%XP2dmyKNGj&k7yueS7_zeYAM8S#PZccG3`KFWedy$3jPx}Se9n^+Q0H3PXJkqCQ zWRFENw4^GYAe~db4MK1n@*vly6Q`--?&V-U^sTDo2T);y3+@?76h9spB`s~?1iB>* zMI*b1} zfcp!9J#8iG2!Q=JU+xJx=7Q;}^JZAbwo>caD%g!omD+HDl}f`e_EY7r#D|KwJJEN` zjUC@b>}+RgH$>Xt5Sf-3gg@I4w3b+0QMg6IGVk$TMhT1M2y(MdXc!N|`9Dq}Dj6BO z|I8#G7}0>q;d)UrJXP^q3sC+h1}YZ;Oz8iOCV;F=C7G37!nqap&u0xJfJvG9nGUM;YcHYnU9koFA{0mjrOrol`j zH^|njbjlMFd0iFAoXR-Y_4RAmPc?Xn!>Vxp*k1J1csQI`2`4!HJ(rekM;gi6HIU z{~1fXqT3@OmP!QZAgmPb8tSx{RqOBV;yb3_;L8CcXIi%wv)CH8pi&t7Np~*11F3$+ z;$=L?hWFK86=5j>X@vLA{IKFS?mhkRq_=IB!kUD+uiAE-!ZnIaoO~-#gHv5lO2}1q zXJ*Hb`S7DD2UcW;B0#`&PYK`teL+Cei|K17i>CRPwj7!7ZMVTg06W&AAjhC>H;w^M z7m$~iN4TF^>WEdoH~?b*xPk|V7WKK3qT{bo-o~n`A^jDel7ZB09r-Ag=?R#6d>qWm zmWF>bL6ODytb3^X{huTMUw!>`yn=9T{zIwgiV3&Tqo4kz;KGl?CCS>JFHGM};3L2H ziV_^bV13%d&G9l_!~|}&kT^iHul^YNiz#ZoR%>+xMw<&ut9t~Dh@PJQCese^-q`=q z^(CE{&SM_O@FK&OdKMM4$G<=%kmB>h#{IYHjNIUs#4LnqTf{`ZCSurA zx)n-l;2-W&_$cb1KP1QcreOQ?U{Y;f)xpeyp&dzaAsa(x1xPcO12$<^xvwhwYdb}011<3 zc!AxOppYu@l_5B}=vuwGP3sj*kMu4;$9livfsIizZx55*+MB+5_bQFVA;;;&NQkPb z>ZnnR#i_)>?!n4yZsO}odS67Ui(3lFz=n@OwqFSn(e{MRRi(!<9Y%QxXpPEHqM zK&3f0hd@JqDJ}FaHvMVDtLaJ=P6?T3stc)xPpih7sBAzu#P9ihzjByZ1seOqBa&4` zSU|>PyjhP<8ieM`K}Vur$riv z(iZ-!r1L3cGQ6aPc`?6r`ROSjQ*3bW{CIq8J%#ZsHl`TbW~C>y6&t0iovI0Pq=PqA z9@oZ)yyQfU&x*E7bh)mAgw3c<`gLO7^D!Y0)FRcmfor&-?t; zV3Xk;`nF(seaC8Y9q*y(3obQ)xgeJ>;o6iP7#ze&4O*dIPQ3_9uEZuUagw~=snIns zP-H#w9lsoB9PfQy499+W-(2upIMfA1J5RwpR6TA3l6T1fMtka?G5)nIslQ1etg?#Y zT(AdBww!$_H3U(ymfh>n6=w=RS$((>IG+t^e=`UzMb=F6`n`b2RyOWwlDAeoxiWo|iUPP(qBUyz{UBBK9y~ z<|~B`^YwT=cz7#?fZ02vrF!)_IOrSFpO7D-U%GuTEWDgIqP~qSV`ugl5UL3TJbh0zEI_^>dFtwRLc#q&?ch; zUWAb>@xC6*=~AP~#YIqdZ2`cd11&EJz%Zinp8!HN5f2W14JJ8?9)aJ=e#_Xm2ezk~ zVM*Wm>~33l?JBg;6`w>6r`Fk8bQ(SZL&}09gMqkYRQ|N9TZ${LKm3RPOBjGv#v$G3 z|2upD{u{EyuwoB3PM}BvGDr#@Hkf=1O7~tGB8s za8}T3(VT5-kcsKOlSMmf!*1Lgaa+B6;D}dxo{vo#r5XW)+RnGr5b_f9Ph1o82^Ues z>0M>d-Cas``+y)Ov>(n|9pzOdrJcG1k8&Jn2J!QMjCcLdJ4xLvaZoC7tz*_cW0!kslvXA*?e`>r3spJj1r~{~F@^DiyRW7Zn63`TRu|Kr%6(m3LgljWL?e<;x zQZp39Q-!FigCS@8knN%>);OWj4+LeHfqh(cjzJcXzG6|<^cDVc=iuz0X&|M29W~#` z|NH@Bz30t%tQh6uf-23QK_$0oaszYk4j9}ZJgs1|=KY@?F21o7)g(my_V&V|&^e)e zM+RbTIxA)Ysx(b`1x9Yu*LetLfAwT4Z`#-;atjU5r`>fnRjkH#gWXjn*M2Mlou=HN z*!~8KC}pS}wa;ipQ#J_Ii&s=_ljO-M#v)BKXL;M^-%{)_&%vXE$f7~0`9zmjJC~H& zJFS%iB2cXAm^Z9K%BcvH6}4urIY3L-Mf75IuSfN7E5sT`z&PQ!r3y=Qf^DvIbo=y; z`KK*IzC?jY?;U;EtXT1{*~mq({@Yc#4mYvvdRbHdHq^ffGzLt@M+nSt#c;`I33Gr- z@u7zzc>WmZ2T*g`tspkYatC0=^S=Ll2hKN!jE0jC9#GMEcc3CC_uNF(pRA`npU&YWX{iXRD$#+OzBZe!x?+E}0uj=&(@9Y8t% z9?}{`##qQ3FT~o`=bp&m{EX11TGZf8L>((nK2X6TIFM#zVEg>@9=u_Yo*bT#qzh0B z2z~%;mD8z+lEHHTG~@u3-V(0d;E%E07s#SX%;JsVydO}*vO5jt0-&2cms`Qqs156X zhE8WpEO2hN=IJaCp-B{iVp{R!)5yd4y+!{D%52L>4_9oXxR@N!g*(1jV)R$}-5Woh zG+WI;^C|prm5sf$ORVFeJfF%C!9{9jO9CNN1+rHJXFsxwILDJ}e0?IO7qf^0=t0$4 z6ZdLmG|Tk={%w8F9~AeDkov4={E|a`v<%!J0_d z%ytp`wq&tJmYO6f?Zm5N4=N||sD{r#hr)*OVu;h|eZ>82&U*FzEoYDzV3`~#3~kU2 zHlIIWxO(ZR$V)Rar%Yevx%tMos6p%oi4DF-zbkjyVw+Qrp~NBCO#jf33dzJL?GRI{ zclQDF44~RaSf$U3>;MHlqu+<_KiEuCm&b{_Z{qd6GXAle<2VM@;k_xBxH2_@9MFstcb)_2 z0bsP&8%6n^SFI{u=4=4=BtVE^buA^l$H|b5SycX{wx~H}L??Cl{olFn4R3O@04o-v zeqYp#M19rFcD$GR@HTI{2flZr*WxVFE~*#Q`R)<02vOcH!zT@7fu=<^CZDHST(h$1 zWuoJ~PYzov4}AbX&IBN9ByNHlZM+r-b<5q zS4kaF!`&H2Os1tD{3PZlyw8m2-`UyO)HEc39{`X^)UWwupFK*6V=5H=pia8CQq#1r zj$e=<^x>lW1PP;1o_~Mlb&Y`(s(1Tok%S#deDjC#ZQ?wlw|*?lH1Z@yA(=pH=AUE* zp@Q-~<*rFbyNUI&OB}UN9Xmk#`%;+ z$Wey2gWpNPg}}+*cH-yXbpRfz@2KwBg0tG9k!Ij7)rwQYn&6fsLEks>{z#|H6llCr zW*1!d7v@eyL4Jzo!qIVY$EYWfQ}&KPuPHZX>AbgqJ8Q*{%Iod^yaz>evN{}QY?3m8 z{L@ERHgkWVh1i`JkM{s|2WZ2904N3pWdj1pG`fp=a`E|}{N=+VXGSLDE>QL+oBWDi zZ!lk$&5`JMB;Zj9c@!Db@MqxJyRWrV>`*z7+7pNXW+>nWnC1BAT1w7jS=>Lnnkmvu zcZMH-UAeR*F$;M=PI8G2GuoWXt8m$&%2?iVIedW>>w$h;_b1NDRpANFBZr4>-v$4E zoVU2;k6}9II($gmn{0SY5FQ%~owN1&cx;lb*H~rb2+8hxeLSx~!O@G~d})Vam4^=O zDb|-k`h7<-mw8_^h{=x5yW9{h0GFG^jk%H-G3}Ewwkytv;Cfs1cX^|*bYxX&Z9R2Z zIbT)L%lqT?+f7Q57A~=_UTR49MB-`Q@~{)w=OB=&$^vpgUAh! zBnS)vT9>#LN}IYdviL0*I?Pi}q+DB0$hkc`;O^<>Yf0pu~zUff!?{mKkd=EhtePf?$kaUI7{Ove^pBBfvu{lXYQEM_m z9q=X=?{PuHvz48ijYpgLDsWH7frQcI>8tC4bpdEdz$ZpQ!T-y^0kQ(Y|0f49|w|>iz%S|NnRY7aaXB_)UWt literal 0 HcmV?d00001 From 0eea840b7e6b2ee369de62c86901ece2604acecb Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Thu, 26 Jul 2018 23:15:56 +0800 Subject: [PATCH 05/87] auto commit --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 1163cab0..855db3ef 100644 --- a/README.md +++ b/README.md @@ -87,17 +87,17 @@ Leetcode 上数据库题目的解题记录。 参考 Effective Java、Java 编程思想,也有部分内容参考官方文档以及 StackOverflow。 -> [Java 虚拟机](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/Java%20虚拟机.md) +> [Java 容器](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/Java%20容器.md) -参考 深入理解 Java 虚拟机。 +包含容器源码分析。 > [Java 并发](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/Java%20并发.md) 参考 Java 编程思想、深入理解 Java 虚拟机。 -> [Java 容器](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/Java%20容器.md) +> [Java 虚拟机](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/Java%20虚拟机.md) -包含容器源码的分析。 +参考 深入理解 Java 虚拟机。 > [Java I/O](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/Java%20IO.md) From e56ff5aafb4fa017431522f5670195908eafc4eb Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Fri, 27 Jul 2018 00:03:49 +0800 Subject: [PATCH 06/87] auto commit --- notes/Java 容器.md | 130 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 128 insertions(+), 2 deletions(-) diff --git a/notes/Java 容器.md b/notes/Java 容器.md index 9918979a..009a338b 100644 --- a/notes/Java 容器.md +++ b/notes/Java 容器.md @@ -12,6 +12,7 @@ * [LinkedList](#linkedlist) * [HashMap](#hashmap) * [ConcurrentHashMap](#concurrenthashmap) + * [LinkedHashMap](#linkedhashmap) * [参考资料](#参考资料) @@ -319,7 +320,7 @@ private static class Node { } ``` -每个链表存储了 Head 和 Tail 指针: +每个链表存储了 first 和 last 指针: ```java transient Node first; @@ -847,7 +848,6 @@ public int size() { } ``` - ### 3. JDK 1.8 的改动 JDK 1.7 使用分段锁机制来实现并发更新操作,核心类为 Segment,它继承自重入锁 ReentrantLock,并发程度与 Segment 数量相等。 @@ -856,6 +856,132 @@ JDK 1.8 使用了 CAS 操作来支持更高的并发度,在 CAS 操作失败 并且 JDK 1.8 的实现也在链表过长时会转换为红黑树。 +## LinkedHashMap + +### 存储结构 + +继承自 HashMap,因此具有和 HashMap 一样的快速查找特性。 + +```java +public class LinkedHashMap extends HashMap implements Map +``` + +内存维护了一个双向循环链表,用来维护插入顺序或者 LRU 顺序。 + +```java +/** + * The head (eldest) of the doubly linked list. + */ +transient LinkedHashMap.Entry head; + +/** + * The tail (youngest) of the doubly linked list. + */ +transient LinkedHashMap.Entry tail; +``` + +顺序使用 accessOrder 来决定,默认为 false,此时使用的是插入顺序。 + +```java +final boolean accessOrder; +``` + +LinkedHashMap 最重要的是以下用于记录顺序的函数,它们会在 put、get 等方法中调用。 + +```java +void afterNodeAccess(Node p) { } +void afterNodeInsertion(boolean evict) { } +``` + +### afterNodeAccess() + +当一个 Node 被访问时,如果 accessOrder 为 true,会将它移到链表尾部。也就是说指定为 LRU 顺序之后,在每次方位一个节点时,会将这个节点移到链表尾部,保证链表尾部是最近访问的节点,那么链表首部就是最近最久为使用的节点。 + +```java +void afterNodeAccess(Node e) { // move node to last + LinkedHashMap.Entry last; + if (accessOrder && (last = tail) != e) { + LinkedHashMap.Entry p = + (LinkedHashMap.Entry)e, b = p.before, a = p.after; + p.after = null; + if (b == null) + head = a; + else + b.after = a; + if (a != null) + a.before = b; + else + last = b; + if (last == null) + head = p; + else { + p.before = last; + last.after = p; + } + tail = p; + ++modCount; + } +} +``` + +### afterNodeInsertion() + +在 put 等操作之后执行,当 removeEldestEntry() 方法返回 ture 时会移除最晚的节点,也就是链表首部节点 first。 + +evict 只有在构建 Map 的时候才为 true。 + +```java +void afterNodeInsertion(boolean evict) { // possibly remove eldest + LinkedHashMap.Entry first; + if (evict && (first = head) != null && removeEldestEntry(first)) { + K key = first.key; + removeNode(hash(key), key, null, false, true); + } +} +``` + +removeEldestEntry() 默认为 false,如果需要让它为 true,需要继承 LinkedHashMap 并且覆盖这个方法的实现,这在实现 LRU 的缓存中特别有用,通过移除最近最久未使用的节点,从而保证缓存空间足够,并且缓存的数据都是热点数据。 + +```java +protected boolean removeEldestEntry(Map.Entry eldest) { + return false; + } +``` + +### LRU 缓存 + +以下是使用 LinkedHashMap 实现的一个 LRU 缓存,设定最大缓存空间 MAX_ENTRIES 为 2,并且使用 LinkedHashMap 的构造函数将 accessOrder 设置为 true,开启 LUR 顺序。并且覆盖了 removeEldestEntry() 方法实现,在节点多于 MAX_ENTRIES 就会将最近最久未使用的数据移除。 + +```java +class LRUCache extends LinkedHashMap { + private static final int MAX_ENTRIES = 3; + + protected boolean removeEldestEntry(Map.Entry eldest) { + return size() > MAX_ENTRIES; + } + + LRUCache() { + super(MAX_ENTRIES, 0.75f, true); + } +} +``` + +```java +public static void main(String[] args) { + LRUCache cache = new LRUCache<>(); + cache.put(1, "a"); + cache.put(2, "b"); + cache.put(3, "c"); + cache.get(1); + cache.put(4, "d"); + System.out.println(cache.keySet()); +} +``` + +```html +[3, 1, 4] +``` + # 参考资料 - Eckel B. Java 编程思想 [M]. 机械工业出版社, 2002. From 0bdaffd59c6009af4d7e9b4cc1cc036c21f8ed7f Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Fri, 27 Jul 2018 00:08:08 +0800 Subject: [PATCH 07/87] auto commit --- notes/Java 容器.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/notes/Java 容器.md b/notes/Java 容器.md index 009a338b..4cad3006 100644 --- a/notes/Java 容器.md +++ b/notes/Java 容器.md @@ -895,7 +895,7 @@ void afterNodeInsertion(boolean evict) { } ### afterNodeAccess() -当一个 Node 被访问时,如果 accessOrder 为 true,会将它移到链表尾部。也就是说指定为 LRU 顺序之后,在每次方位一个节点时,会将这个节点移到链表尾部,保证链表尾部是最近访问的节点,那么链表首部就是最近最久为使用的节点。 +当一个 Node 被访问时,如果 accessOrder 为 true,会将它移到链表尾部。也就是说指定为 LRU 顺序之后,在每次访问一个节点时,会将这个节点移到链表尾部,保证链表尾部是最近访问的节点,那么链表首部就是最近最久未使用的节点。 ```java void afterNodeAccess(Node e) { // move node to last @@ -928,7 +928,7 @@ void afterNodeAccess(Node e) { // move node to last 在 put 等操作之后执行,当 removeEldestEntry() 方法返回 ture 时会移除最晚的节点,也就是链表首部节点 first。 -evict 只有在构建 Map 的时候才为 true。 +evict 只有在构建 Map 的时候才为 false,在这里为 true。 ```java void afterNodeInsertion(boolean evict) { // possibly remove eldest @@ -950,7 +950,7 @@ protected boolean removeEldestEntry(Map.Entry eldest) { ### LRU 缓存 -以下是使用 LinkedHashMap 实现的一个 LRU 缓存,设定最大缓存空间 MAX_ENTRIES 为 2,并且使用 LinkedHashMap 的构造函数将 accessOrder 设置为 true,开启 LUR 顺序。并且覆盖了 removeEldestEntry() 方法实现,在节点多于 MAX_ENTRIES 就会将最近最久未使用的数据移除。 +以下是使用 LinkedHashMap 实现的一个 LRU 缓存,设定最大缓存空间 MAX_ENTRIES 为 3。使用 LinkedHashMap 的构造函数将 accessOrder 设置为 true,开启 LUR 顺序。覆盖 removeEldestEntry() 方法实现,在节点多于 MAX_ENTRIES 就会将最近最久未使用的数据移除。 ```java class LRUCache extends LinkedHashMap { From 28e05ef54f84741974d0da6aca994ca3ef812aa8 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Fri, 27 Jul 2018 00:49:18 +0800 Subject: [PATCH 08/87] auto commit --- notes/Java 容器.md | 58 ++++++++++++++++++++++++++++++++++++++++++++ notes/Java 虚拟机.md | 43 -------------------------------- 2 files changed, 58 insertions(+), 43 deletions(-) diff --git a/notes/Java 容器.md b/notes/Java 容器.md index 4cad3006..c6fc88f4 100644 --- a/notes/Java 容器.md +++ b/notes/Java 容器.md @@ -13,6 +13,7 @@ * [HashMap](#hashmap) * [ConcurrentHashMap](#concurrenthashmap) * [LinkedHashMap](#linkedhashmap) + * [WeekHashMap](#weekhashmap) * [参考资料](#参考资料) @@ -982,6 +983,63 @@ public static void main(String[] args) { [3, 1, 4] ``` +## WeekHashMap + +### 存储结构 + +WeakHashMap 的 Entry 继承自 WeakReference,被 WeakReference 关联的对象在下一次垃圾回收时会被回收。 + +WeakHashMap 主要用来实现缓存,通过使用 WeakHashMap 来引用缓存对象,由 JVM 对这部分缓存进行回收。 + +```java +private static class Entry extends WeakReference implements Map.Entry +``` + +### ConcurrentCache + +Tomcat 中的 ConcurrentCache 就使用了 WeakHashMap 来实现缓存功能。 + +ConcurrentCache 采取的是分代缓存: + +- 经常使用的对象放入 eden 中,eden 使用 ConcurrentHashMap 实现,不用担心会被回收(伊甸园); +- 不常用的对象放入 longterm,longterm 使用 WeakHashMap 实现,用来存放比较老的对象,这些老对象会被垃圾收集器回收。 + +```java +public final class ConcurrentCache { + + private final int size; + + private final Map eden; + + private final Map longterm; + + public ConcurrentCache(int size) { + this.size = size; + this.eden = new ConcurrentHashMap<>(size); + this.longterm = new WeakHashMap<>(size); + } + + public V get(K k) { + V v = this.eden.get(k); + if (v == null) { + v = this.longterm.get(k); + if (v != null) + this.eden.put(k, v); + } + return v; + } + + public void put(K k, V v) { + if (this.eden.size() >= size) { + this.longterm.putAll(this.eden); + this.eden.clear(); + } + this.eden.put(k, v); + } +} +``` + + # 参考资料 - Eckel B. Java 编程思想 [M]. 机械工业出版社, 2002. diff --git a/notes/Java 虚拟机.md b/notes/Java 虚拟机.md index 552a5e94..3bb9f289 100644 --- a/notes/Java 虚拟机.md +++ b/notes/Java 虚拟机.md @@ -184,49 +184,6 @@ WeakReference wf = new WeakReference(obj); obj = null; ``` -WeakHashMap 的 Entry 继承自 WeakReference,主要用来实现缓存。 - -```java -private static class Entry extends WeakReference implements Map.Entry -``` - -Tomcat 中的 ConcurrentCache 就使用了 WeakHashMap 来实现缓存功能。ConcurrentCache 采取的是分代缓存,经常使用的对象放入 eden 中,而不常用的对象放入 longterm。eden 使用 ConcurrentHashMap 实现,longterm 使用 WeakHashMap,保证了不常使用的对象容易被回收。 - -```java -public final class ConcurrentCache { - - private final int size; - - private final Map eden; - - private final Map longterm; - - public ConcurrentCache(int size) { - this.size = size; - this.eden = new ConcurrentHashMap<>(size); - this.longterm = new WeakHashMap<>(size); - } - - public V get(K k) { - V v = this.eden.get(k); - if (v == null) { - v = this.longterm.get(k); - if (v != null) - this.eden.put(k, v); - } - return v; - } - - public void put(K k, V v) { - if (this.eden.size() >= size) { - this.longterm.putAll(this.eden); - this.eden.clear(); - } - this.eden.put(k, v); - } -} -``` - **(四)虚引用** 又称为幽灵引用或者幻影引用。一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用取得一个对象实例。 From 4c1c3ba35e61592f8c09ad7937e7c5672eb15b6d Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Sat, 28 Jul 2018 01:05:53 +0800 Subject: [PATCH 09/87] auto commit --- README.md | 16 +- notes/HTTP.md | 260 ++-------------- notes/Redis.md | 38 +-- notes/{一致性.md => 分布式.md} | 286 ++++++++++++------ notes/分布式问题分析.md | 257 ---------------- notes/安全性.md | 219 ++++++++++++++ notes/消息队列.md | 80 +++++ notes/集群.md | 194 ++++++++++++ pics/09b52bcb-88ba-4e36-8244-b375f16ad116.jpg | Bin 0 -> 33792 bytes pics/76a25fc8-a579-4d7c-974b-7640b57fbf39.jpg | Bin 0 -> 61440 bytes pics/c5f611f0-fd5c-4158-9003-278141136e6e.jpg | Bin 0 -> 61440 bytes pics/ddb5ff4c-4ada-46aa-9bf1-140bdb5e4676.jpg | Bin 0 -> 31744 bytes 12 files changed, 737 insertions(+), 613 deletions(-) rename notes/{一致性.md => 分布式.md} (53%) delete mode 100644 notes/分布式问题分析.md create mode 100644 notes/安全性.md create mode 100644 notes/消息队列.md create mode 100644 notes/集群.md create mode 100644 pics/09b52bcb-88ba-4e36-8244-b375f16ad116.jpg create mode 100644 pics/76a25fc8-a579-4d7c-974b-7640b57fbf39.jpg create mode 100644 pics/c5f611f0-fd5c-4158-9003-278141136e6e.jpg create mode 100644 pics/ddb5ff4c-4ada-46aa-9bf1-140bdb5e4676.jpg diff --git a/README.md b/README.md index 855db3ef..f777d200 100644 --- a/README.md +++ b/README.md @@ -105,13 +105,21 @@ Leetcode 上数据库题目的解题记录。 ## 系统设计 :bulb: -> [一致性](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/一致性.md) +> [分布式](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/分布式.md) -CAP、BASE、Paxos、Raft +分布式锁、分布式事务、CAP、BASE、Paxos、Raft ->[分布式问题分析](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/分布式问题分析.md) +> [集群](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/分布式问题分析.md) -分布式事务、分布式锁、分布式 Session、负载均衡 +负载均衡、Session 管理 + +> [安全性](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/安全性.md) + +XSS、CSRF、SQL 注入、DDos + +> [消息队列](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/消息队列.md) + +消息处理模型、使用场景、可靠性 ## 工具 :hammer: diff --git a/notes/HTTP.md b/notes/HTTP.md index 915e19ee..7f54bd1a 100644 --- a/notes/HTTP.md +++ b/notes/HTTP.md @@ -40,11 +40,11 @@ * [完整性保护](#完整性保护) * [HTTPs 的缺点](#https-的缺点) * [配置 HTTPs](#配置-https) -* [七、Web 攻击技术](#七web-攻击技术) - * [跨站脚本攻击](#跨站脚本攻击) - * [跨站请求伪造](#跨站请求伪造) - * [SQL 注入攻击](#sql-注入攻击) - * [拒绝服务攻击](#拒绝服务攻击) +* [七、HTTP/2.0](#七http20) + * [HTTP/1.x 缺陷](#http1x-缺陷) + * [二进制分帧层](#二进制分帧层) + * [服务端推送](#服务端推送) + * [首部压缩](#首部压缩) * [八、GET 和 POST 的区别](#八get-和-post-的区别) * [作用](#作用) * [参数](#参数) @@ -53,11 +53,6 @@ * [可缓存](#可缓存) * [XMLHttpRequest](#xmlhttprequest) * [九、HTTP/1.0 与 HTTP/1.1 的区别](#九http10-与-http11-的区别) -* [十、HTTP/2.0](#十http20) - * [HTTP/1.x 缺陷](#http1x-缺陷) - * [二进制分帧层](#二进制分帧层) - * [服务端推送](#服务端推送) - * [首部压缩](#首部压缩) * [参考资料](#参考资料) @@ -716,213 +711,37 @@ HTTPs 的报文摘要功能之所以安全,是因为它结合了加密和认 [Nginx 配置 HTTPS 服务器](https://aotu.io/notes/2016/08/16/nginx-https/index.html) -# 七、Web 攻击技术 +# 七、HTTP/2.0 -## 跨站脚本攻击 +## HTTP/1.x 缺陷 -### 1. 概念 + HTTP/1.x 实现简单是以牺牲应用性能为代价的: -跨站脚本攻击(Cross-Site Scripting, XSS),可以将代码注入到用户浏览的网页上,这种代码包括 HTML 和 JavaScript。 +- 客户端需要使用多个连接才能实现并发和缩短延迟; +- 不会压缩请求和响应首部,从而导致不必要的网络流量; +- 不支持有效的资源优先级,致使底层 TCP 连接的利用率低下。 -例如有一个论坛网站,攻击者可以在上面发布以下内容: +## 二进制分帧层 -```html - -``` +HTTP/2.0 将报文分成 HEADERS 帧和 DATA 帧,它们都是二进制格式的。 -之后该内容可能会被渲染成以下形式: +

-```html -

-``` +在通信过程中,只会有一个 TCP 连接存在,它承载了任意数量的双向数据流(Stream)。一个数据流都有一个唯一标识符和可选的优先级信息,用于承载双向信息。消息(Message)是与逻辑请求或响应消息对应的完整的一系列帧。帧(Fram)是最小的通信单位,来自不同数据流的帧可以交错发送,然后再根据每个帧头的数据流标识符重新组装。 -另一个用户浏览了含有这个内容的页面将会跳转到 domain.com 并携带了当前作用域的 Cookie。如果这个论坛网站通过 Cookie 管理用户登录状态,那么攻击者就可以通过这个 Cookie 登录被攻击者的账号了。 +

-### 2. 危害 +## 服务端推送 -- 窃取用户的 Cookie 值 -- 伪造虚假的输入表单骗取个人信息 -- 显示伪造的文章或者图片 +HTTP/2.0 在客户端请求一个资源时,会把相关的资源一起发送给客户端,客户端就不需要再次发起请求了。例如客户端请求 page.html 页面,服务端就把 script.js 和 style.css 等与之相关的资源一起发给客户端。 -### 3. 防范手段 +

-**(一)设置 Cookie 为 HttpOnly** +## 首部压缩 -设置了 HttpOnly 的 Cookie 可以防止 JavaScript 脚本调用,就无法通过 document.cookie 获取用户 Cookie 信息。 +HTTP/1.1 的首部带有大量信息,而且每次都要重复发送。HTTP/2.0 要求客户端和服务器同时维护和更新一个包含之前见过的首部字段表,从而避免了重复传输。不仅如此,HTTP/2.0 也使用 Huffman 编码对首部字段进行压缩。 -**(二)过滤特殊字符** - -例如将 `<` 转义为 `<`,将 `>` 转义为 `>`,从而避免 HTML 和 Jascript 代码的运行。 - -**(三)富文本编辑器的处理** - -富文本编辑器允许用户输入 HTML 代码,就不能简单地将 `<` 等字符进行过滤了,极大地提高了 XSS 攻击的可能性。 - -富文本编辑器通常采用 XSS filter 来防范 XSS 攻击,可以定义一些标签白名单或者黑名单,从而不允许有攻击性的 HTML 代码的输入。 - -以下例子中,form 和 script 等标签都被转义,而 h 和 p 等标签将会保留。 - -[XSS 过滤在线测试](http://jsxss.com/zh/try.html) - -```html -

XSS Demo

- -

-Sanitize untrusted HTML (to prevent XSS) with a configuration specified by a Whitelist. -

- -
- - -
- -
hello
- -

- http -

- -

Features:

-
    -
  • Specifies HTML tags and their attributes allowed with whitelist
  • -
  • Handle any tags or attributes using custom function
  • -
- - -``` - -```html -

XSS Demo

- -

-Sanitize untrusted HTML (to prevent XSS) with a configuration specified by a Whitelist. -

- -<form> - <input type="text" name="q" value="test"> - <button id="submit">Submit</button> -</form> - -
hello
- -

- http -

- -

Features:

-
    -
  • Specifies HTML tags and their attributes allowed with whitelist
  • -
  • Handle any tags or attributes using custom function
  • -
- -<script type="text/javascript"> -alert(/xss/); -</script> -``` - -## 跨站请求伪造 - -### 1. 概念 - -跨站请求伪造(Cross-site request forgery,CSRF),是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并执行一些操作(如发邮件,发消息,甚至财产操作如转账和购买商品)。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去执行。 - -XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户浏览器的信任。 - -假如一家银行用以执行转账操作的 URL 地址如下: - -``` -http://www.examplebank.com/withdraw?account=AccoutName&amount=1000&for=PayeeName。 -``` - -那么,一个恶意攻击者可以在另一个网站上放置如下代码: - -``` -。 -``` - -如果有账户名为 Alice 的用户访问了恶意站点,而她之前刚访问过银行不久,登录信息尚未过期,那么她就会损失 1000 资金。 - -这种恶意的网址可以有很多种形式,藏身于网页中的许多地方。此外,攻击者也不需要控制放置恶意网址的网站。例如他可以将这种地址藏在论坛,博客等任何用户生成内容的网站中。这意味着如果服务器端没有合适的防御措施的话,用户即使访问熟悉的可信网站也有受攻击的危险。 - -透过例子能够看出,攻击者并不能通过 CSRF 攻击来直接获取用户的账户控制权,也不能直接窃取用户的任何信息。他们能做到的,是欺骗用户浏览器,让其以用户的名义执行操作。 - -### 2. 防范手段 - -**(一)检查 Referer 首部字段** - -Referer 首部字段位于 HTTP 报文中,用于标识请求来源的地址。检查这个首部字段并要求请求来源的地址在同一个域名下,可以极大的防止 XSRF 攻击。 - -这种办法简单易行,工作量低,仅需要在关键访问处增加一步校验。但这种办法也有其局限性,因其完全依赖浏览器发送正确的 Referer 字段。虽然 HTTP 协议对此字段的内容有明确的规定,但并无法保证来访的浏览器的具体实现,亦无法保证浏览器没有安全漏洞影响到此字段。并且也存在攻击者攻击某些浏览器,篡改其 Referer 字段的可能。 - -**(二)添加校验 Token** - -在访问敏感数据请求时,要求用户浏览器提供不保存在 Cookie 中,并且攻击者无法伪造的数据作为校验。例如服务器生成随机数并附加在表单中,并要求客户端传回这个随机数。 - -**(三)输入验证码** - -因为 CSRF 攻击是在用户无意识的情况下发生的,所以要求用户输入验证码可以让用户知道自己正在做的操作。 - -也可以要求用户输入验证码来进行校验。 - -## SQL 注入攻击 - -### 1. 概念 - -服务器上的数据库运行非法的 SQL 语句,主要通过拼接来完成。 - -### 2. 攻击原理 - -例如一个网站登录验证的 SQL 查询代码为: - -```sql -strSQL = "SELECT * FROM users WHERE (name = '" + userName + "') and (pw = '"+ passWord +"');" -``` - -如果填入以下内容: - -```sql -userName = "1' OR '1'='1"; -passWord = "1' OR '1'='1"; -``` - -那么 SQL 查询字符串为: - -```sql -strSQL = "SELECT * FROM users WHERE (name = '1' OR '1'='1') and (pw = '1' OR '1'='1');" -``` - -此时无需验证通过就能执行以下查询: - -```sql -strSQL = "SELECT * FROM users;" -``` - -### 3. 防范手段 - -**(一)使用参数化查询** - -以下以 Java 中的 PreparedStatement 为例,它是预先编译的 SQL 语句,可以传入适当参数并且多次执行。由于没有拼接的过程,因此可以防止 SQL 注入的发生。 - -```java -PreparedStatement stmt = connection.prepareStatement("SELECT * FROM users WHERE userid=? AND password=?"); -stmt.setString(1, userid); -stmt.setString(2, password); -ResultSet rs = stmt.executeQuery(); -``` - -**(二)单引号转换** - -将传入的参数中的单引号转换为连续两个单引号,PHP 中的 Magic quote 可以完成这个功能。 - -## 拒绝服务攻击 - -拒绝服务攻击(denial-of-service attack,DoS),亦称洪水攻击,其目的在于使目标电脑的网络或系统资源耗尽,使服务暂时中断或停止,导致其正常用户无法访问。 - -分布式拒绝服务攻击(distributed denial-of-service attack,DDoS),指攻击者使用网络上两个或以上被攻陷的电脑作为“僵尸”向特定的目标发动“拒绝服务”式攻击。 - -> [维基百科:拒绝服务攻击](https://zh.wikipedia.org/wiki/%E9%98%BB%E6%96%B7%E6%9C%8D%E5%8B%99%E6%94%BB%E6%93%8A) +

# 八、GET 和 POST 的区别 @@ -1021,37 +840,6 @@ DELETE /idX/delete HTTP/1.1 -> Returns 404 - HTTP/1.1 新增缓存处理指令 max-age -# 十、HTTP/2.0 - -## HTTP/1.x 缺陷 - - HTTP/1.x 实现简单是以牺牲应用性能为代价的: - -- 客户端需要使用多个连接才能实现并发和缩短延迟; -- 不会压缩请求和响应首部,从而导致不必要的网络流量; -- 不支持有效的资源优先级,致使底层 TCP 连接的利用率低下。 - -## 二进制分帧层 - -HTTP/2.0 将报文分成 HEADERS 帧和 DATA 帧,它们都是二进制格式的。 - -

- -在通信过程中,只会有一个 TCP 连接存在,它承载了任意数量的双向数据流(Stream)。一个数据流都有一个唯一标识符和可选的优先级信息,用于承载双向信息。消息(Message)是与逻辑请求或响应消息对应的完整的一系列帧。帧(Fram)是最小的通信单位,来自不同数据流的帧可以交错发送,然后再根据每个帧头的数据流标识符重新组装。 - -

- -## 服务端推送 - -HTTP/2.0 在客户端请求一个资源时,会把相关的资源一起发送给客户端,客户端就不需要再次发起请求了。例如客户端请求 page.html 页面,服务端就把 script.js 和 style.css 等与之相关的资源一起发给客户端。 - -

- -## 首部压缩 - -HTTP/1.1 的首部带有大量信息,而且每次都要重复发送。HTTP/2.0 要求客户端和服务器同时维护和更新一个包含之前见过的首部字段表,从而避免了重复传输。不仅如此,HTTP/2.0 也使用 Huffman 编码对首部字段进行压缩。 - -

# 参考资料 @@ -1075,10 +863,6 @@ HTTP/1.1 的首部带有大量信息,而且每次都要重复发送。HTTP/2.0 - [COOKIE 和 SESSION 有什么区别](https://www.zhihu.com/question/19786827) - [Cookie/Session 的机制与安全](https://harttle.land/2015/08/10/cookie-session.html) - [HTTPS 证书原理](https://shijianan.com/2017/06/11/https/) -- [维基百科:跨站脚本](https://zh.wikipedia.org/wiki/%E8%B7%A8%E7%B6%B2%E7%AB%99%E6%8C%87%E4%BB%A4%E7%A2%BC) -- [维基百科:SQL 注入攻击](https://zh.wikipedia.org/wiki/SQL%E8%B3%87%E6%96%99%E9%9A%B1%E7%A2%BC%E6%94%BB%E6%93%8A) -- [维基百科:跨站点请求伪造](https://zh.wikipedia.org/wiki/%E8%B7%A8%E7%AB%99%E8%AF%B7%E6%B1%82%E4%BC%AA%E9%80%A0) -- [维基百科:拒绝服务攻击](https://zh.wikipedia.org/wiki/%E9%98%BB%E6%96%B7%E6%9C%8D%E5%8B%99%E6%94%BB%E6%93%8A) - [What is the difference between a URI, a URL and a URN?](https://stackoverflow.com/questions/176264/what-is-the-difference-between-a-uri-a-url-and-a-urn) - [XMLHttpRequest](https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest) - [XMLHttpRequest (XHR) Uses Multiple Packets for HTTP POST?](https://blog.josephscott.org/2009/08/27/xmlhttprequest-xhr-uses-multiple-packets-for-http-post/) diff --git a/notes/Redis.md b/notes/Redis.md index 21840399..247d0987 100644 --- a/notes/Redis.md +++ b/notes/Redis.md @@ -27,18 +27,17 @@ * [八、持久化](#八持久化) * [RDB 持久化](#rdb-持久化) * [AOF 持久化](#aof-持久化) -* [九、发布与订阅](#九发布与订阅) -* [十、事务](#十事务) -* [十一、事件](#十一事件) +* [九、事务](#九事务) +* [十、事件](#十事件) * [文件事件](#文件事件) * [时间事件](#时间事件) * [事件的调度与执行](#事件的调度与执行) -* [十二、复制](#十二复制) +* [十一、复制](#十一复制) * [连接过程](#连接过程) * [主从链](#主从链) -* [十三、Sentinel](#十三sentinel) -* [十四、分片](#十四分片) -* [十五、一个简单的论坛系统分析](#十五一个简单的论坛系统分析) +* [十二、Sentinel](#十二sentinel) +* [十三、分片](#十三分片) +* [十四、一个简单的论坛系统分析](#十四一个简单的论坛系统分析) * [文章信息](#文章信息) * [点赞功能](#点赞功能) * [对文章进行排序](#对文章进行排序) @@ -453,20 +452,7 @@ Redis 是内存型数据库,为了保证数据在断电后不会丢失,需 随着服务器写请求的增多,AOF 文件会越来越大。Redis 提供了一种将 AOF 重写的特性,能够去除 AOF 文件中的冗余写命令。 -# 九、发布与订阅 - -订阅者订阅了频道之后,发布者向频道发送字符串消息会被所有订阅者接收到。 - -某个客户端使用 SUBSCRIBE 订阅一个频道,其它客户端可以使用 PUBLISH 向这个频道发送消息。 - -发布与订阅模式和观察者模式有以下不同: - -- 观察者模式中,观察者和主题都知道对方的存在;而在发布与订阅模式中,发布者与订阅者不知道对方的存在,它们之间通过频道进行通信。 -- 观察者模式是同步的,当事件触发时,主题会去调用观察者的方法,然后等待方法返回;而发布与订阅模式是异步的,发布者向频道发送一个消息之后,就不需要关心订阅者何时去订阅这个消息。 - -

- -# 十、事务 +# 九、事务 一个事务包含了多个命令,服务器在执行事务期间,不会改去执行其它客户端的命令请求。 @@ -474,7 +460,7 @@ Redis 是内存型数据库,为了保证数据在断电后不会丢失,需 Redis 最简单的事务实现方式是使用 MULTI 和 EXEC 命令将事务操作包围起来。 -# 十一、事件 +# 十、事件 Redis 服务器是一个事件驱动程序。 @@ -539,7 +525,7 @@ def main():

-# 十二、复制 +# 十一、复制 通过使用 slaveof host port 命令来让一个服务器成为另一个服务器的从服务器。 @@ -559,11 +545,11 @@ def main():

-# 十三、Sentinel +# 十二、Sentinel Sentinel(哨兵)可以监听主服务器,并在主服务器进入下线状态时,自动从从服务器中选举出新的主服务器。 -# 十四、分片 +# 十三、分片 分片是将数据划分为多个部分的方法,可以将数据存储到多台机器里面,也可以从多台机器里面获取数据,这种方法在解决某些问题时可以获得线性级别的性能提升。 @@ -575,7 +561,7 @@ Sentinel(哨兵)可以监听主服务器,并在主服务器进入下线状 - 代理分片:将客户端请求发送到代理上,由代理转发请求到正确的节点上。 - 服务器分片:Redis Cluster。 -# 十五、一个简单的论坛系统分析 +# 十四、一个简单的论坛系统分析 该论坛系统功能如下: diff --git a/notes/一致性.md b/notes/分布式.md similarity index 53% rename from notes/一致性.md rename to notes/分布式.md index b00de8ff..0f136855 100644 --- a/notes/一致性.md +++ b/notes/分布式.md @@ -1,32 +1,178 @@ -* [一、CAP](#一cap) +* [一、分布式锁](#一分布式锁) + * [数据库的唯一索引](#数据库的唯一索引) + * [Redis 的 SETNX 指令](#redis-的-setnx-指令) + * [Redis 的 RedLock 算法](#redis-的-redlock-算法) + * [Zookeeper 的有序节点](#zookeeper-的有序节点) +* [二、分布式事务](#二分布式事务) + * [本地消息表](#本地消息表) + * [2PC](#2pc) +* [三、CAP](#三cap) * [一致性](#一致性) * [可用性](#可用性) * [分区容忍性](#分区容忍性) * [权衡](#权衡) -* [二、BASE](#二base) +* [四、BASE](#四base) * [基本可用](#基本可用) * [软状态](#软状态) * [最终一致性](#最终一致性) -* [三、2PC](#三2pc) - * [运行过程](#运行过程) - * [存在的问题](#存在的问题) -* [四、Paxos](#四paxos) +* [五、Paxos](#五paxos) * [执行过程](#执行过程) * [约束条件](#约束条件) * [五、Raft](#五raft) * [单个 Candidate 的竞选](#单个-candidate-的竞选) * [多个 Candidate 竞选](#多个-candidate-竞选) * [日志复制](#日志复制) -* [参考资料](#参考资料) -# 一、CAP +# 一、分布式锁 + +在单机场景下,可以使用 Java 提供的内置锁来实现进程同步。但是在分布式场景下,需要同步的进程可能位于不同的节点上,那么就需要使用分布式锁。 + +阻塞锁通常使用互斥量来实现: + +- 互斥量为 1 表示有其它进程在使用锁,此时处于锁定状态; +- 互斥量为 0 表示未锁定状态。 + +1 和 0 可以用一个整型值表示,也可以用某个数据存在或者不存在表示,存在表示互斥量为 1。 + +## 数据库的唯一索引 + +当想要获得锁时,就向表中插入一条记录,释放锁时就删除这条记录。唯一索引可以保证该记录只被插入一次,那么就可以用这个记录是否存在来判断是否存于锁定状态。 + +存在以下几个问题: + +- 锁没有失效时间,解锁失败的话其它进程无法再获得锁。 +- 只能是非阻塞锁,插入失败直接就报错了,无法重试。 +- 不可重入,已经获得锁的进程也必须重新获取锁。 + +## Redis 的 SETNX 指令 + +使用 SETNX(set if not exist)指令插入一个键值对,如果 Key 已经存在,那么会返回 False,否则插入成功并返回 True。 + +SETNX 指令和数据库的唯一索引类似,保证了只存在一个 Key 的键值对,那么可以用一个 Key 的键值对是否存在来判断是否存于锁定状态。 + +EXPIRE 指令可以为一个键值对设置一个过期时间,从而避免了数据库唯一索引实现方式中释放锁失败的问题。 + +## Redis 的 RedLock 算法 + +使用了多个 Redis 实例来实现分布式锁,这是为了保证在发生单点故障时仍然可用。 + +- 尝试从 N 个相互独立 Redis 实例获取锁,如果一个实例不可用,应该尽快尝试下一个; +- 计算获取锁消耗的时间,只有当这个时间小于锁的过期时间,并且从大多数(N / 2 + 1)实例上获取了锁,那么就认为锁获取成功了; +- 如果锁获取失败,会到每个实例上释放锁。 + +## Zookeeper 的有序节点 + +### 1. Zookeeper 抽象模型 + +Zookeeper 提供了一种树形结构级的命名空间,/app1/p_1 节点表示它的父节点为 /app1。 + +

+ +### 2. 节点类型 + +- 永久节点:不会因为会话结束或者超时而消失; +- 临时节点:如果会话结束或者超时就会消失; +- 有序节点:会在节点名的后面加一个数字后缀,并且是有序的,例如生成的有序节点为 /lock/node-0000000000,它的下一个有序节点则为 /lock/node-0000000001,以此类推。 + +### 3. 监听器 + +为一个节点注册监听器,在节点状态发生改变时,会给客户端发送消息。 + +### 4. 分布式锁实现 + +- 创建一个锁目录 /lock; +- 当一个客户端需要获取锁时,在 /lock 下创建临时的且有序的子节点; +- 客户端获取 /lock 下的子节点列表,判断自己创建的子节点是否为当前子节点列表中序号最小的子节点,如果是则认为获得锁;否则监听自己的前一个子节点,获得子节点的变更通知后重复此步骤直至获得锁; +- 执行业务代码,完成后,删除对应的子节点。 + +### 5. 会话超时 + +如果一个已经获得锁的会话超时了,因为创建的是临时节点,所以该会话对应的临时节点会被删除,其它会话就可以获得锁了。可以看到,Zookeeper 分布式锁不会出现数据库的唯一索引实现分布式锁的释放锁失败问题。 + +### 6. 羊群效应 + +一个节点未获得锁,需要监听自己的前一个子节点,这是因为如果监听所有的子节点,那么任意一个子节点状态改变,其它所有子节点都会收到通知(羊群效应),而我们只希望它的后一个子节点收到通知。 + +参考: + +- [Distributed locks with Redis](https://redis.io/topics/distlock) +- [浅谈分布式锁](http://www.linkedkeeper.com/detail/blog.action?bid=1023) +- [基于 Zookeeper 的分布式锁](http://www.dengshenyu.com/java/%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E7%BB%9F/2017/10/23/zookeeper-distributed-lock.html) + +# 二、分布式事务 + +指事务的操作位于不同的节点上,需要保证事务的 AICD 特性。例如在下单场景下,库存和订单如果不在同一个节点上,就涉及分布式事务。 + +## 本地消息表 + +### 1. 原理 + +本地消息表与业务数据表处于同一个数据库中,这样就能利用本地事务来保证在对这两个表的操作满足事务特性。 + +1. 在分布式事务操作的一方完成写业务数据的操作之后向本地消息表发送一个消息,本地事务能保证这个消息一定会被写入本地消息表中。 +2. 之后将本地消息表中的消息转发到 Kafka 等消息队列中,如果转发成功则将消息从本地消息表中删除,否则继续重新转发。 +3. 在分布式事务操作的另一方从消息队列中读取一个消息,并执行消息中的操作。 + +

+ +### 2. 分析 + +本地消息表利用了本地事务来实现分布式事务,并且使用了消息队列来保证最终一致性。 + +## 2PC + +两阶段提交(Two-phase Commit,2PC) + +通过引入协调者(Coordinator)来协调参与者的行为,并最终决定这些参与者是否要真正执行事务。 + +### 1. 运行过程 + +(一)准备阶段 + +协调者询问参与者事务是否执行成功,参与者发回事务执行结果。 + +

+ +(二)提交阶段 + +如果事务在每个参与者上都执行成功,事务协调者发送通知让参与者提交事务;否则,协调者发送通知让参与者回滚事务。 + +需要注意的是,在准备阶段,参与者执行了事务,但是还未提交。只有在提交阶段接收到协调者发来的通知后,才进行提交或者回滚。 + +

+ +### 2. 存在的问题 + +(一)同步阻塞 + +所有事务参与者在等待其它参与者响应的时候都处于同步阻塞状态,无法进行其它操作。 + +(二)单点问题 + +协调者在 2PC 中起到非常大的作用,发生故障将会造成很大影响,特别是在阶段二发生故障,所有参与者会一直等待状态,无法完成其它操作。 + +(三)数据不一致 + +在阶段二,如果协调者只发送了部分 Commit 消息,此时网络发生异常,那么只有部分参与者接收到 Commit 消息,也就是说只有部分参与者提交了事务,使得系统数据不一致。 + +(四)太过保守 + +任意一个节点失败就会导致整个事务失败,没有完善的容错机制。 + +参考: + +- [聊聊分布式事务,再说说解决方案](https://www.cnblogs.com/savorboard/p/distributed-system-transaction-consistency.html) +- [分布式系统的事务处理](https://coolshell.cn/articles/10910.html) +- [深入理解分布式事务](https://juejin.im/entry/577c6f220a2b5800573492be) + +# 三、CAP 分布式系统不可能同时满足一致性(C:Consistency)、可用性(A:Availability)和分区容忍性(P:Partition Tolerance),最多只能同时满足其中两项。 -

+

## 一致性 @@ -54,18 +200,23 @@ 可用性和一致性往往是冲突的,很难都使它们同时满足。在多个节点之间进行数据同步时, -- 为了保证一致性(CP),就需要让所有节点下线成为不可用的状态,等待同步完成; -- 为了保证可用性(AP),在同步过程中允许读取所有节点的数据,但是数据可能不一致。 +* 为了保证一致性(CP),就需要让所有节点下线成为不可用的状态,等待同步完成; +* 为了保证可用性(AP),在同步过程中允许读取所有节点的数据,但是数据可能不一致。 -

+

-# 二、BASE +参考: + +- 倪超. 从 Paxos 到 ZooKeeper : 分布式一致性原理与实践 [M]. 电子工业出版社, 2015. +- [What is CAP theorem in distributed database system?](http://www.colooshiki.com/index.php/2017/04/20/what-is-cap-theorem-in-distributed-database-system/) + +# 四、BASE BASE 是基本可用(Basically Available)、软状态(Soft State)和最终一致性(Eventually Consistent)三个短语的缩写。 BASE 理论是对 CAP 中一致性和可用性权衡的结果,它的理论的核心思想是:即使无法做到强一致性,但每个应用都可以根据自身业务特点,采用适当的方式来使系统达到最终一致性。 -

+

## 基本可用 @@ -85,49 +236,7 @@ ACID 要求强一致性,通常运用在传统的数据库系统上。而 BASE 在实际的分布式场景中,不同业务单元和组件对一致性的要求是不同的,因此 ACID 和 BASE 往往会结合在一起使用。 -# 三、2PC - -两阶段提交(Two-phase Commit,2PC) - -主要用于实现分布式事务,分布式事务指的是事务操作跨越多个节点,并且要求满足事务的 ACID 特性。 - -通过引入协调者(Coordinator)来调度参与者的行为,并最终决定这些参与者是否要真正执行事务。 - -## 运行过程 - -### 1. 准备阶段 - -协调者询问参与者事务是否执行成功,参与者发回事务执行结果。 - -

- -### 2. 提交阶段 - -如果事务在每个参与者上都执行成功,事务协调者发送通知让参与者提交事务;否则,协调者发送通知让参与者回滚事务。 - -

- -需要注意的是,在准备阶段,参与者执行了事务,但是还未提交。只有在提交阶段接收到协调者发来的通知后,才进行提交或者回滚。 - -## 存在的问题 - -### 1. 同步阻塞 - -所有事务参与者在等待其它参与者响应的时候都处于同步阻塞状态,无法进行其它操作。 - -### 2. 单点问题 - -协调者在 2PC 中起到非常大的作用,发生故障将会造成很大影响,特别是在阶段二发生故障,所有参与者会一直等待状态,无法完成其它操作。 - -### 3. 数据不一致 - -在阶段二,如果协调者只发送了部分 Commit 消息,此时网络发生异常,那么只有部分参与者接收到 Commit 消息,也就是说只有部分参与者提交了事务,使得系统数据不一致。 - -### 4. 太过保守 - -任意一个节点失败就会导致整个事务失败,没有完善的容错机制。 - -# 四、Paxos +# 五、Paxos 用于达成共识性问题,即对多个节点产生的值,该算法能保证只选出唯一一个值。 @@ -137,7 +246,7 @@ ACID 要求强一致性,通常运用在传统的数据库系统上。而 BASE - 接受者(Acceptor):对每个提议进行投票; - 告知者(Learner):被告知投票的结果,不参与投票过程。 -

+

## 执行过程 @@ -145,19 +254,19 @@ ACID 要求强一致性,通常运用在传统的数据库系统上。而 BASE 下图演示了两个 Proposer 和三个 Acceptor 的系统中运行该算法的初始过程,每个 Proposer 都会向所有 Acceptor 发送提议请求。 -

+

当 Acceptor 接收到一个提议请求,包含的提议为 [n1, v1],并且之前还未接收过提议请求,那么发送一个提议响应,设置当前接收到的提议为 [n1, v1],并且保证以后不会再接受序号小于 n1 的提议。 如下图,Acceptor X 在收到 [n=2, v=8] 的提议请求时,由于之前没有接收过提议,因此就发送一个 [no previous] 的提议响应,设置当前接收到的提议为 [n=2, v=8],并且保证以后不会再接受序号小于 2 的提议。其它的 Acceptor 类似。 -

+

如果 Acceptor 接收到一个提议请求,包含的提议为 [n2, v2],并且之前已经接收过提议 [n1, v1]。如果 n1 > n2,那么就丢弃该提议请求;否则,发送提议响应,该提议响应包含之前已经接收过的提议 [n1, v1],设置当前接收到的提议为 [n2, v2],并且保证以后不会再接受序号小于 n2 的提议。 如下图,Acceptor Z 收到 Proposer A 发来的 [n=2, v=8] 的提议请求,由于之前已经接收过 [n=4, v=5] 的提议,并且 n > 2,因此就抛弃该提议请求;Acceptor X 收到 Proposer B 发来的 [n=4, v=5] 的提议请求,因为之前接收到的提议为 [n=2, v=8],并且 2 <= 4,因此就发送 [n=2, v=8] 的提议响应,设置当前接收到的提议为 [n=4, v=5],并且保证以后不会再接受序号小于 4 的提议。Acceptor Y 类似。 -

+

当一个 Proposer 接收到超过一半 Acceptor 的提议响应时,就可以发送接受请求。 @@ -165,26 +274,31 @@ Proposer A 接收到两个提议响应之后,就发送 [n=2, v=8] 接受请求 Proposer B 过后也收到了两个提议响应,因此也开始发送接受请求。需要注意的是,接受请求的 v 需要取它收到的最大 v 值,也就是 8。因此它发送 [n=4, v=8] 的接受请求。 -

+

Acceptor 接收到接受请求时,如果序号大于等于该 Acceptor 承诺的最小序号,那么就发送通知给所有的 Learner。当 Learner 发现有大多数的 Acceptor 接收了某个提议,那么该提议的提议值就被 Paxos 选择出来。 -

+

## 约束条件 -### 1. 正确性 +### 1\. 正确性 指只有一个提议值会生效。 因为 Paxos 协议要求每个生效的提议被多数 Acceptor 接收,并且 Acceptor 不会接受两个不同的提议,因此可以保证正确性。 -### 2. 可终止性 +### 2\. 可终止性 指最后总会有一个提议生效。 Paxos 协议能够让 Proposer 发送的提议朝着能被大多数 Acceptor 接受的那个提议靠拢,因此能够保证可终止性。 +参考: + +- [NEAT ALGORITHMS - PAXOS](http://harry.me/blog/2014/12/27/neat-algorithms-paxos/) +- [Paxos By Example](https://angus.nyc/2012/paxos-by-example/) + # 五、Raft Raft 和 Paxos 类似,但是更容易理解,也更容易实现。 @@ -195,55 +309,51 @@ Raft 主要是用来竞选主节点。 有三种节点:Follower、Candidate 和 Leader。Leader 会周期性的发送心跳包给 Follower。每个 Follower 都设置了一个随机的竞选超时时间,一般为 150ms\~300ms,如果在这个时间内没有收到 Leader 的心跳包,就会变成 Candidate,进入竞选阶段。 -- 下图表示一个分布式系统的最初阶段,此时只有 Follower,没有 Leader。Follower A 等待一个随机的竞选超时时间之后,没收到 Leader 发来的心跳包,因此进入竞选阶段。 +* 下图表示一个分布式系统的最初阶段,此时只有 Follower,没有 Leader。Follower A 等待一个随机的竞选超时时间之后,没收到 Leader 发来的心跳包,因此进入竞选阶段。 -

+

-- 此时 A 发送投票请求给其它所有节点。 +* 此时 A 发送投票请求给其它所有节点。 -

+

-- 其它节点会对请求进行回复,如果超过一半的节点回复了,那么该 Candidate 就会变成 Leader。 +* 其它节点会对请求进行回复,如果超过一半的节点回复了,那么该 Candidate 就会变成 Leader。 -

+

-- 之后 Leader 会周期性地发送心跳包给 Follower,Follower 接收到心跳包,会重新开始计时。 +* 之后 Leader 会周期性地发送心跳包给 Follower,Follower 接收到心跳包,会重新开始计时。 -

+

## 多个 Candidate 竞选 * 如果有多个 Follower 成为 Candidate,并且所获得票数相同,那么就需要重新开始投票,例如下图中 Candidate B 和 Candidate D 都获得两票,因此需要重新开始投票。 -

+

* 当重新开始投票时,由于每个节点设置的随机竞选超时时间不同,因此能下一次再次出现多个 Candidate 并获得同样票数的概率很低。 -

+

## 日志复制 -- 来自客户端的修改都会被传入 Leader。注意该修改还未被提交,只是写入日志中。 +* 来自客户端的修改都会被传入 Leader。注意该修改还未被提交,只是写入日志中。 -

+

-- Leader 会把修改复制到所有 Follower。 +* Leader 会把修改复制到所有 Follower。 -

+

-- Leader 会等待大多数的 Follower 也进行了修改,然后才将修改提交。 +* Leader 会等待大多数的 Follower 也进行了修改,然后才将修改提交。 -

+

-- 此时 Leader 会通知的所有 Follower 让它们也提交修改,此时所有节点的值达成一致。 +* 此时 Leader 会通知的所有 Follower 让它们也提交修改,此时所有节点的值达成一致。 -

+

-# 参考资料 +参考: -- 倪超. 从 Paxos 到 ZooKeeper : 分布式一致性原理与实践 [M]. 电子工业出版社, 2015. -- [What is CAP theorem in distributed database system?](http://www.colooshiki.com/index.php/2017/04/20/what-is-cap-theorem-in-distributed-database-system/) -- [NEAT ALGORITHMS - PAXOS](http://harry.me/blog/2014/12/27/neat-algorithms-paxos/) - [Raft: Understandable Distributed Consensus](http://thesecretlivesofdata.com/raft) -- [Paxos By Example](https://angus.nyc/2012/paxos-by-example/) diff --git a/notes/分布式问题分析.md b/notes/分布式问题分析.md deleted file mode 100644 index dfeb7691..00000000 --- a/notes/分布式问题分析.md +++ /dev/null @@ -1,257 +0,0 @@ - -* [一、分布式锁](#一分布式锁) - * [数据库的唯一索引](#数据库的唯一索引) - * [Redis 的 SETNX 指令](#redis-的-setnx-指令) - * [Redis 的 RedLock 算法](#redis-的-redlock-算法) - * [Zookeeper 的有序节点](#zookeeper-的有序节点) -* [二、分布式事务](#二分布式事务) - * [本地消息表](#本地消息表) - * [两阶段提交协议](#两阶段提交协议) -* [三、分布式 Session](#三分布式-session) - * [Sticky Sessions](#sticky-sessions) - * [Session Replication](#session-replication) - * [Session Server](#session-server) -* [四、负载均衡](#四负载均衡) - * [算法](#算法) - * [实现](#实现) - - - -# 一、分布式锁 - -在单机场景下,可以使用 Java 提供的内置锁来实现进程同步。但是在分布式场景下,需要同步的进程可能位于不同的节点上,那么就需要使用分布式锁。 - -阻塞锁通常使用互斥量来实现,互斥量为 1 表示有其它进程在使用锁,此时处于锁定状态,互斥量为 0 表示未锁定状态。1 和 0 可以用一个整型值来存储,也可以用某个数据存在或者不存在来存储,某个数据存在表示互斥量为 1。 - -## 数据库的唯一索引 - -当想要获得锁时,就向表中插入一条记录,释放锁时就删除这条记录。唯一索引可以保证该记录只被插入一次,那么就可以用这个记录是否存在来判断是否存于锁定状态。 - -存在以下几个问题: - -- 锁没有失效时间,解锁失败的话其他线程无法再获得锁。 -- 只能是非阻塞锁,插入失败直接就报错了,无法重试。 -- 不可重入,已经获得锁的进程也必须重新获取锁。 - -## Redis 的 SETNX 指令 - -使用 SETNX(set if not exist)指令插入一个键值对,如果 Key 已经存在,那么会返回 False,否则插入成功并返回 True。 - -SETNX 指令和数据库的唯一索引类似,可以保证只存在一个 Key 的键值对,可以用一个 Key 的键值对是否存在来判断是否存于锁定状态。 - -EXPIRE 指令可以为一个键值对设置一个过期时间,从而避免了数据库唯一索引实现方式中释放锁失败的问题。 - -## Redis 的 RedLock 算法 - -使用了多个 Redis 实例来实现分布式锁,这是为了保证在发生单点故障时仍然可用。 - -- 尝试从 N 个相互独立 Redis 实例获取锁,如果一个实例不可用,应该尽快尝试下一个。 -- 计算获取锁消耗的时间,只有当这个时间小于锁的过期时间,并且从大多数(N/2+1)实例上获取了锁,那么就认为锁获取成功了。 -- 如果锁获取失败,会到每个实例上释放锁。 - -## Zookeeper 的有序节点 - -### 1. Zookeeper 抽象模型 - -Zookeeper 提供了一种树形结构级的命名空间,/app1/p_1 节点表示它的父节点为 /app1。 - -

- -### 2. 节点类型 - -- 永久节点:不会因为会话结束或者超时而消失; -- 临时节点:如果会话结束或者超时就会消失; -- 有序节点:会在节点名的后面加一个数字后缀,并且是有序的,例如生成的有序节点为 /lock/node-0000000000,它的下一个有序节点则为 /lock/node-0000000001,以此类推。 - -### 3. 监听器 - -为一个节点注册监听器,在节点状态发生改变时,会给客户端发送消息。 - -### 4. 分布式锁实现 - -- 创建一个锁目录 /lock; -- 当一个客户端需要获取锁时,在 /lock 下创建临时的且有序的子节点; -- 客户端获取 /lock 下的子节点列表,判断自己创建的子节点是否为当前子节点列表中序号最小的子节点,如果是则认为获得锁;否则监听自己的前一个子节点,获得子节点的变更通知后重复此步骤直至获得锁; -- 执行业务代码,完成后,删除对应的子节点。 - -### 5. 会话超时 - -如果一个已经获得锁的会话超时了,因为创建的是临时节点,所以该会话对应的临时节点会被删除,其它会话就可以获得锁了。可以看到,Zookeeper 分布式锁不会出现数据库的唯一索引实现分布式锁的释放锁失败问题。 - -### 6. 羊群效应 - -一个节点未获得锁,需要监听自己的前一个子节点,这是因为如果监听所有的子节点,那么任意一个子节点状态改变,其它所有子节点都会收到通知(羊群效应),而我们只希望它的后一个子节点收到通知。 - -参考: - -- [浅谈分布式锁](http://www.linkedkeeper.com/detail/blog.action?bid=1023) -- [Distributed locks with Redis](https://redis.io/topics/distlock) -- [基于 Zookeeper 的分布式锁](http://www.dengshenyu.com/java/%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E7%BB%9F/2017/10/23/zookeeper-distributed-lock.html) - -# 二、分布式事务 - -指事务的操作位于不同的节点上,需要保证事务的 AICD 特性。例如在下单场景下,库存和订单如果不在同一个节点上,就涉及分布式事务。 - -## 本地消息表 - -### 1. 原理 - -本地消息表与业务数据表处于同一个数据库中,这样就能利用本地事务来保证在对这两个表的操作满足事务特性。 - -1. 在分布式事务操作的一方完成写业务数据的操作之后向本地消息表发送一个消息,本地事务能保证这个消息一定会被写入本地消息表中。 -2. 之后将本地消息表中的消息转发到 Kafka 等消息队列(MQ)中,如果转发成功则将消息从本地消息表中删除,否则继续重新转发。 -3. 在分布式事务操作的另一方从消息队列中读取一个消息,并执行消息中的操作。 - -

- -### 2. 分析 - -本地消息表利用了本地事务来实现分布式事务,并且使用了消息队列来保证最终一致性。 - -## 两阶段提交协议 - -[CyC2018/Interview-Notebook/一致性.md/2PC](https://github.com/CyC2018/Interview-Notebook/blob/master/notes/%E4%B8%80%E8%87%B4%E6%80%A7.md) - -参考: - -- [聊聊分布式事务,再说说解决方案](https://www.cnblogs.com/savorboard/p/distributed-system-transaction-consistency.html) -- [分布式系统的事务处理](https://coolshell.cn/articles/10910.html) -- [深入理解分布式事务](https://juejin.im/entry/577c6f220a2b5800573492be) - -# 三、分布式 Session - -在分布式场景下,一个用户的 Session 如果只存储在一个服务器上,那么当负载均衡器把用户的下一个请求转发到另一个服务器上,该服务器没有用户的 Session,就可能导致用户需要重新进行登录等操作。 - -## Sticky Sessions - -需要配置负载均衡器,使得一个用户的所有请求都路由到一个服务器节点上,这样就可以把用户的 Session 存放在该服务器节点中。 - -缺点:当服务器节点宕机时,将丢失该服务器节点上的所有 Session。 - -

- -## Session Replication - -在服务器节点之间进行 Session 同步操作,这样的话用户可以访问任何一个服务器节点。 - -缺点:占用过多内存;同步过程占用网络带宽以及服务器处理器时间。 - -

- -## Session Server - -使用一个单独的服务器存储 Session 数据,可以存在 MySQL 数据库上,也可以存在 Redis 或者 Memcached 这种内存型数据库。 - -缺点:需要去实现存取 Session 的代码。 - -

- -参考: - -- [Session Management using Spring Session with JDBC DataStore](https://sivalabs.in/2018/02/session-management-using-spring-session-jdbc-datastore/) - -# 四、负载均衡 - -## 算法 - -### 1. 轮询(Round Robin) - -轮询算法把每个请求轮流发送到每个服务器上。下图中,一共有 6 个客户端产生了 6 个请求,这 6 个请求按 (1, 2, 3, 4, 5, 6) 的顺序发送。最后,(1, 3, 5) 的请求会被发送到服务器 1,(2, 4, 6) 的请求会被发送到服务器 2。 - -

- -该算法比较适合每个服务器的性能差不多的场景,如果有性能存在差异的情况下,那么性能较差的服务器可能无法承担过大的负载(下图的 Server 2)。 - -

- -### 2. 加权轮询(Weighted Round Robbin) - -加权轮询是在轮询的基础上,根据服务器的性能差异,为服务器赋予一定的权值。例如下图中,服务器 1 被赋予的权值为 5,服务器 2 被赋予的权值为 1,那么 (1, 2, 3, 4, 5) 请求会被发送到服务器 1,(6) 请求会被发送到服务器 2。 - -

- -### 3. 最少连接(least Connections) - -由于每个请求的连接时间不一样,使用轮询或者加权轮询算法的话,可能会让一台服务器当前连接数过大,而另一台服务器的连接过小,造成负载不均衡。例如下图中,(1, 3, 5) 请求会被发送到服务器 1,但是 (1, 3) 很快就断开连接,此时只有 (5) 请求连接服务器 1;(2, 4, 6) 请求被发送到服务器 2,只有 (2) 的连接断开。该系统继续运行时,服务器 2 会承担过大的负载。 - -

- -最少连接算法就是将请求发送给当前最少连接数的服务器上。例如下图中,服务器 1 当前连接数最小,那么新到来的请求 6 就会被发送到服务器 1 上。 - -

- -### 4. 加权最少连接(Weighted Least Connection) - -在最少连接的基础上,根据服务器的性能为每台服务器分配权重,再根据权重计算出每台服务器能处理的连接数。 - -

- -### 5. 随机算法(Random) - -把请求随机发送到服务器上。和轮询算法类似,该算法比较适合服务器性能差不多的场景。 - -

- -### 6. 源地址哈希法 (IP Hash) - -源地址哈希通过对客户端 IP 哈希计算得到的一个数值,用该数值对服务器数量进行取模运算,取模结果便是目标服务器的序号。 - -- 优点:保证同一 IP 的客户端都会被 hash 到同一台服务器上。 -- 缺点:不利于集群扩展,后台服务器数量变更都会影响 hash 结果。可以采用一致性 Hash 改进。 - -

- -## 实现 - -### 1. HTTP 重定向 - -HTTP 重定向负载均衡服务器收到 HTTP 请求之后会返回服务器的地址,并将该地址写入 HTTP 重定向响应中返回给浏览器,浏览器收到后需要再次发送请求。 - -缺点: - -- 用户访问的延迟会增加; -- 如果负载均衡器宕机,就无法访问该站点。 - -

- -### 2. DNS 重定向 - -使用 DNS 作为负载均衡器,根据负载情况返回不同服务器的 IP 地址。 - -大型网站基本使用了这种方式做为第一级负载均衡手段,然后在内部使用其它方式做第二级负载均衡。 - -缺点: - -- DNS 查找表可能会被客户端缓存起来,那么之后的所有请求都会被重定向到同一个服务器。 - -

- -### 3. 修改 MAC 地址 - -使用 LVS(Linux Virtual Server)这种链路层负载均衡器,根据负载情况修改请求的 MAC 地址。 - -

- -### 4. 修改 IP 地址 - -在网络层修改请求的目的 IP 地址。 - -

- -### 5. 代理自动配置 - -正向代理与反向代理的区别: - -- 正向代理:发生在客户端,是由用户主动发起的。比如翻墙,客户端通过主动访问代理服务器,让代理服务器获得需要的外网数据,然后转发回客户端。 -- 反向代理:发生在服务器端,用户不知道代理的存在。 - -PAC 服务器是用来判断一个请求是否要经过代理。 - -

- -参考: - -- [Comparing Load Balancing Algorithms](http://www.jscape.com/blog/load-balancing-algorithms) -- [负载均衡算法及手段](https://segmentfault.com/a/1190000004492447) -- [Redirection and Load Balancing](http://slideplayer.com/slide/6599069/#) - diff --git a/notes/安全性.md b/notes/安全性.md new file mode 100644 index 00000000..22af60ea --- /dev/null +++ b/notes/安全性.md @@ -0,0 +1,219 @@ + +* [一、跨站脚本攻击](#一跨站脚本攻击) +* [二、跨站请求伪造](#二跨站请求伪造) +* [三、SQL 注入攻击](#三sql-注入攻击) +* [四、拒绝服务攻击](#四拒绝服务攻击) +* [参考资料](#参考资料) + + + +# 一、跨站脚本攻击 + +## 概念 + +跨站脚本攻击(Cross-Site Scripting, XSS),可以将代码注入到用户浏览的网页上,这种代码包括 HTML 和 JavaScript。 + +例如有一个论坛网站,攻击者可以在上面发布以下内容: + +```html + +``` + +之后该内容可能会被渲染成以下形式: + +```html +

+``` + +另一个用户浏览了含有这个内容的页面将会跳转到 domain.com 并携带了当前作用域的 Cookie。如果这个论坛网站通过 Cookie 管理用户登录状态,那么攻击者就可以通过这个 Cookie 登录被攻击者的账号了。 + +## 危害 + +- 窃取用户的 Cookie 值 +- 伪造虚假的输入表单骗取个人信息 +- 显示伪造的文章或者图片 + +## 防范手段 + +### 1. 设置 Cookie 为 HttpOnly + +设置了 HttpOnly 的 Cookie 可以防止 JavaScript 脚本调用,就无法通过 document.cookie 获取用户 Cookie 信息。 + +### 2. 过滤特殊字符 + +例如将 `<` 转义为 `<`,将 `>` 转义为 `>`,从而避免 HTML 和 Jascript 代码的运行。 + +## 富文本编辑器 + +富文本编辑器允许用户输入 HTML 代码,就不能简单地将 `<` 等字符进行过滤了,极大地提高了 XSS 攻击的可能性。 + +富文本编辑器通常采用 XSS filter 来防范 XSS 攻击,可以定义一些标签白名单或者黑名单,从而不允许有攻击性的 HTML 代码的输入。 + +以下例子中,form 和 script 等标签都被转义,而 h 和 p 等标签将会保留。 + +> [XSS 过滤在线测试](http://jsxss.com/zh/try.html) + +```html +

XSS Demo

+ +

+Sanitize untrusted HTML (to prevent XSS) with a configuration specified by a Whitelist. +

+ +
+ + +
+ +
hello
+ +

+ http +

+ +

Features:

+
    +
  • Specifies HTML tags and their attributes allowed with whitelist
  • +
  • Handle any tags or attributes using custom function
  • +
+ + +``` + +```html +

XSS Demo

+ +

+Sanitize untrusted HTML (to prevent XSS) with a configuration specified by a Whitelist. +

+ +<form> + <input type="text" name="q" value="test"> + <button id="submit">Submit</button> +</form> + +
hello
+ +

+ http +

+ +

Features:

+
    +
  • Specifies HTML tags and their attributes allowed with whitelist
  • +
  • Handle any tags or attributes using custom function
  • +
+ +<script type="text/javascript"> +alert(/xss/); +</script> +``` + +# 二、跨站请求伪造 + +## 概念 + +跨站请求伪造(Cross-site request forgery,CSRF),是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并执行一些操作(如发邮件,发消息,甚至财产操作如转账和购买商品)。由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去执行。 + +XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用户浏览器的信任。 + +假如一家银行用以执行转账操作的 URL 地址如下: + +``` +http://www.examplebank.com/withdraw?account=AccoutName&amount=1000&for=PayeeName。 +``` + +那么,一个恶意攻击者可以在另一个网站上放置如下代码: + +``` +。 +``` + +如果有账户名为 Alice 的用户访问了恶意站点,而她之前刚访问过银行不久,登录信息尚未过期,那么她就会损失 1000 资金。 + +这种恶意的网址可以有很多种形式,藏身于网页中的许多地方。此外,攻击者也不需要控制放置恶意网址的网站。例如他可以将这种地址藏在论坛,博客等任何用户生成内容的网站中。这意味着如果服务器端没有合适的防御措施的话,用户即使访问熟悉的可信网站也有受攻击的危险。 + +透过例子能够看出,攻击者并不能通过 CSRF 攻击来直接获取用户的账户控制权,也不能直接窃取用户的任何信息。他们能做到的,是欺骗用户浏览器,让其以用户的名义执行操作。 + +## 防范手段 + +### 1. 检查 Referer 首部字段 + +Referer 首部字段位于 HTTP 报文中,用于标识请求来源的地址。检查这个首部字段并要求请求来源的地址在同一个域名下,可以极大的防止 XSRF 攻击。 + +这种办法简单易行,工作量低,仅需要在关键访问处增加一步校验。但这种办法也有其局限性,因其完全依赖浏览器发送正确的 Referer 字段。虽然 HTTP 协议对此字段的内容有明确的规定,但并无法保证来访的浏览器的具体实现,亦无法保证浏览器没有安全漏洞影响到此字段。并且也存在攻击者攻击某些浏览器,篡改其 Referer 字段的可能。 + +### 2. 添加校验 Token + +在访问敏感数据请求时,要求用户浏览器提供不保存在 Cookie 中,并且攻击者无法伪造的数据作为校验。例如服务器生成随机数并附加在表单中,并要求客户端传回这个随机数。 + +### 3. 输入验证码 + +因为 CSRF 攻击是在用户无意识的情况下发生的,所以要求用户输入验证码可以让用户知道自己正在做的操作。 + +也可以要求用户输入验证码来进行校验。 + +# 三、SQL 注入攻击 + +## 概念 + +服务器上的数据库运行非法的 SQL 语句,主要通过拼接来完成。 + +## 攻击原理 + +例如一个网站登录验证的 SQL 查询代码为: + +```sql +strSQL = "SELECT * FROM users WHERE (name = '" + userName + "') and (pw = '"+ passWord +"');" +``` + +如果填入以下内容: + +```sql +userName = "1' OR '1'='1"; +passWord = "1' OR '1'='1"; +``` + +那么 SQL 查询字符串为: + +```sql +strSQL = "SELECT * FROM users WHERE (name = '1' OR '1'='1') and (pw = '1' OR '1'='1');" +``` + +此时无需验证通过就能执行以下查询: + +```sql +strSQL = "SELECT * FROM users;" +``` + +## 防范手段 + +### 1. 使用参数化查询 + +Java 中的 PreparedStatement 是预先编译的 SQL 语句,可以传入适当参数并且多次执行。由于没有拼接的过程,因此可以防止 SQL 注入的发生。 + +```java +PreparedStatement stmt = connection.prepareStatement("SELECT * FROM users WHERE userid=? AND password=?"); +stmt.setString(1, userid); +stmt.setString(2, password); +ResultSet rs = stmt.executeQuery(); +``` + +### 2. 单引号转换 + +将传入的参数中的单引号转换为连续两个单引号,PHP 中的 Magic quote 可以完成这个功能。 + +# 四、拒绝服务攻击 + +拒绝服务攻击(denial-of-service attack,DoS),亦称洪水攻击,其目的在于使目标电脑的网络或系统资源耗尽,使服务暂时中断或停止,导致其正常用户无法访问。 + +分布式拒绝服务攻击(distributed denial-of-service attack,DDoS),指攻击者使用网络上两个或以上被攻陷的电脑作为“僵尸”向特定的目标发动“拒绝服务”式攻击。 + +# 参考资料 + +- [维基百科:跨站脚本](https://zh.wikipedia.org/wiki/%E8%B7%A8%E7%B6%B2%E7%AB%99%E6%8C%87%E4%BB%A4%E7%A2%BC) +- [维基百科:SQL 注入攻击](https://zh.wikipedia.org/wiki/SQL%E8%B3%87%E6%96%99%E9%9A%B1%E7%A2%BC%E6%94%BB%E6%93%8A) +- [维基百科:跨站点请求伪造](https://zh.wikipedia.org/wiki/%E8%B7%A8%E7%AB%99%E8%AF%B7%E6%B1%82%E4%BC%AA%E9%80%A0) +- [维基百科:拒绝服务攻击](https://zh.wikipedia.org/wiki/%E9%98%BB%E6%96%B7%E6%9C%8D%E5%8B%99%E6%94%BB%E6%93%8A) diff --git a/notes/消息队列.md b/notes/消息队列.md new file mode 100644 index 00000000..795e814b --- /dev/null +++ b/notes/消息队列.md @@ -0,0 +1,80 @@ + +* [一、消息模型](#一消息模型) + * [点对点](#点对点) + * [发布/订阅](#发布订阅) +* [二、使用场景](#二使用场景) + * [异步处理](#异步处理) + * [流量削锋](#流量削锋) + * [应用解耦](#应用解耦) +* [三、可靠性](#三可靠性) +* [发送端的可靠性](#发送端的可靠性) +* [接收端的可靠性](#接收端的可靠性) + + + +# 一、消息模型 + +## 点对点 + +消息生产者向消息队列中发送了一个消息之后,只能被一个消费者消费一次。 + +

+ +## 发布/订阅 + +消息生产者向频道发送一个消息之后,多个消费者可以从该频道订阅到这条消息并消费。 + +

+ +发布与订阅模式和观察者模式有以下不同: + +- 观察者模式中,观察者和主题都知道对方的存在;而在发布与订阅模式中,发布者与订阅者不知道对方的存在,它们之间通过频道进行通信。 +- 观察者模式是同步的,当事件触发时,主题会去调用观察者的方法,然后等待方法返回;而发布与订阅模式是异步的,发布者向频道发送一个消息之后,就不需要关心订阅者何时去订阅这个消息。 + +

+ +参考: + +- [Observer vs Pub-Sub](http://developers-club.com/posts/270339/) +- [消息队列中点对点与发布订阅区别](https://blog.csdn.net/lizhitao/article/details/47723105) + +# 二、使用场景 + +## 异步处理 + +发送者将消息发送给消息队列之后,不需要同步等待消息接收者处理完毕,而是立即返回进行其它操作。消息接收者从消息队列中订阅消息之后异步处理。 + +例如在注册流程中通常需要发送验证邮件来确保注册用户的身份合法,可以使用消息队列使发送验证邮件的操作异步处理,用户在填写完注册信息之后就可以完成注册,而将发送验证邮件这一消息发送到消息队列中。 + +只有在业务流程允许异步处理的情况下才能这么做,例如上面的注册流程中,如果要求用户对验证邮件进行点击之后才能完成操作的话,就不能再使用消息队列。 + +## 流量削锋 + +在高并发的场景下,如果短时间有大量的请求会压垮服务器。 + +可以将请求发送到消息队列中,服务器按照其处理能力从消息队列中订阅消息进行处理。 + +## 应用解耦 + +如果模块之间不直接进行调用,模块之间耦合度很低,那么修改一个模块或者新增一个模块对其它模块的影响会很小,从而实现可扩展性。 + +通过使用消息队列,一个模块只需要向消息队列中发送消息,其它模块可以选择性地从消息队列中订阅消息从而完成调用。 + +# 三、可靠性 + +# 发送端的可靠性 + +发送端完成操作后一定能将消息成功发送到消息队列中。 + +实现方法: + +- 在本地数据库建一张消息表,将消息数据与业务数据保存在同一数据库实例里,这样就可以利用本地数据库的事务机制。事务提交成功后,将消息表中的消息转移到消息队列中,若转移消息成功则删除消息表中的数据,否则继续重传。 + +# 接收端的可靠性 + +接收端能够从消息中间件成功消费一次消息。 + +实现方法: + +- 保证接收端处理消息的业务逻辑具有幂等性:只要具有幂等性,那么消费多少次消息,最后处理的结果都是一样的。 +- 保证消息具有唯一编号,并使用一张日志表来记录已经消费的消息编号。 diff --git a/notes/集群.md b/notes/集群.md new file mode 100644 index 00000000..b36a0bfe --- /dev/null +++ b/notes/集群.md @@ -0,0 +1,194 @@ + +* [一、负载均衡](#一负载均衡) + * [算法实现](#算法实现) + * [转发实现](#转发实现) +* [二、集群下的 Session 管理](#二集群下的-session-管理) + * [Sticky Sessions](#sticky-sessions) + * [Session Replication](#session-replication) + * [Session Server](#session-server) + + + +# 一、负载均衡 + +集群中的应用服务器通常被设计成无状态,用户可以请求任何一个节点(应用服务器)。 + +负载均衡器会根据集群中每个节点的负载情况,将用户请求转发到合适的节点上。 + +负载均衡器可以用来实现高可用以及伸缩性: + +- 高可用:当某个节点故障时,负载均衡器不会将用户请求转发到该节点上,从而保证所有服务持续可用; +- 伸缩性:可以很容易地添加移除节点。 + +负载均衡运行过程包含两个部分: + +1. 根据负载均衡算法得到应该将请求转发到哪个节点上; +2. 将请求进行转发; + +## 算法实现 + +### 1. 轮询(Round Robin) + +轮询算法把每个请求轮流发送到每个服务器上。下图中,一共有 6 个客户端产生了 6 个请求,这 6 个请求按 (1, 2, 3, 4, 5, 6) 的顺序发送。最后,(1, 3, 5) 的请求会被发送到服务器 1,(2, 4, 6) 的请求会被发送到服务器 2。 + +

+ +该算法比较适合每个服务器的性能差不多的场景,如果有性能存在差异的情况下,那么性能较差的服务器可能无法承担过大的负载(下图的 Server 2)。 + +

+ +### 2. 加权轮询(Weighted Round Robbin) + +加权轮询是在轮询的基础上,根据服务器的性能差异,为服务器赋予一定的权值,性能高的服务器分配更高的权值。例如下图中,服务器 1 被赋予的权值为 5,服务器 2 被赋予的权值为 1,那么 (1, 2, 3, 4, 5) 请求会被发送到服务器 1,(6) 请求会被发送到服务器 2。 + +

+ +### 3. 最少连接(least Connections) + +由于每个请求的连接时间不一样,使用轮询或者加权轮询算法的话,可能会让一台服务器当前连接数过大,而另一台服务器的连接过小,造成负载不均衡。例如下图中,(1, 3, 5) 请求会被发送到服务器 1,但是 (1, 3) 很快就断开连接,此时只有 (5) 请求连接服务器 1;(2, 4, 6) 请求被发送到服务器 2,只有 (2) 的连接断开。该系统继续运行时,服务器 2 会承担过大的负载。 + +

+ +最少连接算法就是将请求发送给当前最少连接数的服务器上。例如下图中,服务器 1 当前连接数最小,那么新到来的请求 6 就会被发送到服务器 1 上。 + +

+ +### 4. 加权最少连接(Weighted Least Connection) + +在最少连接的基础上,根据服务器的性能为每台服务器分配权重,再根据权重计算出每台服务器能处理的连接数。 + +

+ +### 5. 随机算法(Random) + +把请求随机发送到服务器上。和轮询算法类似,该算法比较适合服务器性能差不多的场景。 + +

+ +### 6. 源地址哈希法 (IP Hash) + +源地址哈希通过对客户端 IP 计算哈希值之后,再对服务器数量进行取模运算得到目标服务器的序号。可以保证同一 IP 的客户端的请求会转发到同一台服务器上,可以用来实现会话粘滞(Sticky Session) + +

+ +## 转发实现 + +### 1. HTTP 重定向 + +HTTP 重定向负载均衡服务器使用某种负载均衡算法计算得到服务器的 IP 地址之后,将该地址写入 HTTP 重定向报文中,状态码为 302。客户端收到重定向报文之后,需要重新向服务器发起请求。 + +缺点: + +- 需要两次请求,因此访问延迟比较高; +- HTTP 负载均衡器处理能力有限,会限制集群的规模。 + +该负载均衡转发的缺点比较明显,实际场景中很少使用它。 + +

+ +### 2. DNS 域名解析 + +在 DNS 解析域名的同时使用负载均衡算法计算服务器地址。 + +优点: + +- DNS 能够根据地理位置进行域名解析,返回离用户最近的服务器 IP 地址。 + +缺点: + +- 由于 DNS 具有多级结构,每一级的域名记录都可能被缓存,当下线一台服务器需要修改 DNS 记录时,需要过很长一段时间才能生效; + +大型网站基本使用了 DNS 做为第一级负载均衡手段,然后在内部使用其它方式做第二级负载均衡。也就是说,域名解析的结果为内部的负载均衡服务器 IP 地址。 + +

+ +### 3. 反向代理服务器 + +首先了解一下正向代理与反向代理的区别: + +- 正向代理:发生在客户端,是由用户主动发起的。比如翻墙,客户端通过主动访问代理服务器,让代理服务器获得需要的外网数据,然后转发回客户端; +- 反向代理:发生在服务器端,用户不知道代理的存在。 + +反向代理服务器位于源服务器前面,用户的请求需要先经过反向代理服务器才能到达源服务器。反向代理可以用来进行缓存、日志记录等,同时也可以用来做为负载均衡服务器。 + +在这种负载均衡转发方式下,客户端不直接请求源服务器,因此源服务器不需要外部 IP 地址,而反向代理需要配置内部和外部两套 IP 地址。 + +优点: + +- 与其它功能集成在一起,部署简单。 + +缺点: + +- 所有请求和响应都需要经过反向代理服务器,它可能会成为性能瓶颈。 + +### 4. 网络层 + +负载均衡服务器在操作系统内核进程获取网络数据包,根据负载均衡算法计算源服务器的 IP 地址,并修改请求数据包的目的 IP 地址,最后进行转发。 + +源服务器返回的响应也需要经过负载均衡服务器,通常是让负载均衡服务器同时作为集群的网关服务器来实现。 + +优点: + +- 在内核进程中进行处理,性能比较高。 + +缺点: + +- 和反向代理一样,所有的请求和相应都经过负载均衡服务器,会成为性能瓶颈。 + +### 5. 链路层 + +在链路层根据负载均衡算法计算源服务器的 MAC 地址,并修改请求数据包的目的 MAC 地址,并进行转发。 + +通过配置源服务器的虚拟 IP 地址和负载均衡服务器的 IP 地址一致,从而不需要需要 IP 地址就可以进行转发。也正因为 IP 地址一样,所以源服务器的响应不需要转发回负载均衡服务器,直接转发给客户端,避免了负载均衡服务器的成为瓶颈。这是一种三角传输模式,被称为直接路由,对于提供下载和视频服务的网站来说,直接路由避免了大量的网络传输数据经过负载均衡服务器。 + +这是目前大型网站使用最广负载均衡转发方式,在 Linux 平台可以使用 LVS(Linux Virtual Server)。 + +参考: + +- [Comparing Load Balancing Algorithms](http://www.jscape.com/blog/load-balancing-algorithms) +- [Redirection and Load Balancing](http://slideplayer.com/slide/6599069/#) + +# 二、集群下的 Session 管理 + +一个用户的 Session 信息如果存储在一个服务器上,那么当负载均衡器把用户的下一个请求转发到另一个服务器,由于服务器没有用户的 Session 信息,那么该用户就需要重新进行登录等操作。 + +## Sticky Sessions + +需要配置负载均衡器,使得一个用户的所有请求都路由到同一个服务器,这样就可以把用户的 Session 存放在该服务器中。 + +缺点: + +- 当服务器宕机时,将丢失该服务器上的所有 Session。 + +

+ +## Session Replication + +在服务器之间进行 Session 同步操作,每个服务器都有所有用户的 Session 信息,因此用户可以向任何一个服务器进行请求。 + +缺点: + +- 占用过多内存; +- 同步过程占用网络带宽以及服务器处理器时间。 + + +

+ +## Session Server + +使用一个单独的服务器存储 Session 数据,可以使用 MySQL,也使用 Redis 或者 Memcached 这种内存型数据库。 + +优点: + +- 为了使得大型网站具有伸缩性,集群中的应用服务器通常需要保持无状态,那么应用服务器不能存储用户的会话信息。Session Server 将用户的会话信息单独进行存储,从而保证了应用服务器的无状态。 + +缺点: + +- 需要去实现存取 Session 的代码。 + +

+ +参考: + +- [Session Management using Spring Session with JDBC DataStore](https://sivalabs.in/2018/02/session-management-using-spring-session-jdbc-datastore/) + diff --git a/pics/09b52bcb-88ba-4e36-8244-b375f16ad116.jpg b/pics/09b52bcb-88ba-4e36-8244-b375f16ad116.jpg new file mode 100644 index 0000000000000000000000000000000000000000..146336aabd5e6aba1cad0a16f70ab046721f7482 GIT binary patch literal 33792 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 Yg#Xk1_&2#By!|&Z{kd!Z-`<)27h*9u2LJ#7 literal 0 HcmV?d00001 diff --git a/pics/76a25fc8-a579-4d7c-974b-7640b57fbf39.jpg b/pics/76a25fc8-a579-4d7c-974b-7640b57fbf39.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fd13a137135f190ce2723f7ae9004484f63b4853 GIT binary patch literal 61440 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 ViX#2=pSC32)+E2bNB>X#|6iOf9Af|g literal 0 HcmV?d00001 diff --git a/pics/c5f611f0-fd5c-4158-9003-278141136e6e.jpg b/pics/c5f611f0-fd5c-4158-9003-278141136e6e.jpg new file mode 100644 index 0000000000000000000000000000000000000000..473091be59c26f4300fa2b7240b9ac41ffd54934 GIT binary patch literal 61440 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 Date: Sat, 28 Jul 2018 01:08:20 +0800 Subject: [PATCH 10/87] auto commit --- notes/消息队列.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/notes/消息队列.md b/notes/消息队列.md index 795e814b..e28fcd3f 100644 --- a/notes/消息队列.md +++ b/notes/消息队列.md @@ -7,8 +7,8 @@ * [流量削锋](#流量削锋) * [应用解耦](#应用解耦) * [三、可靠性](#三可靠性) -* [发送端的可靠性](#发送端的可靠性) -* [接收端的可靠性](#接收端的可靠性) + * [发送端的可靠性](#发送端的可靠性) + * [接收端的可靠性](#接收端的可靠性) @@ -62,7 +62,7 @@ # 三、可靠性 -# 发送端的可靠性 +## 发送端的可靠性 发送端完成操作后一定能将消息成功发送到消息队列中。 @@ -70,7 +70,7 @@ - 在本地数据库建一张消息表,将消息数据与业务数据保存在同一数据库实例里,这样就可以利用本地数据库的事务机制。事务提交成功后,将消息表中的消息转移到消息队列中,若转移消息成功则删除消息表中的数据,否则继续重传。 -# 接收端的可靠性 +## 接收端的可靠性 接收端能够从消息中间件成功消费一次消息。 From ca34d61172257f2ebafac0254cc97ec639612c97 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Sat, 28 Jul 2018 09:05:02 +0800 Subject: [PATCH 11/87] auto commit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f777d200..63067ac8 100644 --- a/README.md +++ b/README.md @@ -109,7 +109,7 @@ Leetcode 上数据库题目的解题记录。 分布式锁、分布式事务、CAP、BASE、Paxos、Raft -> [集群](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/分布式问题分析.md) +> [集群](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/集群.md) 负载均衡、Session 管理 From 041457d8f93cfcf4b3570a26ca3e2c190acc4b2d Mon Sep 17 00:00:00 2001 From: kenny <411316753@qq.com> Date: Sat, 28 Jul 2018 11:46:38 +0800 Subject: [PATCH 12/87] Update Linux.md --- notes/Linux.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notes/Linux.md b/notes/Linux.md index 705b9b0d..6325e86e 100644 --- a/notes/Linux.md +++ b/notes/Linux.md @@ -903,7 +903,7 @@ declare -x HOME="/home/dmtsai" declare -x HOSTNAME="study.centos.vbird" .....(其他省略)..... -$ export | cut -c 12 +$ export | cut -c 12- ``` ## 排序指令 From 6d8cef8cd1d2ed8ea9327d1c0cddfe05b8e8eb2f Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Sun, 29 Jul 2018 11:24:25 +0800 Subject: [PATCH 13/87] auto commit --- notes/Linux.md | 2 +- notes/剑指 offer 题解.md | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/notes/Linux.md b/notes/Linux.md index 705b9b0d..6325e86e 100644 --- a/notes/Linux.md +++ b/notes/Linux.md @@ -903,7 +903,7 @@ declare -x HOME="/home/dmtsai" declare -x HOSTNAME="study.centos.vbird" .....(其他省略)..... -$ export | cut -c 12 +$ export | cut -c 12- ``` ## 排序指令 diff --git a/notes/剑指 offer 题解.md b/notes/剑指 offer 题解.md index e1655922..05d43578 100644 --- a/notes/剑指 offer 题解.md +++ b/notes/剑指 offer 题解.md @@ -898,7 +898,7 @@ public double Power(double base, int exponent) { ## 题目描述 -输入数字 n,按顺序打印出从 1 最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数即 999。 +输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数即 999。 ## 解题思路 @@ -911,16 +911,16 @@ public void print1ToMaxOfNDigits(int n) { if (n <= 0) return; char[] number = new char[n]; - print1ToMaxOfNDigits(number, -1); + print1ToMaxOfNDigits(number, 0); } private void print1ToMaxOfNDigits(char[] number, int digit) { - if (digit == number.length - 1) { + if (digit == number.length) { printNumber(number); return; } for (int i = 0; i < 10; i++) { - number[digit + 1] = (char) (i + '0'); + number[digit] = (char) (i + '0'); print1ToMaxOfNDigits(number, digit + 1); } } @@ -1050,13 +1050,13 @@ public boolean match(char[] str, char[] pattern) { ```html [] : 字符集合 -() : 分组,在这里是为了让表达式更清晰 +() : 分组 ? : 重复 0 ~ 1 + : 重复 1 ~ n * : 重复 0 ~ n . : 任意字符 \\. : 转义后的 . -\\d : 任意数字 +\\d : 数字 ``` ```java From 65a50dbc7edfae216060432242280f66e39e05a7 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Sun, 29 Jul 2018 12:38:35 +0800 Subject: [PATCH 14/87] auto commit --- notes/剑指 offer 题解.md | 2 +- pics/f94389e9-55b1-4f49-9d37-00ed05900ae0.png | Bin 0 -> 12288 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 pics/f94389e9-55b1-4f49-9d37-00ed05900ae0.png diff --git a/notes/剑指 offer 题解.md b/notes/剑指 offer 题解.md index 05d43578..9cf7dc2a 100644 --- a/notes/剑指 offer 题解.md +++ b/notes/剑指 offer 题解.md @@ -170,7 +170,7 @@ Given target = 20, return false. 当前元素的查找区间为左下角的所有元素,例如元素 12 的查找区间如下: -

+

复杂度:O(M + N) + O(1) diff --git a/pics/f94389e9-55b1-4f49-9d37-00ed05900ae0.png b/pics/f94389e9-55b1-4f49-9d37-00ed05900ae0.png new file mode 100644 index 0000000000000000000000000000000000000000..4981769799bd772cfc25fc4a65b926e022683920 GIT binary patch literal 12288 zcmeI2XH-*Nx9<@Y6a*|F2vRJ7fPjS}p;x7MctR*Dolu1UhNdE*(xrEi5&{WGAoOCR zcYzHg6alHBNC_>Jvw7Y#-gCydcieC1y!VcKKJ1;9jGdLach;KoH~(|K)7O2(NY6n} zMMcG^@mST6is}>`JZ_z(1wUDQeBmqja>~o_kup_D&$UJH&1nZE9VIHNvKWSgr)R+T z=R6)my{M=zd7m7oChU3qsHpB>HB^<1{j63ptsh^5HLl5|e#u~n53d=%DKVDe)xCUP z6~_aS$G?az`%2d^cQ@@##@2P|877J@GUL}3gBz=g9#Z}xnos;^&ZzO%ghgAZoKInY zEVJ5K@a`N(B(EyJayTy?Prw3rw0&P2%r+UfgB=bR4dIc2O@E&9J{eVX{FO=ZKHV4-caO)pH{kX ziW++J?CY}^{tLe13q3wu3q} z=D&t0Xg2K+mAVY0y`7z%Q^*+_P}`NwJu0e?pU}6V$Kbc)=&>6WGe_fVK@Ko0v_%8b zgaA2SaStx$soHMx0cXU+hx4$T3P1d zxekX?LsbA}y8n&~R}{A$%ghX_cyjnE-t#415GEx+u)UNRd(Bv>7SA#S6HZH z)?QX&cAm-Qu^?U2;|D*L5RV+wMLa|U>@q*L+aqAfpO&u1^7%&$e%}`0)D2{g#orvw z9jX)AZ@-g^iTBD}9=Q(BF3noSmdDhvXW=INrIbb9dj`B9?aas`Xd@BLNr=~T?f@sT zgAY!wlkNm(iAAV)@RNGaA)lERMcd+z*z+&c#YzYn0ec@lE|{#8Xy)|go`%i2`L#pt z5jDumGCgKZ?THnG5^oX_&lA;q;NnuCP*Ms1v3MEkAXeOjqm`ZI(`WTZgmCj}yN5zEM(dwIX)K_Asw1ezoCo z-m1`>M6wGrBD%-uo9u;hr6dzTOZ?+nCzZ%*p@L(Bh;eaM2WydBX^?<|wEsaY-Y8B3 zsB`Yr;#A#W?z;rn>9|e$y^OG-bjKG}?zLD#9r%+m%<9Hap2zagVB6t(g~v)*nJr_v zGwFlJ$9A<%b&bLOWhM982ExUtxm z7#D-9)F&7FSB$u8_dm#%Xw!c7e*BfR_*q7%3~QVDWcd4JymVFNd9n+m?aC{+*ujzJ zuW0{8-=aYy+ve1s`=ITLz`ne3J%(9s;kPy~+1mlK`uOj1i$DT)L8tbE0Vn#XW58i0>Q5rx z_nQg8&0uSJ>c82S{U6<^iG?xwF#c!7=K}BUO#L7qN z&A12q?oC-wTG@B|3IiBaqR?xEETy!{y^MhbHGq>OP9VmWY%UE9dblREOfC~j*DlH0 zHAs%@m@HM+W{oD30tlZL%am$8Rx27yD&0*`oQuk9=jA3pLz`50J0ME&-Ak3CYEJ1Q zW!>91#u=)N4h3zR62wBh1OJ?B(8E0s2bX=@H$S?}C&bO6)3^Kj9>0R9q;VXT&N+Ua z^K$!Q2FQp9MREC>3K;|L1%>!Du3RCfh8{g(7anRBcz)iO)7YLL_F- zC5S^1Gku_^?xEG-+FZn-?~r!jJ%^yK-FAr5rW7d(bnS>|CGkt6N4p8;^pa-;cljuy z30F8?RJ8)K0lXwbKM5tq{Yq-@nW-bwt&M5brPpp8GXvk|gh{MRGPzvVDJ@(s_Y$eC zq3(va99=qty`rbHf7&s`Kiz;+46s20B%rsNjv0!Ij(93YvaIEi{B4Zzd=@Nh?&=yd zd7eF6A@}H|z#TijZ)!lh35T@%(Qct_JbCUGet~p*@VW21580#7C5U3Q=idouiZ^|~ z!hJs$ajt7(okT<*`ZQOL)w^ya~muh0HpUHqpxaNG@?_ib~>994SRUfJ88X2J8M@%H^gP zYMC@+;a|Rkv*Hl%NSsi^!4(7w2;_}&m139nDQYNN6v2GA)?lr?3kloxd7riwI5oia z#RL$ejpF&_5eY1JNP{k-mo~~3uWK+?aInX$&ak1H#N&bT)B`-1o=rLp)wppSy~qrM zMFkVH*2L5WKa!0c_N>GU{G)nhJW-1Um@1yD&&hkbhLl)>Vf3TOU}A^4Yaj)WV0~Y2 zA925&HQ#4t^XMXC^cBu(w@hc!bRZ_3C0JIKtt)6h?d42}#@;U>(jc=( zN{fPR(pukwosEJrv(NpGv9EH_QvFFDTBqGqK>$03>xlq#o&`*7;<8q9diq~zrqG0x zdbNYGdq1ec$U8y=a=|O}f?PYWXsOBzXG=K*7WmP%?I?1)5il^xK3R5bkxTd{Nf%GO z_!U?ZX4y;a?K;~S2u4zden&ZYV0k%dnf)@%``EPHv&ul~aXHgg=N0PGQ!Of;$iOgB z$H}PD)ElKP9T9IPsdCdYaFQ@UDQ(Oaywk%sh>Np-p}Diyn~9 z;&ivs#@bRLs;NAIPts{i*y}DjyMVbuJ~O-&BjK~KH*%yTMH5PGt=I3x)ar603?t>V zdxJB;yO7u=gPX{04w@NRS|j*AzvWPh+LnNuX?@g2D{lpkjJEMqgOS7n&kWLr7FM+|xGd*_CV4 z+Q2CR)Gt92o^6gRe%!lTkbbDFc7E&TiW4;WFI1bIWKzz=t8rfsNG{42%fEhGm7d5m ziAHwH!b4wAK3bgM!!F;6s<+{JsLD%HDc9;^l=J;(S@G9WseICom;I+M@a- z`PsQHT6(9^Jn?dP5WKeoDW@(qLUZ3_e((zZJ57&OJU;37{^j@Hg993YO)N!nlPdA0 zc)eS<2?ZjZ5@(@);OtLphK$@p>asRc&&8fIg9a1wXDzBK^e9nlxu0xZbsgZHKM!-C zZqHNDV)kaMcdQcdWT)24$tcIK8^2<|QcI2MY$ioSHvT}vs@ZCvH!y(Qp5#LMh9p*VDY(BF+(-KfI1&O+MEY8*C%AJy= zhp!&vCMZr{7H*vDjlW!a4rJkP_d8a;VXewM;7}BIdGGy!S(Oa8g_uvm-ZN#CfgL}e zkd!qQC-#m3#&3)F0>I}ZN7HfWrYP2qBp;tfo30yBZr1%gtwug_4u#BTyvV(5Ye~Jn zE{uMGmn|rq4Y8Jbyf1fwu3*&_qi=nga%$#ob)iAeDRmOn27xGDo5Or}zpb=V2%GK2 z(Ax$nQ?|TDXC^m<3zAZHz(40x?T>LuP3k3zPxe|-56PmPiK&W!TJFT9@}QancJ^|muB$r*$Soc@F4;@0Mqz*81 zqH~ABula@7Y!?mQum3*Ai4*;esBsd~1Jo;nYaeAM|NJ0-)e+UxuSTe>5AA)Y2(VHG zL;XXZw-JQ@#N(?#hZ}PSS3-4?;9WU6IsR)$B>Gr#XR?@4qTkkn0s3wXtkOo|`K`bc z7Amtu87gIVn$2?%Jb7e%BB8yh2_^s)l|I@y0aJQFVMKrS2^j$y2D@UGhxLL>y|sLi zzahqUBw{ije6*RJ|81F8I_ThGdDa7^Y>7vG4pH)OsA9GRE&IP7W&Xngtr^QmH*5IK z;Ha|kqJb#y9N(}k_Yn-~hFu(@rHoRfXY?I!z!6*yZ)#)!v4$J%m4&lPUo8+qz$|;0 zJB>UZ3V_++HtDt+bgan8>mFpA5fGWc0ny{VjU<}ZRfa+~iENvB5mG4K)Rt%Q zji1pn9_CMv=V0^owhdP}KhgSR&3}+6_4+0UUF-k3qhvTTY1(++@UzCOmT8lGsQGG1 z5qw4O*&HO(HhVp@NJ{?l-6i$hqd8f=k=k%ZTT6PLXM;J}U+D2i)lP!MoOu#Q~Em@=c({%Q}#k5EpP*yr#-Iww(0^sg8gTu}l zMuZm@iRE_PI~g920F5+e&fv{`OrYRsyYWR{Xfa#UG0w$g6#vCb-d2Fm?tEu+1MmwftRs z=AvIK9N4l)zI4$w)SonKLt2C4j-`3DjzO#ROj6$@XH|ox4~-QrI)?LDVx1sEz#f6V?^+%M zV%evLUr}f3T-xlQL-E%pyYZAmy4~^f_$A5*8!oyji7zR7Kz;AKlk8Ow66sobfd9i3 zHFP~UU3F2mahwF>y@e-tB_x-0~`)QFp`Iiw<`)$W;80+|X z%-JBE?oQ`ELXgYC;RWs{UJP2NdF{so++2Wef(r2N(RIn)5tWEKm#10F4bh*K+OL4b z!@zvCZNG21Z+E!GIREA7r$2%$yU6G(F2lauR=BJNJBvsN;wgt!#nxyr;nTW1$7oxy z)cEn|<8rqzUN1dwO8&4{XMezr@zv?<{W(AsxBVco=JmP?bJ;6XyOvCGc>TL=qVA$| zzr*X>EXd!3Kjhj7o=I$|+r|#d;l}`da>)fZT;q(xq^F{*;3zh}@w1pVfw2+7Uua?RhZ~SI%kjpWsT2|N2O_Ww{wonxqcrz5V{fc0tGXsqG-_9$L=eu~ zuF%hQQORTPSm6L}8K7wf5PVNeAjz&s0cd@w1D`}FHoIV@gR4atHy5Z|ElL^(GmhR` zA6-k-!lO!AhfCtYeR6h36kR;xEhx>FRF@#ruDZ z&tkc?^ApS+x<$tw^knS(&AS8E8B6JIRkxe_Lmm`z)hTlg_~cR+H#lR)voC%#0?HNG z%Q@3py7pR4B~$wn?l5ag$2iz_?`3%C0Ci3V*~@PYryszw9yl2YM_n|3j#A2`2i;&& z>M1Gi)h5507`o9es!;RR6;YS@DFJvVbDSg>3EI+j-2Kvk?(6blvhFv$oolp;vGr(h zm2ub%@FyCxmvwoy4H;wFBvpGap}44U^k=|m)>ET>>Y_r1jGw+Brt#tKPJE?JHD;=} z)Ak=_&Q9g!khOD_b<56T&1tydJ()pBW8#?YBj%Vi6=!b$r-BxC|pu{H@n(SS6=~ z;WVzMs+0J+!81@qZL0EQcRzLO4kS6Z7jop6pp13W$S#B%#mK08cEWc3eu+Ri|9~MZ z7V*5~0aP%iQn#w11qgCNm3G%HI(hI`PBNM$vEn#_SnJ9x;*()MfVlyi*2=zl1>N3FUznN z0+Yx{x4|;{QhA+MVd@*hDaURFjUy$8^O`S{F~iSP2K8O9srW$Me}XA?aDaShAp3%B_Dv%|`CHJ7xB?2`od!?7Zg?<4>1w`>8*t zu9HIB@9uTan6~qiLUZhGxX8N&Qg`gu=0;+YmBHvwkv9^uu(kBabiip1G-&@(3oN1|FE@;Y>Poc~ToLA?Je0$poHo;MJ_p4R24=HA5q5gC~7Ah-cZE-{&622k6~ zxSmU9c85;k_N}#oU(DG}hL)$heNGi&<_3 zhfa_skTuo~UJw5&8P_ER&re6*oPKTsGy^Ya3-S)wO7%a!?PYzRjuS2E@%rNvW=`&< zb?FT^{NEA}0FWn0Z$-)b#n+ z;-mJwQ`7n$JiJL{&_fR>3Lwvz+968P!-B0)Q>HVMm24#d(#`eOv2-1eAnRsQjaxz% zF_G;ZXiH_!&iZwAuC%<0I+WQbGL#KE57n5ol(em5()_{&E&bWRkIk;l`~(9PZsUt2 zVmJS{pwuIVIoAe3E+T`zj7HR9^}2X@Mn?JuT^1SnTs z6_)F$&vyY@oQzF)VKF8vnn=FR{qOwa$CXjKj;$7fp<$CF7$fQfT6Poq1oF3(d;I-d zH{m+;0wirswAUtwexVJa=9PEUe_)ct*QES-KbD`AIwIF4}!HjuEUL5L++;K^k% z49K&HGSr-jMXZ7~j0A*B0!IbfpD}9d3}@cPP({CMc!3B~3vl7~nad3E#_3iSxy$-g znqWck_Favxn$u1thFSm$rk-5C|=O08vLO{^&#URt9maA?%lKoxNvXnEuuG)cS`8@)h z8H$yNG3qui7Zq#51mPy;OtRg#-(V0vj$63(J%Ws|QvztLU2~4a)Ez&< zmZmQB_LleD+6k>Y_(=4t7%K^F|7$m{eLub0^~F6uHK2U*>fuIZN(`agjOjE-t<%`6 zIzhb-$o%&wJ->=D@mefTW8R!~7Q zd|+{kORwEr?(4uBZEEhWfLG1zIIjb(lle#A5cc179^G`x6^ro8TVwlfu~7&PN$arR zef|buRi_=f&uP<8aL-|~#IczRnjR8*)##5V?ILkQ^9(}NIuq{L8n`@i4}=0k zQz#9UV!ojPt}%cdtPzUm{83VGxR)KgYxYl;sHn8m7}|^Cl*;>mLJEnnjlZFUfMJbT zsze-IFawV6bbIi~!wr+{f-rcl_>ui^(BUOd6M!>a{KzsTZ7I^#F{2Qk+vj`leJ~C> z8GRxS1eG|sbT-zjjwK-uMp+P+Zh2xw17x;p*~hsNGL~14e=&h3o6lcuU2WN0t;EEW^ltyWm}lNR($cOdgNPRWx$RK-+VaENV*4)yeGrlagd&TXY! zDk?8^7miKQ48?4py5}+Vsk!=@WsMJU6Zwm97F1LOzS2!Q zZZoa0cZj2j4&622ydDpYZm7*(6}Xcv zcyZXaL0Us(e-ev&EZcsiXs=#p^N_s1o$yB%syXN~5MSKlYdG2DD5&+5^6r8lVUj`B zap=0W3K06|Z-Ozx78EVXelm2Y(3tOCt&8w7b4}$8Mj^(ozNooD0wq*?Ioia83=Y8! zp8A=0s|!U`9?k- z>V(!>*(N213FAc3J-&-aIx|Q|c3d57ET_M7$ziarQ=Tq*Tm&k{$kFQIFjjF)`VK#!%r>S;F8SB03^cSf zHOG?a$4%X*nhM==r>cBrh3J-i&0Ljy^nZ;x(aU|l9I!8QPR_eP<_jY<*?9h($uENM z6v-zKRE&IWvG^>aAp6;$Z8DXP)=9TNxtE`G!l*f$u4N7F+6p`Z8kf7vf-&-U)V zVgy>05zFvnB<9saSVAiHHl9S`FhB%@i#0!143{CuvDFuK7sf(UC(!6)gQ5V*Lr@^EL-lNvo86WQL3R)QxPZH#$~+B^a@zSdEEOJUHedt!G~n4 zFNm}9dvdfpm;Sy|WyZQ3qStK#1m(@s?>ExFD#myX?k$V>=)wm>okk%3a|2hRg1^(I zZ5~v!(({~%9rfLM^1)u zsX$o5#v_t6rV{L48t6RVt}PoM6mK}KBk4rB2=*xjzS7Z#I%w|+-#Y=J1Vl#d)}dqW z6h?0+HFxRg4mNJu0|qP-gUO~xru7SrW>4*0YYumYynh$=D&Os8a9A31g|eB?pXrW# zL2$?1{EQiRAOmr-$_@`7<>h;%4VBr9eFLUXyK#(#Tz(L&$D0JQI#Ll^V^Z?ALpY?;QG3a7BIV zeF?FfJUZ)4c|X$Kv&dGM))BL=@(CU>L`aI>7rRWsr#>MMy|tE;KwEg2JSn9&GB6?! zc<4zRqxqDlHiv{e%#eKUr@hSHFdrLgB%Cu2KtWqD||&e;z20IYHAc zIYzT3wY4kQi7S2|u83tlxg%o5{iK5FHnt%%mvin(yu1|R*g@+nE3_$7qhW38v)I%{ zEuc=^zcb^e^@s~w=7>I^G`l;av>naTTxNE@`o@XxKNL;0U-GxVSTD)>o8NyCde=YO z=U(*?D%No}T{c@#RRmi<$r$rN_XVd$h77dpIXeks>F) z2ZjBH9(?Occgbb)qv(eGyAr*%1tIEO3;X>ZrM<|Qq()|r*Cx_`06CMvOfSiCE}nVx zW%qGmQLwDqvQb<^v$n%n5w^H( Date: Sun, 29 Jul 2018 14:12:07 +0800 Subject: [PATCH 15/87] auto commit --- notes/剑指 offer 题解.md | 20 ++++++++++++------ pics/27ff9548-edb6-4465-92c8-7e6386e0b185.png | Bin 0 -> 8192 bytes pics/280f7728-594f-4811-a03a-fa8d32c013da.png | Bin 0 -> 7168 bytes pics/2858f8ad-aedb-45a5-a706-e98c96d690fa.jpg | Bin 0 -> 23552 bytes pics/6539b9a4-2b24-4d10-8c94-2eb5aba1e296.png | Bin 0 -> 17408 bytes pics/ea2304ce-268b-4238-9486-4d8f8aea8ca4.png | Bin 0 -> 23552 bytes pics/faecea49-9974-40db-9821-c8636137df61.jpg | Bin 0 -> 18432 bytes 7 files changed, 14 insertions(+), 6 deletions(-) create mode 100644 pics/27ff9548-edb6-4465-92c8-7e6386e0b185.png create mode 100644 pics/280f7728-594f-4811-a03a-fa8d32c013da.png create mode 100644 pics/2858f8ad-aedb-45a5-a706-e98c96d690fa.jpg create mode 100644 pics/6539b9a4-2b24-4d10-8c94-2eb5aba1e296.png create mode 100644 pics/ea2304ce-268b-4238-9486-4d8f8aea8ca4.png create mode 100644 pics/faecea49-9974-40db-9821-c8636137df61.jpg diff --git a/notes/剑指 offer 题解.md b/notes/剑指 offer 题解.md index 9cf7dc2a..e36e7a85 100644 --- a/notes/剑指 offer 题解.md +++ b/notes/剑指 offer 题解.md @@ -1,4 +1,5 @@ +* [1. 前言](#1-前言) * [2. 实现 Singleton](#2-实现-singleton) * [3. 数组中重复的数字](#3-数组中重复的数字) * [4. 二维数组中的查找](#4-二维数组中的查找) @@ -80,6 +81,13 @@ +# 1. 前言 + +本文的绘图可通过以下途径免费获得并使用: + +- [ProcessOn](https://www.processon.com/view/5a3e4c7be4b0909c1aa18b49) +- [DrawIO](https://drive.google.com/file/d/1nSSCpPUC05MFoeFuf_aeTtkm7dG5-bJ1/view?usp=sharing) + # 2. 实现 Singleton [单例模式](https://github.com/CyC2018/Interview-Notebook/blob/master/notes/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F.md) @@ -456,7 +464,7 @@ public int pop() throws Exception { 如果使用递归求解,会重复计算一些子问题。例如,计算 f(10) 需要计算 f(9) 和 f(8),计算 f(9) 需要计算 f(8) 和 f(7),可以看到 f(8) 被重复计算了。 -

+

递归是将一个问题划分成多个子问题求解,动态规划也是如此,但是动态规划会把子问题的解缓存起来,从而避免重复求解子问题。 @@ -941,11 +949,11 @@ private void printNumber(char[] number) { ① 如果该节点不是尾节点,那么可以直接将下一个节点的值赋给该节点,然后令该节点指向下下个节点,再删除下一个节点,时间复杂度为 O(1)。 -

+

② 否则,就需要先遍历链表,找到节点的前一个节点,然后让前一个节点指向 null,时间复杂度为 O(N)。 -

+

综上,如果进行 N 次操作,那么大约需要操作节点的次数为 N-1+N=2N-1,其中 N-1 表示 N-1 个不是尾节点的每个节点以 O(1) 的时间复杂度操作节点的总次数,N 表示 1 个尾节点以 O(N) 的时间复杂度操作节点的总次数。(2N-1)/N \~ 2,因此该算法的平均时间复杂度为 O(1)。 @@ -1103,7 +1111,7 @@ public void reOrderArray(int[] nums) { 设链表的长度为 N。设两个指针 P1 和 P2,先让 P1 移动 K 个节点,则还有 N - K 个节点可以移动。此时让 P1 和 P2 同时移动,可以知道当 P1 移动到链表结尾时,P2 移动到 N - K 个节点处,该位置就是倒数第 K 个节点。 -

+

```java public ListNode FindKthToTail(ListNode head, int k) @@ -1140,7 +1148,7 @@ public ListNode FindKthToTail(ListNode head, int k) 在相遇点,slow 要到环的入口点还需要移动 z 个节点,如果让 fast 重新从头开始移动,并且速度变为每次移动一个节点,那么它到环入口点还需要移动 x 个节点。在上面已经推导出 x=z,因此 fast 和 slow 将在环入口点相遇。 -

+

```java public ListNode EntryNodeOfLoop(ListNode pHead) @@ -1346,7 +1354,7 @@ boolean isSymmetrical(TreeNode t1, TreeNode t2) 下图的矩阵顺时针打印结果为:1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10 -

+

## 解题思路 diff --git a/pics/27ff9548-edb6-4465-92c8-7e6386e0b185.png b/pics/27ff9548-edb6-4465-92c8-7e6386e0b185.png new file mode 100644 index 0000000000000000000000000000000000000000..1aee414c9a6fd74adb821d697ad4fac16b7c4734 GIT binary patch literal 8192 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 literal 0 HcmV?d00001 diff --git a/pics/280f7728-594f-4811-a03a-fa8d32c013da.png b/pics/280f7728-594f-4811-a03a-fa8d32c013da.png new file mode 100644 index 0000000000000000000000000000000000000000..526b684733c8abff09b0b086edf2ed6a71e66128 GIT binary patch literal 7168 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

2GwZ} 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 literal 0 HcmV?d00001 diff --git a/pics/ea2304ce-268b-4238-9486-4d8f8aea8ca4.png b/pics/ea2304ce-268b-4238-9486-4d8f8aea8ca4.png new file mode 100644 index 0000000000000000000000000000000000000000..59b54d2fa80a3fba02e0280a61b036d51bad4d4c GIT binary patch literal 23552 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 XS>@Zsw+#LNb2pxUJ^%k-p8x*`n)c!L literal 0 HcmV?d00001 diff --git a/pics/faecea49-9974-40db-9821-c8636137df61.jpg b/pics/faecea49-9974-40db-9821-c8636137df61.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1b236b6ed7c055f45bbd6ea90bc60031378c1a54 GIT binary patch literal 18432 zcmeIZ2UL??w=Vi3O=_e`Cn_i?A_!8H64Vb6ktPBHLPVqs5d;a4f+D?1|3o1asR|Kk zQbR{kn)FTrN{56RNa5uB_uc2-vG2dn`S!kdpE2&Z=S}9w$aq(hHCNV}<(bbs8atW; zPTbZv)CZWDm;gBA0US*NHv#5j$NqXUE*8d<^*Adl3kxeJJ3HHPZcc7)E>12k9$x+v zJiL6oTwEtkp5PM@6cQ5R1__It6cphX6cYUFOPH7$pJ8F;U}fbHdtV zrV^$NW~MX1F+L_{KBl8~01N<3tc=fcz}%7jjE|u5i^QDc(l^RmgzgRyWmF#dzU1IMDJ&u?cJ`dC z-1!SvRMpfqu3o$Ohn~K{EyLRu_bjcf@7vfqJ$80+b#wQ4=I8%B03H|=`YJ3uA~GsE zDLExIE&b0o8M%4y^9u@#ic3CMR902je5tK#ZENr7?E3nx`{&@$@W|-c_ynFXzwqn# z;?nX8X={6DcWf*{y#4tJj7D7l08P%N6l;|u`?Nj>tdi{S)o=BXr*;4O(yZ# z{1E^;*7!%zD_``IOh0?Bxr0+7eGtv5DjlhF%I)eAP>>!2riVpuTmcKap)N%94)|w6 ztRouIgblCJJ&XZQb3H-ef1TVN@sCjixvOVnf@8}4|eO?5*|ih3-l@Hr$K`$0#Fs!H5!T|XuX zZp(OLbuuxQKO6S?2nc*zdxdF>hFOEoXyxT{k7O5faB3Ul(LVAXpOO>>0U+I=2)zZ_1hX#MooJ zMgwX;zr%a7X`Bop6}Dm|8f4jUc>CL$UnM}-re2?`MlGN5w>Xr_PP~7uAl0>Wtj8Jc zB{}`R+v=8!S$Ff^snIT|KojpO?sGzP9yy=*u8)=|__hkkdOv0B+d|j|?t3&qlgw?P z%)vS{+2{M(R>6WxDs1u4>8VM9?a4d9v^dE8wL#IT(d>REJwdboa)I)pW@iPeOiy}B zfytuy^CGKKr!v%sGPLL`$F4IqvXj7j_eLkH4rYn`i*#YodK5{vYsL8&n_ChPga zn)wlcIGGJ9XcDDD26cqVig$<`$($WtuKYR9BFbu4U3O(g&Gq2>Q8-VB*Y2BN zZ5*y{F&E<^Ey%Q_Dmh$fowjvd%k!f0d4sslo6JLET_Xs8{3h>|yO~E&PikyN_Qw4QeFt)Yh}e;5M6C)#6qf21DD zLOIbbx?1PYY zRV(Rx1Dk7+Uu$cU1df1XcOj(+rXzr5sUAX%C2uqnz5Ji5WsQUAf=s*MxGDu#17cZz zFn;~C|GI}rjqP&jwdPA;>0dKbilPgL)-9NFOr(~xaHpb#q4OME6}HY}DQsJpba)nd z-qxLKK0tYHgVOk%lg5jU#XX!oIFA!M0@f}-cKka4KM2QolM-soL5HMwu)U@wEVe9m z&$zoo`lR(!P4(}xkoAPy^Js6#_@;3su_hKJ2lWg}%m46A`{Q#pWy2Uxxp6{Vs&&${ zZK-TTSM0VudM$UB7)|d7OK8dZQ|iB|UM_Ae9iDf6mbls;buel{L7=~VCdbg5o*V%? zIdV)02w@d-4AmCo-RLr@c(LKEIKwPWzit&Wox6nuL3cOijO&m89GaID`+0(4gKUD5+&-sv9i? zR*H==E+#*nGAw)`u-!Sb_#?r6MdyaaGSrCP136Jh&LJAKHl1ofE7R>@XO@qE#*0s! zT&TAfN!UwdPrPQr`2ODc;lXx}J>x%?)6;8|G??;|oKH(b)*t51kJMqtBHC)C#A$C4 z@{&JOk~VuAImf{=Nfolczd+&uKX8@)TUseY`IY zsJ#q+M!vIt1XNf-){Tpf0B3q%lX`70=hz9zNpqT~6JvBf+J!Ng7x8d9Y6CQ{f~9}g z1?&BD0guZYn zWf%bqMAb!+k~B$iiNT_5kTUrf(FGQFXp)*U?YWr`_myw28~T`CJ*#k-)7|kKCS|*r zyj7#I9KGYoC62t*In(=7sHUnW?oqT{rx2h1u@_4~@rr!?mnUA%wOh&82L|l(t(0Gq){xfe)lo9ROdMS0we-`oO%{NHt0I$M@}8u zOAKc$O4pkY+v4pQiAq>BrfNUJzmHF*g3Nqt=x%F&!mj2E*&o{R4;Dw6kn+2ASNYw3 z-Wt26#Qm}GRA_%c^HOd!AopJ?d0)On|D3T|OmqzYOVQSn7fFU|KsGOwklx-Sj0e5& zhYES_ALHUW9<$!pC%Mu348cErLQA7#eJAtWlLKGH zQxDNT*H@F&Y zbngpkvF-jy8v)bCW74~!Qia{wft_!rD}3>840>VDlfa1j@Y*B88LRg`CzI0%U&}y? zy5L&_&}%dF8Ae>TcIc5l%Knqfcy^?gf}PCQGLW8tvp0)vMqwo$2`5SOyOv8!Ld1Z> z7_%WSzqePtH(ldLCWI7ZK7X<_(@chnQ?1A~W%Lm#xdgmxtB;D?mSG&!-pmSeQA!uK zf!2}F{&@trpyOsM7Y1e!j8LTob@KU?7NihJQa%FwBaQ&!`cmW@A{Gw{LvfQGc-UJr z?p^bL|1dD=!f%_&`meP67*r-3D*y+zgT?~d%uwGe;9PBcE23<+E-hj6TGi7)ASzOhnZ0Mqk)!q z1bAqJ2zy}yvSC^Vvg1{6;hlVsH9#2SHqZD2(5fytd&p8jz^0OPGQqjz{+*hW)~`Pj zzZQmDiL&p0sQfR@53Jj9HSAsM)()c=by%sI3IT*n{}Ba!&u7UnzQylfmu`Jm&&4(d z8?1X#^v6+s5MG)3xHK65id|{t2PNOWb5{{TmkbDcfqiSL6t!uxx@kT6?fhd;tRy*E zh3$)I@cjoHUD~2wAi8qQ;}BO+$f4;Pg*fxQZSVMJs1pC|jMML|M^|MId52e0%yn4> z&2{-6*tP|7wfXRya>ZWpm2;M!5+hW>UO;&Ln`ga=iV=kh!?+4ZD+uva_Nc!e5ZIYa z(V$-HpH#~Nh=&-PC(`Lhz)iOLOxYWQ2ncKssc2F)=ye1vroQLmr{4xX4E;+i{eZm- z_UaJbi3>ZN4O3;Y*ef!!>o&N2he>XpG{0mVuw%yFaRd-eaWUz8N~<_l>VtLRD1?Ga zjOmrR@34ASeRSO|>7iTN^6Q*r$lh zYz_z11#yiu@|Gmuat#ty`NqmqL4VriZlR{3MDafRnUHI@<#Izf|0`q>bqcu^bQGfHngAbe(D2RWn-Nkw@SYReZlHtb%Y-pdGt~yX%NL3Zs(4FFjIFQLZXNjEd z5Rh~4{7TO{H0MIjJwS;au!4kA&*qZ_S`T3nJ9hUfe(sR1j-QTw$SO&HzmPnY)J8dln zH}blh^7Ae=)hBanBI2NM>rN=q3=_)mMB_oSogfZrJp!7eH|fEZo4=E017Ofn;Sov@F$hpK(w-q<$E{M131lPTaV8|;ez_pfyiG1Gnbgxj+OMp}( zoyRx(3F}BpL%SkX_MVYl-E*6Zb*g+>JByJC8Saq_%(P)jcCc%)>OAIC-x{UFj#e=b zYFAXIbk0bh`wglBWlYE}KG#%X9{kkYCA6mv2%78tyCP&^^>f|7=hCK0W0?2Fja;{L zQJpvQjvc4Q+2w{nbm+%CM#1Grz`Er}g#1YUV`4<~aGwD26wqS4B^ zi@S2@sK@3ZV>?g4-67h&(Q?_x{vXSY8!ru;v6>{@x&Uzy|HFIc6sauv@wfdP!}gyE zB?h&)+rW;k{BJJRGA`fb*9x3Ls`}{DnPgVp~L1O{zucrq;|{!`4c9A z@{0#Rp4aoy;UbUDK_U}7>5?SxY--oeeu>z0b^&J`3FA%Cl ztB2DQ_m`iasNC*5jlaiDS~1nt%pj}GZHDbaC*RI@bhY=Lv@-;?m9qI}n7mP(%1oh_ z1oL&?-(T>tp!d&cjG&)j;;hhYT0DLOWCP=OMrA7l&%~cV)TN6Y+UlM1k>BRP$Ckl7 z2O!YoBN*?_|T!C(Kc+d?(`h+5~6FvQ=F00My#53B|=#n!Wv+hqk2~Icy*sHXqycE?9xQGy55v4R$wv-fA-am^d`baP8Q2d}QxEa$Jp)p@-o(0+bVfZE z)xPnRwI{BbcH@NnI6|6qvsFhYOoq4_<=5y0|7v9PK9GG_{C>oD^425TrnSL7~&yOwAdeNE4v)q>_ zJImW+Bs`Q#@&Hi2PKee-*Pb`ov0#2}hU4d>uJ>2zF1bT!7id^r$){SPe#) z+A|Jrts#nQAoM)6#=R`ReD&sh_t>%g9no|1_JFoPaNZ4G>iCe!yW0h94z+eniW;_}g9)zTqIOEKmYWpj+6xj(sVgvI#*rjBZ9meJlCzQ?78v{l#6|-%@LX+&Fennj- zr;mWu(HwJ!O1HuIXt{-F$6FEYT%{i#sr}(=y`ARqT0^!5TQ%wtPs7 znZRSzTG!z9Tkp-A+^K8Ku_qwRPz!U5i`wTuXvE!1dG6YcI!P;QlBfTmpZUaCs!sdM zyPMqI1Uc&UC+c-i8Pglq1>l zyCJlFM(8KPIq!kH?QrZhMjo@CB$}cGp#>cn-5#mh90L&$0Y1pWdt`$$6Mne9-P)5N zzNPO&K_Pl@_&f2u&9-|1cT4;7rf71xMN1hyn8?Z)ZBx_COHaHBHaQt8ss4_yuYVZ+ zoq76iW356l^DsWpak2_@)Fz-Ty>QAQRh#-{oOA@l_p`Ump2Ys9m7+Z(5t2!CHlkLz z-Prb)>6zE!I<*?mJh8(KjS-QND`rJ`Zsz?=&~ty`+J06|L~M+fyB}h8`k4iKR()pT z{etUiLU&Uo!`F3^(qndT02yjQ;;r)8vsW|?E6loc^0dK2&7`NmhH)UK88>l5F@7R! zZjdTjwltyj^i64%*X>XQE^+oTtec|?r2KH>_C17375l0&4M ze0qT3U7-$m#XLAnOCS*c#UE*~)(;Oi=gmZvS4?y-9Lw%j{_y&`sI=-tKdWT$&CjGu zF~RvBN(wz;3kod6FJJu}UqYmzD)der*&!4Q)t3ZrZgg>dd*{u}zFuk{;Dll?__Zii z&{TkpKLR|9`&y5H1Pmui#tyaC0Z$ucf^XlbCV;5y3@DxdZ=6=9r0&<9Ten)Ib#2~! z0eA~=R}u1okac&8#mbEOkR_&72b8>a=v;~M>*g5qSxv0hDUx5qO~iC25Gi{|(nu|s zzpbD_?%7MRyQkTS%FJZz9`vUpAk3QK1CRNwj*6H0M>!lCYJPI+M7^W?PlpziSXwU^ zhq?Q<-CW|7E3+m9w3iCw6+>YNBkcDx_ig8%gasJNm$&9}$Cm572U$SxOhngfb(BS} z6k#uurAbxvEBB#L#W2+bp79&f!S1`a_DUyo2vRDsCzP(T#OpmFL+2S8r6V}9>`IT( zk5Bz)-C(;MPHyXY&Mcq!l{lN3lJpHs&CN>m4X^Br$Jk1i3eBa>)(E$XXFhe$YZvG& zl})SpY;(JMVNrCt=2Y-&c2w$e&}avSn;g(F0g6!N`dy71y;q$nt>4KNi{|WRo1RwU z`1W;IFwg2;)!myuNz;;H&mjB_tc6r#qJAm9(O9Syo9))dhfz4pOYnaP!rQ9~<=wvh zBeP1&l+LkE(!4h~*^XhO-u~eazT2+B{SzcFOJ`}O3mr;BPuoiM=0!M-zN*dr(_Bv|(edvbR|ji~g@@^TdN1xo z;hhaHvEP@pB{{(ZABN@oAZ~Gr6wf(GySQ=vn@aH!%Pymqn4z7s-OqHkcfNX_XXu%R)yYm zDrVA$*aDQz*1AxS8PT6GjOK>dqm;!m8zy>Hv1R3|%%C5|^VShC+#=SA(^b0A^Y3O; z{~A&wzB7JXWGJg^&ysY}=$(C!7njpuuQlCG9G(~Ae`W~5mu6W-Y_US@RISa|5+Me{if1w>Aw<~tQ zPUn;a$3XDRRq*$N5Ihg%k27v#kV&24^cDxTwaLwQqoc#yed|4Vq-)14%ShLapNdr< zX4mCpC~BA|+uthLzI*AKumz2lMm-pMocPUn!fjDe%bvuJ-&{+;dd$ey4YV&BRo4v2 z3{aZ~Ixbv%_^kmn!_!Ra62jtV!>rUGAuqJGS>$H zE2iv`Pr=L2X)5xsrW>|Ek{o^c$kUYD2+f*LwB((F!A<&XAYSB2*_!I(Clyb|!u7o2 z7ksa-Y0LMhV#VN_?Xwl@nATf5Jme%Ezw5ji`@UnJZRFx2HZ8kDI3}*j$bHjHK<&@l z$Mv=JjTL-v70Ya$_6#_=cX(Uoi5=o2{*A!Ug>dF2`78(v7F*v~x^*S^Lx4^M8A?ba z;o1_oS2yVu=7V#!2z21i9T8fGBb~AHDsGGQC-}pbp?S9^6HSYHP=55EmyZA#eFV&W#e6%@ zLrJUTYBS~bW4aA?;Hg@O{O`+{uEga5@`*}wJ)gIKp>Y3GxsG(@&3E>3eX2_$H^5vvvTnGOR8dEQ0`G#c*VE7+u{1Ii ztgNwiJ)5_Vk^X}qMBx@~E<83?%LwbHZX5OPSHub3blO1RD>D%#qcx}js6=Jo3p8lc-!sYy>EJe@ zeeK8A;2neSiM0Me+5VsrFjZi5E_E{uArMRgwGVuqxj?den>5P2pV(|-eRX3tnA8Cv zga3vjV^<-mxAMU$_{B)-Rb~0Id`H#K8%vU}*C3$}=|aTOH87ztp|$BWQGt>&)S!)6 zDK~8UGfG-xhXq7g!QEKhuHUO9HZHEUQEs~7gm*Lz#oMk;VO&RYUZ5;p@D-C6mD{S# zf<~>xu;oSX_mqpJ;A4kn(cg)Rq`vFNb_IE zmp)5N7dbn={HT0Q z06kg330SuMnoujeZEhxNzE6T2+&(egu{-Z3^UXQGGV)^D-Dkf)Kbh)Px}4VBOsKDu zOSzZ&=edyFRaaLeN{DiH~pk z_0CHsUw@%kIx!Lu7>{eao8CwaUflJT#52*ST2;y<>#?t35lTQ;-KRo!n zNS7*NrVal@bpKG6mZiP+f!?tGYGU&K9mZlb`j;W&WSE)#&5|P%12210wXU{kI^>nt zP+l9Co57LpdoA(hacp;-MHd(40(~Is{9u!aYFBiF^zrRog$t^#cK$15M@%hk}iu7~DP#OOcN7+yq+`CJb6 zkMtSk(e&P-#Xn(krF|(JhYN?8d;o$6bwQ6)J^Kkb;zquBueFN%wvyeSpr_wP6UmdioH(`*KKH<9EP9twc!hkzhR_9Oua~ZP%EmO@jr)yu z_dshH(6>&{N$h8XlIVN~XmJKcR4PeVyXjNt&~v-Wr3HqiJ6SmN?Un0S@#ap+1Rz` zLmqGN7F;He{ff`-N0yv=XnaPr?!gxdg;d< z{}--;h#<++ITj1MN@^le0`Qmf%|UZstKMa^&a#sdMSI5@C3KYUSzoL&(7t^ksI<>9 zx5<4-hE~!fTvB=jyt;_+cNLkaaBsho#57gnyuB+F^^9VTuo@6|sUjNKeNN718}a|f zU@a&Fm3NsVpZH!A&?(PtvaX`#=xCDvWEo(fsF5=GOWt0E_oNQwtE(aS>-3*Ev7GqH zj*LCboC2=}Wi?n-@W)b6@z!?o+OTrhK=h#bN3EIPi(QHn6^w|Q>-N%w24gCiPGN;# zcFWJ%doC=#zQ_u++KCS9Q;m)kMA6i50vd@!uyK zgZ7(oV~dRCYp#_Zy7e+*q7w9BJ?%zZnf$A6qLlwiq*c$7w59 zcJtxi$U6T)g2ZZ)w@G>WWDs%oF3F_)Ofu)e^R)4UGTBq>*AE^a0-j$+RAV5ZW$U1{ z93RR2xQ|{}25&tr%6^;-&8$AL3MQKMO`P8NEntU`A-?;fJI>)dz8t?s{R9HM1^s&>%%H9_M|!uOq)AFj1yg^j4N(VioqM!oqtxr>-# zeDijK)OjLFeF72HrX=y%brwh{Yy^;}^$Ic!16#eNUm58o;5@5>#? zNMnC|VQd<<9c=dBXOb3tmiIS98PJ@q$uGJS7R?n~#wMMxO? z%z6^LIrJeym~41coXCf%14FTJ?IF83AOWI{M7yOk3^H3=S5k9`5cTW_Yi#5 zWD+sds^3P?<7si-U_saUYoQ@JdD2_hiwv8Jq&}@B;X<$t>;zf220J{5&bN!tz*)DH zZ(w}$ZA`N#8HH<`zv&5q|M)nI;VMsKt~<3uii<{enr;&|F0b+Cy5ATqTTxQi{J9vS z3jTK$Ays(Aa{)WHI5$&EsweR5cg;p!zA`HOOvNqj8Fz`?fn~F{ zknRNTM)0V-xCfeOwmAU~6qux*B{qDy-d)-Wg6?CmpPI1)_Ub0p13MH?aXIO#is~rG zaFLV?ozZ|L^Cy5w_oUmuv#I3gKof7<(q}*8)1~G%vyVnkMIv(ImG6T# z<-YDm9*)lLc2FOYT??rX$*?lG#oaguaWZG;56E!$RRi$NgtjY818`XTNrwylel#bO zH{KUvIX3u2lj~NZr5DHvdjL7V2ySQ1z{>iBzxJ(o)sf_WRB9q;0eM@a~bz=@|jXvysNWV9_RJc)%R&#io`KK|WD}kLS~5v6ORr zW+FQl=RxLQ)g$Lqe94KbI6?a#hAIw$lZ74$%S<$h|qAu!WJ7j52I32 zEXQ}i?VDt|#kNg$kGsn#(a%k!-h8R+_E)?jv@he>A*q3{Fx9Yi;dy;`>Um;T_nXymuD}FXeY%besggbZ7P@CrC z?Y6=br5z zYlzuvC%1g0!b!Uk%?aTZw8HhfawD+P$@4XJC&A6^3aeks7`5iYwc$C_nCG8)EN;aQ znn^DVUDSA%{ZM;ZhJ0I)gpPUofhwa7j@FE^EdGyHpev6Di#XRzG`u<0^|& z0i(PXT5MoHFlbWgT4=GOIL8RT1?EiK8dX{|ByM(B>v~_h)i(75MU6!o_VqvHWepg9 zF$a}!o8{M%FC<6kHW;m6+Pf^{dwL=01MiP(e0IC7-v5eB{IgfYWlA7Ib*M?4{JjkV z);i5~mLBs=!uIox%S~sVmd$isWZ+HJ@~eGexDz|G(M?PP4d(f`KTmj^xQIJXiA#86 zn!{G5WsgTfI%hwZe^;`d77_gTw%uD7ltmKxUpxjp-vGgN|PU&R%?Y#wbGilWq{r z2dd}^A)3z$z^k8m68rGZ8y}?6C3QnJf6n%=+cP{%QwgpGHx_VfV8QeR)vzJG6Llfw z;4@d$o4L5gtD5f;?mk7zFVi%QDt;>5o#_0@CGRJ4-)sJO=n~KYAj)RJIL}hgKM}0& zmror5gY`Z~0P@z5;<_lsc1gZ&5#O8q;f!zB+UD0IAf&r$H%^dg+cW|)m!Gs0z~M@g z#rGEC$M1!uZT(RBqw$MAn4*fbCl1aVgz6}|yCd=TL8BJ>qHd|psoHNqSIg`ih%>2# z7}1MW$ZMl_t6mGamE~HCK+HQ3c_fQH`Fdj0do4$zomDNdD^kI(m)>LZHTr?X`i&rT z-QMpx}%1XMY+IObRR@UxN6rJeL-zo!4WVkQ;0o}4wjtNK5Ms{YxA z5VF2ER9fk!_M5(C`Eq1JEzL$`?!t>Ck6}bABYHkXP7K6DLhI1se)ZusLk$*)i!W|| zi*$lhjT8X5OS)7Z-+UG7Ffq~QvcWZCylt(Era&~;(yub$)qmN*Ca>!9cn3cTf zwSpuZ>~kt=OBuO=R9oB%CvN!{yRMXAdeGM56P=~8r_ zh4Gu^0gRTv_Dr-~ne@|t9!@f73Z}E=WCoiqE+-phI(dN3M~;DeFfOeea! zAbeHlJbP4h-<0~Ldf%1KEGCD2JA46s)c=2NHDK?>Rk^P1E5=t=k+84qclxB3oYt*s zPR`0tJvpd;j24y%CVGxToHi$zP!NP{<&dJiKzkkf@Z1MrF3LKNye5vV_OVw*M9hst z@R?|sxR=_up2Bd%(?8XwPyC>A2R*uZV8*^=`F9Yfe>(=jOmX{)u%@^&vg7u`p7Q8{ zOAgZemJ>Fg(K5Fwhd7-kZTXvw9Vkc)w)ahPPefuSHxqt~Rpnyup5H%%=F-7rzvIqg z6&!c6$%RijO9)AijgCoO-BRp;MoX!Z!zi~D+e|s(Kfx?ZBh^`mx|GZBOXUw7zsV%7 z2+BE5y(2j!l7b1nIO0D2gd#KC+tbUn%a)p`tEecg$lo5q;VpTSxldMfZ6LR?Hv9|)2PxJ)3Z>WhsYxUo*X;+(PpB1AN#XRS_GNBEM;qDY!;P_71cSiyHfoXNPi?69ik8Ie)Y zSMx!d-DQZn2q0jNI77zI50k$YBQB8Ryb9E+)52H!EC+@g3dL{wiWjxa;R7G=^?Jt8 za%|@bHS6m51UC2;gKT)0Ug-K=a{haNxYGpm`#lK_ruy9}1LmtSb5rTK<7khbo2_(B zIKrHOLcRBq4oj~}NO6K(IKTCF<3(JyF9X-3!K z8>#T_uymF~S_d@@X>6bJc)|xM8S9c3=P$pa=3eZ+Zxal?h&X4c~ zGoH5JVFdwg=$s;N6RwgJ;&bxPe8^TXj)NQ{zo@CRnF~&Rcb(dZ8LwFrIIGd_Q3sp5eK@KqW)V6ESkc{z22fHOw z2|r%Mk315N@D}8)WLiP<($6ET$vEPN_N>dq^|VA!?dj#1He2L^p27G}U98N8-ESFh zW)V^LGQGgr_RUymCAJmB(L+$=pM;+qG>IEI{c9so=D7xEiOe@`(|!TyEmYq%|E5%; zVsqNamo009>W8|WM*5-&1Ve0Qlfnb=g!o=Faki~-CLoL|gPRabaY{*g$gBkGy~0Qk zwE=&+92rki#4olS0RZ*pXeCX@$S6vhfd{0U#80Q)a!gG~l`-&{xRKiZI#9Y$btfym z*v|8sS3d3C2krbJBQ0gDfj&?SHuLO7yEk5&G^1rvgIOqdg?`GumU#Lxrq)C|I=Ywk zdY5BYaU9qDdCE2D{=up8Zx`abaoLPkB_UEDRZs}pR)ga~*tk>bDGC!15`imYL*E8yOyQ5SWRg^BCD<%hcy!7e#3csc26{%JZ$`TL zPBY@uhkdJdSN_9klXdfKji77`rYfRkQ~Uu)(b!Ed#&E3e`)TQ|H=dgr2MKge4r1;$ z!L+#+wo`?PV;)cFajE!i}0 zCGiWzzu{5up4P9l$7UQ5^Kh!?kms7yS&iaLh4F(i6T{M7XO+lkEo_nx0 zO!+))BUL@H$rTcyF+S691nfnZe<53t+FHOOkD_MvVtK$1+*)+*nB1}f)%2o;n7?3) zUs5nIhHalWo>?PeqA?X-HSL=s?&uQ;X-0R=ad^%dV+No720=cun)<%r*S86u zcXRQ_ugr!+DlU-0U89VF&huPYF>=l$=lH`7J};inUM;5s)KB|f3t`d($XLSHxQOr_vPo3#owj3(FwliV?93t!=L9ty(6iSFR&~7n z;78#{5A&r%y>)6&wfuc4SJ_XNGDpA#5{P_`H$kB@on+7v#!)#^m0}bKLSO9eIlNs3 zTF)Wr!WHqsZYO2FW66p1Hg|5<#mU6R5UM45&T_|e4MVJ=Gnfp-u80jj3$rcMaA2i> znu#faZGdbY^XHJsZLXa0h`8j$)gg1eK=z0KESt7IPjYJ8B4hEe*emx1eqhW7HWeO0 zt>O08yJza^ZZJN&cDK{|!XcM6MU48h$^`PjGy_4>Vsv`Ve(_(naQ z9y~_$>*K*+%VPD_X2@q@kWK6HD@=SH_0sJ*+4FgA;PXO>C>qYFYtoi3Az zaWAJp#$P19E8D!h?{D6ZoY?D@V_r;{)a)2lhVzc%M?x@OB-hviJ8{oj2hJf%%3o(< zUc^$8$41K;-KP)0yj13FxXW}+NB(%17ml*_VOyQxixyjEP)eILX$`3ju7tj@CYH~% z-}&g`D66w8Hzh-Nv7g>2I>xTv|FoiD z&%_md->?HE1OYTI%i}rs9Ce$IrTr&bp^G*Y=Id+HI9?lamzWRKDJQ-J;qNlqTr+f( ziN6~u98|xi;hd_ZeLOV!lDc}DvcmnO=M0?lUU^qZ;xhEX(zV@)sLB|7(>t~C8=b#c z5{*Q^o{HXuO2I)l$?15zO%Ob~Q~Rb-gYoA-<`b8?gO%1i=WzT8adIg|WOZu=#UU)E zO?H(}e|!7M+nDQX>}Y-S&|d4tAov4l`Mzw;!ZXXfzLKfKx@ZzE98!f2X*&C8a(z*E zL^$foy4{JoPbhsU}+2BB!3uY$E^7=utm7z!NCipMXIt(8?9bi{$=c)NvVOv62I~8e&l_RH99Lee} z0mk`mFVQ08sQ9mIS5jx{8@WQzq<+r~vJd4F^(L*b!H_+Mt}E%Q8uy z8G*z5e~+5N-V3Q7U7PeFZR4jbmh2vp!Xp`ViNSn^Ymc{8n68+d;@nOchwjCqqs08O z1WC4N7xL;YDZQSCHm3((^Kj^9&N$;pi2=K5NKLg5w!$xpMA3o`Gm z?_A@!{8hF9k9q3GJmiK=(gIU#;puqoA%~OXU-%E}VDqqs{L$AM6sl-5B!m zW$10VD*+Nlb#`SPiNP)(zEa`&_RFL`fy(kOq1}w#Ku=JG^{!#Fq#*+wo=3QoVp`Ck zopG4|EZ>+-2l$=<`)iDDO!A?1&&(MHiB)_rt)9^Zd>%j912M^LsK*GbaQ!OLho3b) zjmq=cVJ-zcP{SCBD*NX&ofA~`s47z-Pv}yO@1z7ROKq-5I_K0@F!w&T2<<%kLJe23 z*ostdbGz$h9xU`(za6a zy@!&)*zW%ey8WN&B0Dd7^E}IAspD4|#g|xw87+Y>M78@8-00e7Zntt#30673V6;2u z)z>87x|={ghp^hNhg%bBA}hsF#V}>@5be)0roW(G1IB9A%yapSm@}AaoaDqZD}HID z-OvBUce-8Ic3I4I#toOHtq1HRbbA6nJoi$8;JGny&jO)oF!yar)|!<;8dZVz1|?3F zJfN!J-`WM^2o3K7E5OLEoI@sud_5uQe;TL$8-}t{gZ&(mxohHH1}xGq#@?a(dS!>d z2<+=FI1DjN*d(9ZY_qpDyriXy{zz6P#ot@rKbs3BGch8nt`DmhBS3sNyl*CYWSoeeb9hR(+_w~D+S+`Ho6AIV zBGk34gW7G=V>VxhyQ>B#eYG2sYXQH(zGpN>FK3Ak5 Date: Sun, 29 Jul 2018 15:24:29 +0800 Subject: [PATCH 16/87] auto commit --- notes/剑指 offer 题解.md | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/notes/剑指 offer 题解.md b/notes/剑指 offer 题解.md index e36e7a85..47d5d94e 100644 --- a/notes/剑指 offer 题解.md +++ b/notes/剑指 offer 题解.md @@ -1640,6 +1640,19 @@ private void backtracking(TreeNode node, int target, ArrayList path) 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的 head。 +```java +public class RandomListNode +{ + int label; + RandomListNode next = null; + RandomListNode random = null; + + RandomListNode(int label) { + this.label = label; + } +} +``` +

## 解题思路 @@ -1820,7 +1833,7 @@ private void backtracking(char[] chars, boolean[] hasUsed, StringBuilder s) 多数投票问题,可以利用 Boyer-Moore Majority Vote Algorithm 来解决这个问题,使得时间复杂度为 O(N)。 -使用 cnt 来统计一个元素出现的次数,当遍历到的元素和统计元素不相等时,令 cnt--。如果前面查找了 i 个元素,且 cnt == 0 ,说明前 i 个元素没有 majority,或者有 majority,但是出现的次数少于 i / 2 ,因为如果多于 i / 2 的话 cnt 就一定不会为 0 。此时剩下的 n - i 个元素中,majority 的数目依然多于 (n - i) / 2,因此继续查找就能找出 majority。 +使用 cnt 来统计一个元素出现的次数,当遍历到的元素和统计元素不相等时,令 cnt--。如果前面查找了 i 个元素,且 cnt == 0,说明前 i 个元素没有 majority,或者有 majority,但是出现的次数少于 i / 2 ,因为如果多于 i / 2 的话 cnt 就一定不会为 0 。此时剩下的 n - i 个元素中,majority 的数目依然多于 (n - i) / 2,因此继续查找就能找出 majority。 ```java public int MoreThanHalfNum_Solution(int[] nums) @@ -1924,7 +1937,7 @@ public ArrayList GetLeastNumbers_Solution(int[] nums, int k) if (maxHeap.size() > k) maxHeap.poll(); } - return new ArrayList<>(maxHeap) ; + return new ArrayList<>(maxHeap); } ``` @@ -2005,7 +2018,7 @@ public char FirstAppearingOnce() ## 题目描述 -{6,-3,-2,7,-15,1,2,2},连续子数组的最大和为 8(从第 0 个开始,到第 3 个为止)。 +{6, -3, -2, 7, -15, 1, 2, 2},连续子数组的最大和为 8(从第 0 个开始,到第 3 个为止)。 ## 解题思路 From 8a42a419be5a062cb59bc19e536e4b3de826e7cb Mon Sep 17 00:00:00 2001 From: fighterhit Date: Mon, 30 Jul 2018 15:26:33 +0800 Subject: [PATCH 17/87] Update Linux.md --- notes/Linux.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notes/Linux.md b/notes/Linux.md index 6325e86e..8f27d75c 100644 --- a/notes/Linux.md +++ b/notes/Linux.md @@ -1078,7 +1078,7 @@ dmtsai pts/0 192.168.1.100 Thu Jul 9 17:23 - 23:36 (06:12) dmtsai pts/0 192.168.1.100 Thu Jul 9 08:02 - 08:17 (00:14) dmtsai tty1 Fri May 29 11:55 - 12:11 (00:15) -$ last -n 5 | awk '{print $1 "\t" $3} +$ last -n 5 | awk '{print $1 "\t" $3}' ``` 可以根据字段的某些条件进行匹配,例如匹配字段小于某个值的那一行数据。 From f8600a4611fe45f847e6a1e869aad7a1d43bcda4 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Mon, 30 Jul 2018 23:22:52 +0800 Subject: [PATCH 18/87] auto commit --- README.md | 8 ++- notes/剑指 offer 题解.md | 41 +++++++++--- notes/{安全性.md => 攻击技术.md} | 0 notes/系统设计基础.md | 104 +++++++++++++++++++++++++++++++ 4 files changed, 141 insertions(+), 12 deletions(-) rename notes/{安全性.md => 攻击技术.md} (100%) create mode 100644 notes/系统设计基础.md diff --git a/README.md b/README.md index 63067ac8..4b1411b5 100644 --- a/README.md +++ b/README.md @@ -105,6 +105,10 @@ Leetcode 上数据库题目的解题记录。 ## 系统设计 :bulb: +> [系统设计基础](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/系统设计基础.md) + +性能、伸缩性、扩展性、可用性、安全性 + > [分布式](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/分布式.md) 分布式锁、分布式事务、CAP、BASE、Paxos、Raft @@ -113,9 +117,9 @@ Leetcode 上数据库题目的解题记录。 负载均衡、Session 管理 -> [安全性](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/安全性.md) +> [攻击技术](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/攻击技术.md) -XSS、CSRF、SQL 注入、DDos +XSS、CSRF、SQL 注入、DDoS > [消息队列](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/消息队列.md) diff --git a/notes/剑指 offer 题解.md b/notes/剑指 offer 题解.md index 05d43578..47d5d94e 100644 --- a/notes/剑指 offer 题解.md +++ b/notes/剑指 offer 题解.md @@ -1,4 +1,5 @@ +* [1. 前言](#1-前言) * [2. 实现 Singleton](#2-实现-singleton) * [3. 数组中重复的数字](#3-数组中重复的数字) * [4. 二维数组中的查找](#4-二维数组中的查找) @@ -80,6 +81,13 @@ +# 1. 前言 + +本文的绘图可通过以下途径免费获得并使用: + +- [ProcessOn](https://www.processon.com/view/5a3e4c7be4b0909c1aa18b49) +- [DrawIO](https://drive.google.com/file/d/1nSSCpPUC05MFoeFuf_aeTtkm7dG5-bJ1/view?usp=sharing) + # 2. 实现 Singleton [单例模式](https://github.com/CyC2018/Interview-Notebook/blob/master/notes/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F.md) @@ -170,7 +178,7 @@ Given target = 20, return false. 当前元素的查找区间为左下角的所有元素,例如元素 12 的查找区间如下: -

+

复杂度:O(M + N) + O(1) @@ -456,7 +464,7 @@ public int pop() throws Exception { 如果使用递归求解,会重复计算一些子问题。例如,计算 f(10) 需要计算 f(9) 和 f(8),计算 f(9) 需要计算 f(8) 和 f(7),可以看到 f(8) 被重复计算了。 -

+

递归是将一个问题划分成多个子问题求解,动态规划也是如此,但是动态规划会把子问题的解缓存起来,从而避免重复求解子问题。 @@ -941,11 +949,11 @@ private void printNumber(char[] number) { ① 如果该节点不是尾节点,那么可以直接将下一个节点的值赋给该节点,然后令该节点指向下下个节点,再删除下一个节点,时间复杂度为 O(1)。 -

+

② 否则,就需要先遍历链表,找到节点的前一个节点,然后让前一个节点指向 null,时间复杂度为 O(N)。 -

+

综上,如果进行 N 次操作,那么大约需要操作节点的次数为 N-1+N=2N-1,其中 N-1 表示 N-1 个不是尾节点的每个节点以 O(1) 的时间复杂度操作节点的总次数,N 表示 1 个尾节点以 O(N) 的时间复杂度操作节点的总次数。(2N-1)/N \~ 2,因此该算法的平均时间复杂度为 O(1)。 @@ -1103,7 +1111,7 @@ public void reOrderArray(int[] nums) { 设链表的长度为 N。设两个指针 P1 和 P2,先让 P1 移动 K 个节点,则还有 N - K 个节点可以移动。此时让 P1 和 P2 同时移动,可以知道当 P1 移动到链表结尾时,P2 移动到 N - K 个节点处,该位置就是倒数第 K 个节点。 -

+

```java public ListNode FindKthToTail(ListNode head, int k) @@ -1140,7 +1148,7 @@ public ListNode FindKthToTail(ListNode head, int k) 在相遇点,slow 要到环的入口点还需要移动 z 个节点,如果让 fast 重新从头开始移动,并且速度变为每次移动一个节点,那么它到环入口点还需要移动 x 个节点。在上面已经推导出 x=z,因此 fast 和 slow 将在环入口点相遇。 -

+

```java public ListNode EntryNodeOfLoop(ListNode pHead) @@ -1346,7 +1354,7 @@ boolean isSymmetrical(TreeNode t1, TreeNode t2) 下图的矩阵顺时针打印结果为:1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10 -

+

## 解题思路 @@ -1632,6 +1640,19 @@ private void backtracking(TreeNode node, int target, ArrayList path) 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的 head。 +```java +public class RandomListNode +{ + int label; + RandomListNode next = null; + RandomListNode random = null; + + RandomListNode(int label) { + this.label = label; + } +} +``` +

## 解题思路 @@ -1812,7 +1833,7 @@ private void backtracking(char[] chars, boolean[] hasUsed, StringBuilder s) 多数投票问题,可以利用 Boyer-Moore Majority Vote Algorithm 来解决这个问题,使得时间复杂度为 O(N)。 -使用 cnt 来统计一个元素出现的次数,当遍历到的元素和统计元素不相等时,令 cnt--。如果前面查找了 i 个元素,且 cnt == 0 ,说明前 i 个元素没有 majority,或者有 majority,但是出现的次数少于 i / 2 ,因为如果多于 i / 2 的话 cnt 就一定不会为 0 。此时剩下的 n - i 个元素中,majority 的数目依然多于 (n - i) / 2,因此继续查找就能找出 majority。 +使用 cnt 来统计一个元素出现的次数,当遍历到的元素和统计元素不相等时,令 cnt--。如果前面查找了 i 个元素,且 cnt == 0,说明前 i 个元素没有 majority,或者有 majority,但是出现的次数少于 i / 2 ,因为如果多于 i / 2 的话 cnt 就一定不会为 0 。此时剩下的 n - i 个元素中,majority 的数目依然多于 (n - i) / 2,因此继续查找就能找出 majority。 ```java public int MoreThanHalfNum_Solution(int[] nums) @@ -1916,7 +1937,7 @@ public ArrayList GetLeastNumbers_Solution(int[] nums, int k) if (maxHeap.size() > k) maxHeap.poll(); } - return new ArrayList<>(maxHeap) ; + return new ArrayList<>(maxHeap); } ``` @@ -1997,7 +2018,7 @@ public char FirstAppearingOnce() ## 题目描述 -{6,-3,-2,7,-15,1,2,2},连续子数组的最大和为 8(从第 0 个开始,到第 3 个为止)。 +{6, -3, -2, 7, -15, 1, 2, 2},连续子数组的最大和为 8(从第 0 个开始,到第 3 个为止)。 ## 解题思路 diff --git a/notes/安全性.md b/notes/攻击技术.md similarity index 100% rename from notes/安全性.md rename to notes/攻击技术.md diff --git a/notes/系统设计基础.md b/notes/系统设计基础.md new file mode 100644 index 00000000..e132aa2c --- /dev/null +++ b/notes/系统设计基础.md @@ -0,0 +1,104 @@ + +* [一、性能](#一性能) +* [二、伸缩性](#二伸缩性) +* [三、扩展性](#三扩展性) +* [四、可用性](#四可用性) +* [五、安全性](#五安全性) + + + +# 一、性能 + +## 性能指标 + +### 1. 响应时间 + +指从某个请求发出到接收到响应消耗的时间。 + +在对响应时间进行测试时,通常采用重复请求方式,然后计算平均响应时间。 + +### 2. 吞吐量 + +指系统在单位时间内可以处理的请求数量,通常使用每秒的请求数来衡量。 + +### 3. 并发用户数 + +指系统能同时处理的并发用户请求数量。 + +在没有并发存在的系统中,请求被顺序执行,此时响应时间为吞吐量的倒数。例如系统支持的吞吐量为 100 req/s,那么平均响应时间应该为 0.01s。 + +目前的大型系统都支持多线程来处理并发请求,多线程能够提高吞吐量以及缩短响应时间,主要有两个原因: + +- 多 CPU +- IO 等待时间 + +使用 IO 多路复用等方式,系统在等待一个 IO 操作完成的这段时间内不需要被阻塞,可以去处理其它请求。通过将这个等待时间利用起来,使得 CPU 利用率大大提高。 + +并发用户数不是越高越好,因为如果并发用户数太高,系统来不及处理这么多的请求,会使得过多的请求需要等待,那么响应时间就会大大提高。 + +## 性能优化 + +### 1. 集群 + +将多台服务器组成集群,使用负载均衡将请求转发到集群中,避免单一服务器的负载压力过大导致性能降低。 + +### 2. 缓存 + +缓存能够提高性能的原因如下: + +- 缓存数据通常位于内存等介质中,这种介质对于读操作特别快; +- 缓存数据可以位于靠近用户的地理位置上; +- 可以将计算结果进行缓存,从而避免重复计算。 + +### 3. 异步 + +某些流程可以将操作转换为消息,将消息发送到消息队列之后立即返回,之后这个操作会被异步处理。 + +# 二、伸缩性 + +指不断向集群中添加服务器来缓解不断上升的用户并发访问压力和不断增长的数据存储需求。 + +## 伸缩性与性能 + +如果系统存在性能问题,那么单个用户的请求总是很慢的; + +如果系统存在伸缩性问题,那么单个用户的请求可能会很快,但是在并发数很高的情况下系统会很慢。 + +## 实现伸缩性 + +应用服务器只要不具有状态,那么就可以很容易地通过负载均衡器向集群中添加新的服务器。 + +关系型数据库的伸缩性通过 Sharding 来实现,将数据按一定的规则分布到不同的节点上,从而解决单台存储服务器存储空间限制。 + +对于非关系型数据库,它们天生就是为海量数据而诞生,对伸缩性的支持特别好。 + +# 三、扩展性 + +指的是添加新功能时对现有系统的其它应用无影响,这就要求不同应用具备低耦合的特点。 + +实现可扩展主要有两种方式: + +- 使用消息队列进行解耦,应用之间通过消息传递的方式进行通信; +- 使用分布式服务将业务和可复用的服务分离开来,业务使用分布式服务器框架调用可复用的服务。新增的产品可以用过调用可复用的服务来实现业务逻辑,对其它产品没有影响。 + +# 四、可用性 + +## 冗余 + +保证高可用的主要手段是使用冗余,当某个服务器故障时就请求其它服务器。 + +应用服务器的冗余比较容易实现,只要保证应用服务器不具有状态,那么某个应用服务器故障时,负载均衡器将该应用服务器原先的用户请求转发到另一个应用服务器上不会对用户有任何影响。 + +存储服务器的冗余需要使用主从复制来实现,当主服务器故障时,需要提升从服务器为主服务器,这个过程称为切换。 + +## 监控 + +对 CPU、内存、磁盘、网络等系统负载信息进行监控,当某个数据达到一定阈值时通知运维人员,从而在系统发生故障之前及时发现问题。 + +## 服务降级 + +服务器降级是系统为了应对大量的请求,主动关闭部分功能,从而保证核心功能可用。 + +# 五、安全性 + +要求系统的应对各种攻击手段时能够有可靠的应对措施。 From 75e5fd8be63458f7fd7f519d46bb2a811ad087b3 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Tue, 31 Jul 2018 00:30:14 +0800 Subject: [PATCH 19/87] auto commit --- README.md | 4 + notes/缓存.md | 265 ++++++++++++++++++ pics/15313ed8-a520-4799-a300-2b6b36be314f.jpg | Bin 0 -> 33792 bytes pics/66402828-fb2b-418f-83f6-82153491bcfe.jpg | Bin 0 -> 38912 bytes pics/68b110b9-76c6-4ee2-b541-4145e65adb3e.jpg | Bin 0 -> 34816 bytes 5 files changed, 269 insertions(+) create mode 100644 notes/缓存.md create mode 100644 pics/15313ed8-a520-4799-a300-2b6b36be314f.jpg create mode 100644 pics/66402828-fb2b-418f-83f6-82153491bcfe.jpg create mode 100644 pics/68b110b9-76c6-4ee2-b541-4145e65adb3e.jpg diff --git a/README.md b/README.md index 4b1411b5..5e49a332 100644 --- a/README.md +++ b/README.md @@ -121,6 +121,10 @@ Leetcode 上数据库题目的解题记录。 XSS、CSRF、SQL 注入、DDoS +> [缓存](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/缓存.md) + +缓存特征、缓存位置、缓存问题、数据分布、一致性哈希、LRU、CDN + > [消息队列](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/消息队列.md) 消息处理模型、使用场景、可靠性 diff --git a/notes/缓存.md b/notes/缓存.md new file mode 100644 index 00000000..e60373dd --- /dev/null +++ b/notes/缓存.md @@ -0,0 +1,265 @@ + +* [一、缓存特征](#一缓存特征) +* [二、LRU](#二lru) +* [三、缓存位置](#三缓存位置) +* [四、CDN](#四cdn) +* [五、缓存问题](#五缓存问题) +* [六、数据分布](#六数据分布) +* [七、一致性哈希](#七一致性哈希) + + + +# 一、缓存特征 + +## 命中率 + +当某个请求能够通过访问缓存而得到响应时,称为缓存命中。 + +缓存命中率越高,缓存的利用率也就越高。 + +## 最大空间 + +缓存通常位于内存中,内存的空间通常比磁盘空间小的多,因此缓存的最大空间不可能非常大。 + +当缓存存放的数据量超过最大空间时,就需要淘汰部分数据来存放新到达的数据。 + +## 淘汰策略 + +- FIFO(First In First Out):先进先出策略,在实时性的场景下,需要经常访问最新的数据,那么就可以使用 FIFO,使最先进入的数据(最晚的数据)被淘汰。 + +- LRU(Least Recently Used):最近最久未使用策略,优先淘汰最久未使用的数据,也就是上次被访问时间距离现在最远的数据。该策略可以保证内存中的数据都是热点数据,也就是经常被访问的数据,从而保证缓存命中率。 + +参考资料: + +- [缓存那些事](https://tech.meituan.com/cache_about.html) + +# 二、LRU + +以下是一个基于 双向队列 + HashMap 的 LRU 算法实现,对算法的解释如下: + +- 最基本的思路是当访问某个节点时,将其从原来的位置删除,并重新插入到链表头部,这样就能保证链表尾部存储的就是最近最久未使用的节点,当节点数量大于缓存最大空间时就删除链表尾部的节点。 +- 为了使删除操作时间复杂度为 O(1),那么就不能采用遍历的方式找到某个节点。HashMap 存储这 Key 到节点的映射,通过 Key 就能以 O(1) 的时间得到节点,然后再以 O(1) 的时间将其从双向队列中删除。 + +```java +public class LRU implements Iterable { + + private Node head; + private Node tail; + private HashMap map; + private int maxSize; + + private class Node { + + Node pre; + Node next; + K k; + V v; + + public Node(K k, V v) { + this.k = k; + this.v = v; + } + } + + public LRU(int maxSize) { + + this.maxSize = maxSize; + this.map = new HashMap<>(maxSize * 4 / 3); + + head = new Node(null, null); + tail = new Node(null, null); + + head.next = tail; + tail.pre = head; + } + + public V get(K key) { + + if (!map.containsKey(key)) { + return null; + } + + Node node = map.get(key); + unlink(node); + appendHead(node); + + return node.v; + } + + public void put(K key, V value) { + + if (map.containsKey(key)) { + Node node = map.get(key); + unlink(node); + } + + Node node = new Node(key, value); + map.put(key, node); + appendHead(node); + + if (map.size() > maxSize) { + Node toRemove = removeTail(); + map.remove(toRemove); + } + } + + private void unlink(Node node) { + Node pre = node.pre; + node.pre = node.next; + node.next = pre; + } + + private void appendHead(Node node) { + node.next = head.next; + head.next = node; + } + + private Node removeTail() { + Node node = tail.pre; + node.pre = tail; + return node; + } + + @Override + public Iterator iterator() { + + return new Iterator() { + + private Node cur = head.next; + + @Override + public boolean hasNext() { + return cur != tail; + } + + @Override + public K next() { + Node node = cur; + cur = cur.next; + return node.k; + } + }; + } +} +``` + +# 三、缓存位置 + +## 浏览器 + +当 HTTP 响应允许进行缓存时,浏览器会将 HTML、CSS、JavaScript、图片等静态资源进行缓存。 + +## ISP + +网络服务提供商(ISP)是网络访问的第一跳,通过将数据缓存在 ISP 中能够大大提高用户的访问速度。 + +## 反向代理 + +反向代理位于服务器之前,请求与响应都需要经过反向代理。通过将数据缓存在反向代理,在用户请求时就可以直接使用缓存进行响应。 + +## 本地缓存 + +使用 Guava Cache 将数据缓存在服务器本地内存中,服务器代码可以直接读取本地内存中的缓存,速度非常快。 + +## 分布式缓存 + +使用 Redis、Memcache 等分布式缓存将数据缓存在分布式缓存系统中。相对于本地缓存来说,分布式缓存单独部署,可以根据需求分配硬件资源。不仅如此,服务器集群都可以访问分布式缓存,本地缓存需要在服务器集群之间进行同步,实现和性能开销上都非常大。 + +## 数据库缓存 + +MySQL 等数据库管理系统具有自己的查询缓存机制来提高 SQL 查询效率。 + +# 四、CDN + +内容分发网络(Content distribution network,CDN)是一种通过互连的网络系统,利用更靠近用户的服务器更快更可靠地将 HTML、CSS、JavaScript、音乐、图片、视频等静态资源其它数据分发给用户。 + +CDN 主要有以下优点: + +- 更快地将数据分发给用户; +- 通过部署多台服务器,从而提高系统整体的带宽性能; +- 多台服务器可以看成是一种冗余机制,从而具有高可用性。 + +

+ +参考资料: + +- [内容分发网络](https://zh.wikipedia.org/wiki/%E5%85%A7%E5%AE%B9%E5%82%B3%E9%81%9E%E7%B6%B2%E8%B7%AF) +- [How Aspiration CDN helps to improve your website loading speed?](https://www.aspirationhosting.com/aspiration-cdn/) + +# 五、缓存问题 + +## 缓存穿透 + +指的是对某个一定不存在的数据进行请求,该请求将会穿透缓存来到数据库。 + +解决方案: + +- 对这些不存在的数据缓存一个空数据; +- 对这类请求进行过滤。 + +## 缓存雪崩 + +指的是由于数据没有被加载到缓存中,或者缓存数据在同一时间大面积失效(过期),又或者缓存服务器宕机,导致大量的请求都去到达数据库。 + +在存在缓存的系统中,系统非常依赖于缓存,缓存分担了很大一部分的数据请求。当发生缓存雪崩时,数据库无法处理这么大的请求,导致数据库崩溃。 + +解决方案: + +- 为了防止缓存在同一时间大面积过期导致的缓存雪崩,可以通过观察用户行为,合理设置缓存过期时间来实现; +- 为了防止缓存服务器宕机出现的缓存雪崩,可以使用分布式缓存,分布式缓存中每一个节点只缓存部分的数据,当某个节点宕机时可以保证其它节点的缓存仍然可用。 + +## 缓存一致性 + +缓存一致性要求数据更新的同时缓存数据也能够实时更新。 + +解决方案: + +- 在数据更新的同时立即去更新缓存; +- 在读缓存之前先判断缓存是否是最新的,如果不是最新的先进行更新。 + +要保证缓存一致性需要付出很大的代价,缓存数据最好是那些对一致性要求不高的数据,允许缓存数据存在一些脏数据。 + +# 六、数据分布 + +## 哈希分布 + +哈希分布就是将数据计算哈希值之后,按照哈希值分配到不同的节点上。例如有 N 个节点,数据的主键为 key,则将该数据分配的节点序号为:hash(key)%N。 + +传统的哈希分布算法存在一个问题:当节点数量变化时,也就是 N 值变化,那么几乎所有的数据都需要重新分布,将导致大量的数据迁移。 + +## 顺序分布 + +将数据划分为多个连续的部分,按数据的 ID 或者时间分布到不同节点上。例如 User 表的 ID 范围为 1 \~ 7000,使用顺序分布可以将其划分成多个子表,对应的主键范围为 1 \~ 1000,1001 \~ 2000,...,6001 \~ 7000。 + +顺序分布相比于哈希分布的主要优点如下: + +- 能保持数据原有的顺序; +- 并且能够准确控制每台服务器存储的数据量,从而使得存储空间的利用率最大。 + +参考资料: + +- 大规模分布式存储系统 + +# 七、一致性哈希 + +Distributed Hash Table(DHT) 是一种哈希分布方式,其目的是为了克服传统哈希分布在服务器节点数量变化时大量数据失效的问题。 + +## 基本原理 + +将哈希空间 [0, 2n-1] 看成一个哈希环,每个服务器节点都配置到哈希环上。每个数据对象通过哈希取模得到哈希值之后,存放到哈希环中顺时针方向第一个大于等于该哈希值的节点上。 + +

+ +一致性哈希在增加或者删除节点时只会影响到哈希环中相邻的节点,例如下图中新增节点 X,只需要将它前一个节点 C 上的数据重新进行分布即可,对于节点 A、B、D 都没有影响。 + +

+ +## 虚拟节点 + +上面描述的一致性哈希存在数据分布不均匀的问题,节点存储的数据量有可能会存在很大的不同。 + +数据不均匀主要是因为节点在哈希环上分布的不均匀,这种情况在节点数量很少的情况下尤其明显。解决方式是通过增加虚拟节点,然后将虚拟节点映射到真实节点上。虚拟节点的数量比真实节点来得大,那么虚拟节点在哈希环上分布的均匀性就会比原来的真是节点号,从而使得数据分布也更加均匀。 + +参考资料: + +- [一致性哈希算法](https://my.oschina.net/jayhu/blog/732849) diff --git a/pics/15313ed8-a520-4799-a300-2b6b36be314f.jpg b/pics/15313ed8-a520-4799-a300-2b6b36be314f.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cbba7f360c3fad591be2a96b334935a44e792685 GIT binary patch literal 33792 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 literal 0 HcmV?d00001 diff --git a/pics/68b110b9-76c6-4ee2-b541-4145e65adb3e.jpg b/pics/68b110b9-76c6-4ee2-b541-4145e65adb3e.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d82f46eb69175c1da45cacef5545b9f797f8c2ab GIT binary patch literal 34816 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
tSY~r%G!pGiTQ4wKRYn2B8TF;>R^YR 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%0Ayfr^s5<>k${W2Fl14%w#Gf;{*s58 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 bEY0oT|4j=1uVO#m@7e$V`TzgU^Z)+<8N5@c literal 0 HcmV?d00001 From d78b96587829957eb46f5046ed6a640b8d58e9ff Mon Sep 17 00:00:00 2001 From: HenryChan98 Date: Tue, 31 Jul 2018 14:35:08 +0800 Subject: [PATCH 20/87] Update SQL exercises --- other/sql 经典练习题.sql | 51 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/other/sql 经典练习题.sql b/other/sql 经典练习题.sql index 72965fa2..a4b4f964 100644 --- a/other/sql 经典练习题.sql +++ b/other/sql 经典练习题.sql @@ -430,3 +430,54 @@ where SCORE.SNO = STUDENT.SNO and SSEX = '男' and CNO = ( +-- 46、使用游标方式来同时查询每位同学的名字,他所选课程及成绩。 + +declare + cursor student_cursor is + select S.SNO,S.SNAME,C.CNAME,SC.DEGREE as DEGREE + from STUDENT S, COURSE C, SCORE SC + where S.SNO=SC.SNO + and SC.CNO=C.CNO; + + student_row student_cursor%ROWTYPE; + +begin + open student_cursor; + loop + fetch student_cursor INTO student_row; + exit when student_cursor%NOTFOUND; + dbms_output.put_line( student_row.SNO || '' || + +student_row.SNAME|| '' || student_row.CNAME || '' || + +student_row.DEGREE); + end loop; + close student_cursor; +END; +/ + + +-- 47、 声明触发器指令,每当有同学转换班级时执行触发器显示当前和之前所在班级。 + +CREATE OR REPLACE TRIGGER display_class_changes +AFTER DELETE OR INSERT OR UPDATE ON student +FOR EACH ROW +WHEN (NEW.sno > 0) + +BEGIN + + dbms_output.put_line('Old class: ' || :OLD.class); + dbms_output.put_line('New class: ' || :NEW.class); +END; +/ + + +Update student +set class=95031 +where sno=109; + + +-- 48、 删除已设置的触发器指令 + +DROP TRIGGER display_class_changes; + From b1bbd3d41895c488ead8768b6e882e2c102e7e12 Mon Sep 17 00:00:00 2001 From: fighter Date: Tue, 31 Jul 2018 17:30:04 +0800 Subject: [PATCH 21/87] change XSRF to CSRF --- notes/攻击技术.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notes/攻击技术.md b/notes/攻击技术.md index 22af60ea..c99071a0 100644 --- a/notes/攻击技术.md +++ b/notes/攻击技术.md @@ -141,7 +141,7 @@ http://www.examplebank.com/withdraw?account=AccoutName&amount=1000&for=PayeeName ### 1. 检查 Referer 首部字段 -Referer 首部字段位于 HTTP 报文中,用于标识请求来源的地址。检查这个首部字段并要求请求来源的地址在同一个域名下,可以极大的防止 XSRF 攻击。 +Referer 首部字段位于 HTTP 报文中,用于标识请求来源的地址。检查这个首部字段并要求请求来源的地址在同一个域名下,可以极大的防止 CSRF 攻击。 这种办法简单易行,工作量低,仅需要在关键访问处增加一步校验。但这种办法也有其局限性,因其完全依赖浏览器发送正确的 Referer 字段。虽然 HTTP 协议对此字段的内容有明确的规定,但并无法保证来访的浏览器的具体实现,亦无法保证浏览器没有安全漏洞影响到此字段。并且也存在攻击者攻击某些浏览器,篡改其 Referer 字段的可能。 From 37b833c347b8d0e03802ad5c3e44845de43a54a1 Mon Sep 17 00:00:00 2001 From: cyc2018 Date: Tue, 31 Jul 2018 10:34:59 +0000 Subject: [PATCH 22/87] Updates SUMMARY.md Auto commit by GitBook Editor --- SUMMARY.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SUMMARY.md b/SUMMARY.md index e60f018e..3ae54443 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -30,7 +30,7 @@ * [一致性](/notes/一致性.md) * [分布式问题分析](/notes/分布式问题分析.md) - +This file is used to generate gitbook catalogue. From 6cf167f64bac2e18ed31365bf2304113791941e3 Mon Sep 17 00:00:00 2001 From: cyc2018 Date: Tue, 31 Jul 2018 10:36:23 +0000 Subject: [PATCH 23/87] Updates SUMMARY.md Auto commit by GitBook Editor --- SUMMARY.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SUMMARY.md b/SUMMARY.md index 3ae54443..dde02f47 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -1,3 +1,5 @@ +This file is used to generate gitbook catalogue. + # Summary * 算法 @@ -30,7 +32,5 @@ * [一致性](/notes/一致性.md) * [分布式问题分析](/notes/分布式问题分析.md) -This file is used to generate gitbook catalogue. - From 529152680cfa299f2d2c3e651e4e6b96f4ec77e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=91=E6=B0=B8=E5=B7=9D?= Date: Tue, 31 Jul 2018 18:37:56 +0800 Subject: [PATCH 24/87] Update SUMMARY.md --- SUMMARY.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SUMMARY.md b/SUMMARY.md index dde02f47..69b6103c 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -1,4 +1,4 @@ -This file is used to generate gitbook catalogue. +This file used to generate gitbook catalogue. # Summary From 7515d4a8df2e8f4c5860071098250f522581e680 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Tue, 31 Jul 2018 23:30:59 +0800 Subject: [PATCH 25/87] auto commit --- notes/Docker.md | 102 ++++++++++++++++++ ...011f3ef6-d824-4d43-8b2c-36dab8eaaa72-1.png | Bin 0 -> 32768 bytes pics/71f61bc3-582d-4c27-8bdd-dc7fb135bf8f.png | Bin 0 -> 24576 bytes pics/7e873b60-44dc-4911-b080-defd5b8f0b49.png | Bin 0 -> 17408 bytes pics/docker-filesystems-busyboxrw.png | Bin 0 -> 32768 bytes 5 files changed, 102 insertions(+) create mode 100644 notes/Docker.md create mode 100644 pics/011f3ef6-d824-4d43-8b2c-36dab8eaaa72-1.png create mode 100644 pics/71f61bc3-582d-4c27-8bdd-dc7fb135bf8f.png create mode 100644 pics/7e873b60-44dc-4911-b080-defd5b8f0b49.png create mode 100644 pics/docker-filesystems-busyboxrw.png diff --git a/notes/Docker.md b/notes/Docker.md new file mode 100644 index 00000000..f230f762 --- /dev/null +++ b/notes/Docker.md @@ -0,0 +1,102 @@ + +* [一、解决的问题](#一解决的问题) +* [二、与虚拟机的比较](#二与虚拟机的比较) +* [三、优势](#三优势) +* [四、使用场景](#四使用场景) +* [五、镜像与容器](#五镜像与容器) + + + +

+ +# 一、解决的问题 + +由于不同的机器有不同的操作系统,以及不同的库和组件,在将一个应用部署到多台机器上需要进行大量的环境配置操作。 + +Docker 主要解决环境配置问题,它是一种虚拟化技术,对进程进行隔离,被隔离的进程独立于宿主操作系统和其它隔离的进程。使用 Docker 可以不修改应用程序代码,不需要开发人员学习特定环境下的技术,就能够将现有的应用程序部署在其他机器中。 + +参考资料: + +- [DOCKER 101: INTRODUCTION TO DOCKER WEBINAR RECAP](https://blog.docker.com/2017/08/docker-101-introduction-docker-webinar-recap/) +- [Docker 入门教程](http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html) + +# 二、与虚拟机的比较 + +虚拟机也是一种虚拟化技术,它与 Docker 最大的区别在于它是通过模拟硬件,并在硬件上安装操作系统来实现。 + +

+ +

+ +## 启动速度 + +启动虚拟机需要启动虚拟机的操作系统,再启动相应的应用,这个过程会非常慢; + +而启动 Docker 相当于启动宿主操作系统上的一个进程。 + +## 占用资源 + +虚拟机是一个完整的操作系统,需要占用大量的磁盘空间、内存和 CPU,一台机器只能开启几十个的虚拟机。 + +而 Docker 只是一个进程,只需要将应用以及相应的组件打包,在运行时占用很少的资源,一台机器可以开启成千上万个 Docker。 + +参考资料: + +- [Docker container vs Virtual machine](http://www.bogotobogo.com/DevOps/Docker/Docker_Container_vs_Virtual_Machine.php) + +# 三、优势 + +除了启动速度快以及占用资源少之外,Docker 具有以下优势: + +## 更容易迁移 + +Docker 可以提供一致性的运行环境,可以在不同的机器上进行迁移,而不用担心环境变化导致无法运行。 + +## 更容易维护 + +Docker 使用分层技术和镜像,使得应用可以更容易复用重复部分。复用程度越高,维护工作也越容易。 + +## 更容易扩展 + +可以使用基础镜像进一步扩展得到新的镜像,并且官方和开源社区提供了大量的镜像,通过扩展这些镜像得到我们想要的镜像非常容易。 + +参考资料: + +- [为什么要使用 Docker?](https://yeasy.gitbooks.io/docker_practice/introduction/why.html) + +# 四、使用场景 + +## 持续集成 + +持续集成指的是频繁地将代码集成到主干上,这样能够更快地发现错误。 + +Docker 具有轻量级以及隔离性的特点,在将代码集成到一个 Docker 中不会对其它 Docker 产生影响。 + +## 提供可伸缩的云服务 + +根据应用的负载情况,可以很容易地增加或者减少 Docker。 + +## 搭建微服务架构 + +Docker 轻量级的特点使得它很适合用于部署、维护、组合微服务。 + +参考资料: + +- [What is Docker](https://www.docker.com/what-docker) +- [持续集成是什么?](http://www.ruanyifeng.com/blog/2015/09/continuous-integration.html) + +# 五、镜像与容器 + +镜像是一种静态的结构,可以看成面向对象里面的类,而容器是镜像的一个实例。 + +镜像包含着容器运行时所需要的代码以及其它组件,它是一种分层结构,每一层都是只读的(read-only layers)。构建镜像时,会一层一层构建,前一层是后一层的基础。镜像的这种分层存储结构很适合镜像的复用以及定制。 + +在构建容器时,通过在镜像的基础上添加一个可写层(writable layer),用来保存着容器运行过程中的修改。 + +

+ +参考资料: + +- [How to Create Docker Container using Dockerfile](https://linoxide.com/linux-how-to/dockerfile-create-docker-container/) +- [理解 Docker(2):Docker 镜像](http://www.cnblogs.com/sammyliu/p/5877964.html) + diff --git a/pics/011f3ef6-d824-4d43-8b2c-36dab8eaaa72-1.png b/pics/011f3ef6-d824-4d43-8b2c-36dab8eaaa72-1.png new file mode 100644 index 0000000000000000000000000000000000000000..0e56341c391316a7ce1b9e6c973ec469bdea1f43 GIT binary patch literal 32768 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 literal 0 HcmV?d00001 diff --git a/pics/7e873b60-44dc-4911-b080-defd5b8f0b49.png b/pics/7e873b60-44dc-4911-b080-defd5b8f0b49.png new file mode 100644 index 0000000000000000000000000000000000000000..66e26e808a4b282cbed5ecb69c1568ce4d90274a GIT binary patch literal 17408 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 literal 0 HcmV?d00001 diff --git a/pics/docker-filesystems-busyboxrw.png b/pics/docker-filesystems-busyboxrw.png new file mode 100644 index 0000000000000000000000000000000000000000..c12710afa6197895db15399046882676a86d3858 GIT binary patch literal 32768 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 z zAYurd1lPlKxw!u!%jjyIp<%`Ymsoo8oWq>D)JbY7qC{uwYgUbA0S{C@9@S#UUIn@X z7C7(wH5_N6Kc4yNOfSq-+qi6FNr#EwUzGkww4-#pi%qPVa^1wcu5OO?Xy^h+WBhZvaNhqsqLqv3blq#!*6&|SYA+=X>lu)Zm3yW3m}X0a zoRPpctD#}@^`9iyPuWpS?HL~{0P6ipYaGW~m)V*EDFYueBo}ZO#EPCgDtz)Qr7J!x zzW}rF?&kVJp=0p!MfE3Z#JRw~0j`MtExOL!U#4g>*_;i>^KC z@gF9?0eEY+Zo4h6rK^U2cB>q_T~~|p++RloX(u}U@$in4sV@j-B78rHgZvW_;MI}( zQ%>{J*@!~5`(p(EtN4POk*UTGA25AJl~O-NyJYeX=*E0EIj@ZUmIt)|RhM#~rk zsc4MP?X#w2Ftw4~f5EXE>3%lkvZqyhcytCAo;pjEj7`B>?eyeJONfPE-!e}c4yP7) zy#>sGAtJN7&#Otn29|XGCny%_g*hh(uhw#XkY+#UQ%g&Et8?no$@Of{kob=UDbY?k z;xn~fQVo~7)Qnp;@8_BRP@uW&=jQ5(oB5wl@EB-YQmTTF`280mbd*#@q|&~))X$Mh zuV~9q+98;`kB-+yDN{-HXHCU9Uu?R06=E)MoPPS3TH@C=!!3W|_YVd|maOU2Uy<_S zj_TarwAOMcNjmD=tsJd&6KY>(R-KKUNSbzH4Rvqx5|udwz}^24B%Qw6bt-v72X;0|J0@Vk1kwh;%TE&;sS=zd1;}R;q9TD;A3mGC5=r?=tB%z0YDx*Z?JkJ=MwOD{Vm~qZdb1Jf#aRF}{k*cXI<8TwA7~(Lfoi0^1W_!^ ztFMoqHI8$%HqzD|^wtY)Ux%|=qj}U% zd~w+;8Vy~2Ju%)M5ctDaa+x&vqj{joTT?>l)4$Ru#Q!15U?jNZ$BtMiiRJ5KrCt#v zfrj=G`qqkNj;7nH9NTVJg4&X5u6{TubK~$_@8^Q=|0_A#%OpCk^s^ zb+B*o)ssRc!^9{dy{Kn`=1`J^MVdaO?v6v1PEt4#sZD}d?VhY;_#2YzNxJL|pKLjH z4a+Wy!!PG{380~m;8)mVOnwPM(nmg%2XsFt%pp#eM8!LS9uL9*%)OEdUoSI=G&!T2EwLQ_b_ghv-M+ z%(jYV_2Z9(F$ToBigtS*H)@QuH(zRTl%P6D5NaCW{dQEzrQMI2RN|{`Z3H0m3tEMP4A=5(`A}S>+3JWs;SJ56J7c(k(RvhUA z*K1>)PdyCq13&l4Ruom(NPxtN#r)dt^#l-%8W61j{I@PdUAhKc;W`xg6Q4xTq^?`$ zY`lZDw{qaR-|p~lr@PBG2E_#U)C0axfk)oGGiQe-b_x*g|&-eHH)gQ4!i!Ok@;;fiP}C-3~3^4Uj(yCuI;H5xl1}en17oH-taWj79BUc0XQPHOx-tN z-waNZ_pEd(vB+~6cK`1tSHjeRTkWR~(Q9NuU(0 zZ{65=>Vg>d05+`!5Op`CT(^p#Fx2rUl89?u!E{o`q5-^yc)G8yG`!e`X62 zMY|{8unnD{4xXiGc!{fH0v0LnR7I3aRD}_ocmLgqI1aj{7nl*=Z)I5nbtGhH%wahV z0}q0X8(&;nGJ-$`}>EOkgCTG z<`D73FsU^~KO4jPy1|D;Z~0INi8YwZ!}` z$6&nwtPNqDxE1rR@jK^~1hG5;)RP`2cH1{c!!BB$nI(CDfJ%LN&q=>nDi*(0R8jUu z#&ydI@^!Q#2`8gDKr(umwf~O)+%DNRpJ!RAlT!N$* z*UIdp%KMyc0J}i?(t?TeI`kDWZNYDhGZt|2gd3UMsKl42->Q-K^ZE1yI?GgO0y_;W zTKdNpyoH*-o8-B^-3k?R}K4)C-Gv>4?M`GyEY#^(@}0*5zIjzj}!dxqaEB` zMiKP9Qki<|qEDO=R&z@p2@!838o5)ELoLs&s33}Rdqf&Vj8|o9%zf9`;q?W?b=5>5 z!0gO#M!rz#3SBLZe5y6nq4yheU;Uwh&zDIjl=ZjuM4pb%Iq7Wsa4|ms$7cP#~9|wur^g)zo}1B?Q&|z`lD%&Kbk&jmo9H3Z*!C2W!01ni&25~&Vh2G zS^MTA1yt7;VX0%huJM90uDqtxAaGSW^5Mq@XFV;iWwC+XzK#`!#JkNg=q5u|G2?8m z#|=eZOm@GoxpoD#cM1;j0&fj~fz#;Hfcq?JMHI5_*2kMi~|vM zF}T$8G~w@PU~%+|d%jK$HaTq){c+7RZB<<#3yeH--JirGT8oTjDugZb{#aG)dVu0Q zQRQKsF$>YjA+?fKhAAES_ENT_3)b=clh%KdpY+WM-Z!0J0Q=_RZiBCv*&E+meL@vS zlFZYwq46>GvwyZ`-z%-%CY&!sK3H}L;$sp)?4EovPSyUKN-eNkuA3)5@Df63KEfz1 zR)?wAJ$PfvvY%CZ&{OlRBYQ=Tz-*ppGBe46y{!GQu7Up}1kBn~1^dEHzP#&IEJuWg z{!|gJSSb?nvN%r%4rH7e?7%2ES|rVSlF+YA|04qLYnp=&ZLZJjsU znQ5$Kk$xhW!6?L625*A*ZDX^y(_;(|yXbSq)7X@>q{`)py8lVE7^Wl?OB;9rSvi{C zBd=02V>5oeP*V;K!FEd4w2OU`5z^2UONlx;+&3fTa;hN3XWE()afv)Lr$jE%I;YI( zT1P%bMa9u7o|s>kVpHk_*P9&Cxep*ptpiEsq?l^U@Dn6^DRHG}Yz(RKVWCpQ-~ zaaDu|i|J~K#T74<7lxW|c}U2`MrrXjmEPkP^O1!tP9ElO4^$Q@8Mzh&K27=0ei~+c zD*e(SFyIuknpd<8)(UajtR2_AXr{e&rk!TF*z;TF=|RiM-UIcKS*YvyPaR_d$DXJ$ zgWqx=M&lys_spfFm)_G7P_AqT5Xa3n+Y&mmZM+;z4@h z7`Zy2Tw~(<2miN%35xC(1s5VyVZXU zr1s!})>L?7bKfsDV?VL@g4@Ws&-COje<2@E9hmD?|H<5TnhUorAB601^SL}6CQR~_ z(2m>nVr%?PI1EbZddH!$LU)jUB&hypm-IsZ!3a=*BJX*}EX_BwI{aWe5jF-2_^Egx ztvkY+&8hJ0zjA)l2$Mq0s=AjD=NFdd~- zu>J9NJxvAk^0YUYVfSGi-{+hsF$+c6N*J**jUA`umoXXN8@}j;+x^9I45mjDu^-x; zE-B8Py!%>Cuv{swh%+c3{wo{OzJ(YuIFxGpFKYTpvV zox=#!VZnVTKacJ89#;cLTi7iJf<2jt{qeBhcss|1eA#d9qQl7dJgVs19KTg{QZP8F z%J*+F(pC>8!%}9&gg3;%J$v_AP^(Smp16YC4{*%1*dejv4-rmD76N-JVdMWG*Z>CR zV{)P1I*hFmX)Jk04(G4kNh1zvMT%@_I#W3qt3GQ_x$g*?&c_a5wqp;;J}{gOw%fdC z#NVuy{cNA_&22edK;M5)Q?c-!VgixC$A|ms05kFf)Kr-CV?JiWR7%mHZvfb;x?K7t z8?BVTuHEHbg{b9J5DrTU8Z#vP5uoL`_u<5lk$#$_zRpn+rI0!`LjGs1k62x4QS;<- zLF3Itb-3>9FN{P&hLzABH10u(5SSQh@nqn0MbtFGswC`CYU6qusSxXgq(4e+q?r0X zEW9J>iKOz=R?nY%b)R1HajF^YZ100zgx`)QeZ1fzRw0)S`Z~v_K)GoXBcQ8VZ+Ui} zltwb#-XE$;};}#(sq9N@~*WR@3Wyl4&YZGq>fC76|B;RhVABkS1iR8>?_HhaK)3F0dKX?;s~CRAJU?YxPrR z7z5?v2hf*%u&y=zhAN^bX$P^VN~7gE4aJAPEv9S9XR(TQF3%NcMX1o8n* z-iHJdd&qGaMo9!xaJO(P`ZtE{aS6l6l6 zPd$U}oyQZ*sPl`sInizP6+b!X9h%J5GFqjiU^ z6-&3<(qv}BVn%NSF7|NpuM^)&n8fT2eW+z3y9s*$r}gdWFAP5qrf#e&LMBBUOz9#(d^~kHGuS z&4q?XZu&gA?b4lHlGjZ4*AD>Phwf3+jHR3AoJwwTUWFP+oNH&L-54=A+_*F2P7vLL zS$m-JJ)>|2H$d^3*IzD3BkZ07k6;#SeJTssxK)1k{M)Q@lPtbc_q5~HSBjMMBLzwA9j<21 zegvNM!B?}4R{q-N)IL8QQ?4j=Y2s1A5@7GCM5im$A9PBMYI>S`JeBEzQo&k2Ki8Tw zAVdj9lS@f^d;|86=#J?_SoumYejdz|@HUS^POdg=q!SwNXh%4|@YlNacRH3@s#L@G zpzKd&Xd`(aAum-YU(LKt$TjdfZyqb3?lQ$DF=87OCQa$7ss=AVLh!t;u_xW2<#-QP zGGYI(#PAIp5;1s8`@V@|GrgYp9&;mB<&Iot$_TY%V*rYnzxrf?5l{To1R@^A!jeXh zHBG-7G^@^D1;W2PUOxINvG)lB-VIp6RV7Lmc&=Mfsa2ZXR&Jw2@|3&5XW!8wHD=kW zdP~n;iQ7Cite<$T|5aV?VDC-M6uu=*L;P4I5M{I@Fj4Wr*sA}6;4P=}R+qoi+_gDU^DKvCwLJHo%(!5BHoq#N-8R{Q|> z#5i}*_}dsTv;LE`&*>D73H2Qs3CXPIg%>KZDrK5uPq3I%zik0RzX83=z#qW#p0;nn zzCxlpxz_TaG&sboCm?Vt+d{hML*(m~M{@m?~$B-U^R?A~gHf%*0U^BbPo+*L zE!AVeSZy70lwJ5&WNNRH7A{6Df?8S&VZ&sT+cp?T)m_mL)dFM<+LO89$Q)`__= zFE&4t5slWdAf7=s7oLf)QF1uusImL3BmhzqkRf%4WGkx(TjvL!L*^!vci`gHd9n}A z7pPwsrF>>I%*D;kRQB2Bwf{@^Afi*=r2)yF2(JA&bhh1dc7WaT$hEIEsZ@JQ+|gAF zV`tqrMiz+OUs&rTl@s5i%bQ3;Dbw;XZpAvd(7@(?HW7{(y*AKOxM_hK`jUYm=ZX6z zay#ZMAbjQ3=+ey-(R=uFT?3Y7G-dQ{I^ZQ?*n94382jp^`F@M&A>U-L4K%%tGI|ii z_sEGCqPQ6OjI)Fv*4ULv4vM(=YY$>p{xUl+Hwvcs>QX9x9AE_+wBU)d(2 zy7ulN5$inW=V2w(Zs&Lc;}8nR+u(x9*6<4srpSaG>Zyi?E(Yxi!;_QfDI~4|?sFin z_3WS9?;>18aqM^Gvi@b(d8B4KYT#{1@z^`~UX3UYSyrmF)(NZlc^t{iVl7Nyx}$+y z1lI@2*8T8ambBk^(J-DlMriAGz!=XC^`>0@p{r{aa-$qMM^DkCHkOJywz~Ns`xnDI z+(g9`ryNc`WI-O3eW;0aof_Wvwb6l0Ot(=*pJXJtOHVNuT&~!YmV5H^v6Xr%udi=P zO%@~p77p3DTm+GBM;uxD3NK$Uyz$njgC^gJ*ptQjx|1v6nCoFd>p@F?B)X>pasJOC zcaOQ15ZK9+3(>3U^v)k?sA%8rYy-XX+`mxL7fhZP?e!=nWDXq-y}V!3{kt^8xO=fr zK_YVf1?q_dkI>IPZ_I3L!_2gXF7L_k@A}$sXxpqty6)g623@`kP`@CL7PzTb)upZD zN2v@i*jLaZyEChbygg|j-y?CP^!KIkphH96MOg@%qjYNJY9Yz|V*WUT*!04m92ZUX zE9uYk$t&Kp$RR<$x^MbOcDVQN1fxDL**6`~d2Nebn{POI7n{B#XUgclz-;9WVwMGZ2AuWQy?>$YylCvJKa^9YDr=p7n_02%yAF8+By*3)pZpflt0c^{qW3iRF#>7h(lxZIK$@StCnDNq#$n z?qaHOr8mAlD%DRM3u{A0tLoJEzghQ1497N~hRCQBun+!#+QsxnMYu~yr$B>VNVDs{ zr(GuA9Bu8QLoZT*9O};X-q7ZpKW4}9jnO6NjRWqvxSH{ki#Qq;LKQ7r(ETfApH~j< z!y2gkbM)>IWek^=F3z!Osk`|PxKdv;(LL$$f268D)EiQpIqC)TO`N7ii;CC-vdUGyn~%-u6_V&HC80Mu!cn?aTlN5qRgnNh8% z@w<>;7e#8HnoxTXTE}s~F1L?YaJv9OmgHT;XQ`Ra&(olzQGF$9c6$$hf63`;>vk49 z5*_5QuM61yZ)3wCm793W^lj!IA&>3cYZ1>0j29+?etqGdf%4x=xf3npTITA#lmUb- zUZ3bSZjaMryZpKxONCe9Vxa@yj4=AaI*IOA((UZ?tA6Uj?AXl+#4uaBiP`+T|F!gx zo3{$d*B-4#Ti^;o>PO5!N*j^JQQSuQcKUl#FsYUlreiT+uja2Ja&dpnb}#E^Bk>Ar zaI+_Rvpf3_Nj=qci)bF10L*B-45aaf^~0zXs|+13kQ4s5DbY|?-Z#G=dFRFXNNp#~ z3}R4s7r^eG+2JjiQAz9f@@j8i_BbLOa;CCpVPjSLr>`?>$l~iWI%SAbou_0mEf#FO zmIBp3RPH*IPtGDix6?!i((w#ruM)8ASm1+f&5oYe`gLoeM^9ekUcn$tjiV}g%K`J2 z@Wn_}w3V!T4!PfU)A1qyAoWd-fT4?2xwTF(h=BiPb%E`a`E>r%Go;M%Js`qGnXk$k zy#kMvy8MxTEL!7GpC%_dIEY^PL;I7#Qm5h8@oPn8a7Z?b{m5K*Vdf)V4CCy!ITCfV zlN?s7f#vaOD++!jPjFM))a(a~IqLaspUT~a8+mF9!1 zE<^Kt>5e$!(9^RKGp)4HvM`Rpmz@i6u->R@dT2_&tr%yEQd<8gkw6?W8WEc#Li;re z^@)`q6&;0pPt||3RhjR56>R1D-kovVBgBQ*=hV{zhQ8?C7}QMec?p`VCOC_fPz5 z(xyRLCx8*H03-g5G`hC<)HlQDlvtk%RK6Y)I(-F+{mM?~X#GV?xDLyWp%GlQ{+?aO z@@@T?j5#5T{0$)MaqZyg^DsDv46Ylvj$ESKTn@dAsF7aAK~su#gDmjks$A*?8}CmW z6*i+6pov-Judgk9TkF}K*;v%xJHof0xGnQwcvjQN?G1ND=Fs=t-vaHWMu}RL*V^h4vaAvl4c8PB~s>iFB(u6o}zy6`P6h7 zh`T`rs%R@ApH-!CoFmemQdz}Vq@cW-X6jq6ic2O5B_k!877QiVoWw9!P}atC+1Lr8 zajs$G-utj?BKmU=J=@PwqI<-Lp)TSyg@*u)Fs36d)TdnCOc5xhUU+L2v*r15pbWyzY-pV z-dwCjWgTu8pF9Napso#Ab=p;*WrAB2??MMT-nF`F{CDDX(R5`0-h`m-2PKK?;FTW< z#rBWzL7=8b=soOm5i0g${C4qPUnBqHY`6Y=pI;KyKItfS$JwtnS0*zwJui^t|HJ zXYG^iGjObiW||r0)h}9p9P15o<)d@t;GuZToulwby^nG4bK8f}CFA+*?QRO(pAd9h z1)$v+4)xkX@|@B+@|Fc&wOb(HB(lcLd|bc4ivy9jn1ph0`n|U~q}H4BNV2UQUCvIB{>&aWpLbHv_dCi8%P^ zjQRohk>pJ=Im%}QDMMoczko|llP%le^PE$=_pa$CtmO4iZDiOdS$9^;e*R4gBEvUB zT*VO-kSRhcE{<>RvG;D!LCyHP3!DEO^nCyq7Kv#y%w(ism;5Y8Za3Ox!j5!K|34b{&5ye7~nnr*qnBeqQ%#Z4Ue^ zmyK8~lsei*Xps+N=S;#O%8&V2S7~~_Ba6@bK3L2Qo3unuRUUGJK(*g45#l;K#&$&L z2SxshMv*>0LiaQ=>Q8&oAX}V!O==K=fhW#z8pIvgoYj2FbS1)O0uDW{=pl)K0SQQc z2{rgwhX5P*SA_yrp3PJVVq|eh`psjMiCPU-I$IYy5FA7_WU$HCQWtR=iiVV{vqL(lF>E)y!U?u?$dy5_CijPK#3k{CDa3Dr${exs#v7R zEC->#a*;jVAOmG;E1K2qqnu!h>FEp{n;I;IMtCF8U)kw{q*g?sIW!ZD6ihZRF*Ot) zc+rTpje-8X>mib!9Cl5%(NJ%DDxSnv8kaZS3T~_pG(CzqZiF)pO2_}PQp+R6XD>56 z@JW*4xYJuA-ssBVv!3Fx5lv-^A{a&+!xi_>+qX9K4*@!Ed@E69j%0Ge_NK^31GL+q zpyI6j2Ls@SX#VF_?)z4qjRne_Oqx{)N@4e}8Lv!gra3T3jVci-5^;ilz89iuHPdOR z&u&09D#+GZD$4c~sX%H7ICb1}lrkk@s!%mS?25i^($NAqZv<8*sHpvq7<3A|p;*a& zU)Q0R8y!b+uCs4c_zK8tv_bj!(t*5a?lRgaX$_nolgx2uvIxP+SY8G>JDi3L2qwZD z+%1_ZftiP9rAp4zw9(-n6V)8w_CmYQqQpSHRV0)zdC;p_urid`D9r8)n%mkCd&4CF z{Q#(}ZGHr5Q+!mD+lF|AZdY^2*wzWl-LI>R*Cs_nm z^m=t|)*mZ-f73iksOJ85w1L`}_Br)Plm|p(F31tpznL72C z7fswA@%VKc$uHW%iLrL&#bjUUo;3Bj^Bb4Fs%KfOYx_1<<8LBsJ8`bj_kWtUlfMZ)I>VzF{wri0gQ?3i|d|4VDcpA17648?wK zlQ9DUliBnGK#uO>zzw@MCmb<@6i6s-AtS1zd?;J}MMwM#7p8A^lg=eYOks3a8^f$< zePoKi@giu(g9$zD709=^nw?w?8YYhcwe3s5nlG9{!d4OmZ^jvY^Q20c4XQ4O$j)tNqc1wu%Qy;Q#^cLG) z-t=ValUj)7WpBsT9%JLpbX6xcMiRxyAMb~$(QCLq?5!3sma!%M?SmKk4peoDFd9#o z*^NIJX-^P7D(;xkDNd4J3K`xX!A9UtAQV|orcJPkGojMUzKp%4TunJQ)SVx~YI;zX z_$T)5{xIyf$0=ew7Mq5i_vPLU;HatG!Tc+ry!pBJ&m3dFjfSmBgq@z$2Cj!JeFRlS zY}Ru`G?Nm%oyW_i67^`~=A}O-1z8}8^_-%JQRXnL*f?xxfXiOz{sUhS*LQFv7S z!E{lkKQfryt=n8n)z09^8gGP0-g=m2P_<}?v_yOT^7icv4b>K63t7%O29+r6f5ThI zy!eiYWor1xgSKb-w%2TLe2WMB!oA?@jv<&{D?}8N%6e5tA?2q7Jfb17-hAutnf|Zt z@xG`|=gu=Ly?={dG-OeVcwz|ZLD6KC;v+S@x*L^J*O4W@();-RL&7-b^laicvcH;d zdGA|+Y|hI9N6r`2=*l9zOA)cewoxQX>ytur-;SSr+0~Ikx}Ts1iy_?iKjnoiYMI^( zthv_rLRo$>{8;o%Pu9`^>qLa^nL6yOe_lf4NOn7w9A_%?T5u_qvz{SOcH&w{SVlVe zdtK9ii;9R?;n@1;pm$j?b^_PO#QG4gmns2*b!@n3YEaw=Mn}jQRC+(^X%>~J4OHYx zQGR~=P_z^CmX|=3d9sG8#Rw01%QO`&jF-`FJcyb7rQ+~vg<>d*6)6VD1Ns<7XWueS-ecoE`unB24TH@7hjnw zTRE|{n$ec7TVRdAToXFVv3ZYy8e;AF=xH1!B3sC;Y;k~Tr zyHJxaX?1FuNbpXANih%2xN;i!wsHnnSTtt1^!pIpKYFUTnP`t{{CAmnMNPIr?^<{m z#-EmL+N3bK?518DqWKQABeU`H<@Um3-+x(@U&9E0(tL~sS}V|!^(rcQd`v}@O1-(2 z`$S5TV?sZ@9m&;TBn2Is;`%VrKk9P2>sL_vi>Wfg8ynN>xAtjEALPnU1~NiCc{viy z9%moE>a=f{m{osH+MdHFaIy(Hql?cFor~#3)bKU&!m?aKdLKyI(#XqJl?{BTzqYihEMXmF%`oT10wbSd=B?j+fM_|C^7L?dmZa8XOIfazy z{it}krmTpIcg`PU=`nXsu2dpOV(=~xkp;qS$|GmP&vtCMI%Q$jvVQjb^;9)Ed2&-x|!|8D~L?ebbKM)Ph zkj;J}r<8@ahA|{RXWciTJD`z?xP;B{By=KbL*uSg2KwxX9#TyVX@N(y_ zNBCB`AeG90Rj$3aP~%YZxG1pA4gDZw!eK0_`LywPo)IIQPX4K@d8TKiWGlJi&RT-}KPY^sGudXqg#Tqt?A85e-h{enIgORFkvZNGj=L6F zJGodBj#hXuKDskB>E*LHGGKraKJ8zniK%y*YP{w`k!7UudO-~96qfeUrog?&z9 z?uIT@>--!1 z8914IfhE_*J=FU|#R(mLw9{IZm3)|8C03K4>KAzYmpx{RJnJ|xymq61K{UcZ9SMxV zq3-N+@*1mgmOC$jzp#Iv*h~H;v3DPLQUBrh>N8gT_kOC}CILvU9S!!zWxC%>5l7+P zC!aEosg`FNtz~v}9wy&)di^ATuh3)W1byq*?3Pu*Y!us*Y*?j^Dd=b4v45) zYHcCUt1pB^sD`{7!)p9Vqc*r}{Nv=Y@2Sd%`p97KL0H*kOAyvARA8N~47Kw{joVn& zIeuV^g)P;lA!}50uYcjEf(g8!InqIohQqd#Y$BgUQ~CVr9!pJG-^d1Yg>?l90Qb5K z)13vt;GMEI%*U~}bF z490!;XJ@jTpIZx3aFn<`iCSzD>?VuPZ&Q9zYGv8jjyDfHZ7{VZM#r^y+cO!1#lpU}m23DCuAAs++C`R=p+^1DB0#~35wFiwb9 zl_BjG{|%`+%Z>bxvr!jl~Gw7GSLp$%2fqyS> zhQS_VUc#iR4ZVF&b)Xvy0&lXK>pyq7h*9zvreE0aC-y4ge_nMg`tIYJNo+B4x8Y^B zw$!+j#I@IBudpjpmKb47xPFIhJMHot-Ew&uXD!gLgvSq8-#1#b52p1F^o}L-f>t#T z|0hH~C*D*2S>#%oS1s{YQ|{o_R&8Qt>X~7x_Tzhy^|zuWcys&($5Iy+%hQDM(I!ET zSL`V9>_vh=8EB?<8P|7W`}HN$Z3Z}9nvJ7;hf+L?0Zm=_>%lMQB=7!_xFj2uitkKD zB71Y-Ez|}i8Lw=X6MKPiGJIM1^|9F+i*Ha5*av6l4c^;NFr_3EQ5(oSU8ZBWcVmK} zTv;B3H*hbyxL4_-TY~I+pMW4GwK2tfPf^-bO#xKmx7Cx9#{LLWx)7ah&Mb#e)7Bl;MA!NFrLLO)-Q=83mjTr+f^PcuQzeRGH zJ=z%Zi^0-sR+id^yyRBkd1DpkACb?>1_V5H`~IDDn|3d>Qt}vHhqqOew29i$?o$qA}()%erizDHPnNo_mSp4%_lZFc-S=g895WA8KpHw%* zH4kp6C|fbG^#JVn1t%02m-=HiR_!S$iInYB=(bNO)~uu>qQhkvX_{I5El&&qMD=VmSaGv zSv?rcL@ljB)e&e(XXU1p?;Y3R+aH^K#w~*;;!ABE%{Ubl51x|A&bBM!k=`%xsewW< zQ$0>=bTqhV#TjXr@K+ zKxXejDDgTqQTG`);JB$ae@K}qqV*A!b{bCwLo~T9ta~29`r@5ItzzGYRRL!@UW>Io z?JtHgyzZ+>Z`D=v5!6Faf?o3aF~!?xvNr<6wF+Y};~jr^r*gK-mqm;2GrLa0`-FAC zm{*YOVjezAf=_ix(7gn(?Tyk6w zeXF>sFEnNKKwb>AKEmAMJVD0QRZ82ZhT+xH9ha5ZQ+P41FqjrXNKQ8-DgcYumgxM; ze|Kplj^KvgopTg_VfY|GWBh~2n(WWITTf*z9?wZ9E$5<{QZ5P%@D*$2VUw&mw)FiG zAm3&qAbF~OiUp{H21hD1Tod)ryg@i4Kqn3Stq=U5#9IrT93Plj zt)5rM0}1(&(q1A0{io1Dly4JEmL?0|z*HTp9zY5zV(%(I0mY#F@79BeI)qv1eJo1J zbrEG2$=6c+{F}TWg44Y>m)=)y8zaiTJ-hyO{pI8{)=*=3VOtTHR=Ut05FiXhHv&EU z90hj2UDNoB?eb-6Lc3s60k9bl{7!~GCiU9rzL=QFvY7DUFZ8&ZYGX)DIg!gMZ%h;W zb$yPJgg%wpz(y$5W-7bdx*Rni%H(j;-pXh-@Nxqyx^%DEG~Cc8T%SEon@HTRjH@qq zNXZIw`QGg<8epYcXxd`dpY2`6asUfiO0$*jCmte{_@({EmWb(;>|Az1JU+_%7P zbU@G$**=Vq2{4l<%XETpN_&kpv;P9OXogO|+0+-Pw{#B}^WygzY~!n6pK1fM=Q_+? zNHJok@rWHrcI_w$Eup9C>f#w8gl|>$64zkfAX|*UG;Q9s7=s{_`)hP=6ppaGy9P;|1U!>~ZJNILwd%pf_NbFSv&+c@i8n2AJ>R*UskX1ev(Q0W|%C z2~Q#Jc^*6L#@4{{xKO|066ni4Xpc}NQ59uoGa#M`2HFFsUK7cNOZWb3&T%+pfrAhR zi0xFHb|a*Wm%9JB;{Rv=Y~I#XrA@WiYng-pp>PD6`k2((jRw&0To;%q*D>iF;1q)J zR84k&x0H*;=OxE9Kxn~+M007lm@w>zO8`pF(0I1}6C_txpekPLTJG)#i+`Rw&$Mac zaD3P+@obpyDK=&L= zU#J=(MjnTDJ)jF{5{39|ks7?|Iw1vqFqJt=R9Cde2Rq;yFZ+!ZpG93as>f Date: Tue, 31 Jul 2018 23:32:22 +0800 Subject: [PATCH 26/87] auto commit --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 5e49a332..e6c2eea2 100644 --- a/README.md +++ b/README.md @@ -135,6 +135,10 @@ XSS、CSRF、SQL 注入、DDoS 一些 Git 的使用和概念。 +> [Docker](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/Docker.md) + +Docker 基本原理。 + > [正则表达式](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/正则表达式.md) 参考 正则表达式必知必会。 From ec0f8feef7c9fb2e283921f6305c048915c8ba83 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Wed, 1 Aug 2018 00:14:36 +0800 Subject: [PATCH 27/87] auto commit --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index e6c2eea2..fe167481 100644 --- a/README.md +++ b/README.md @@ -143,6 +143,10 @@ Docker 基本原理。 参考 正则表达式必知必会。 +> [构建工具](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/构建工具.md) + +参考 正则表达式必知必会。 + ## 编码实践 :speak_no_evil: > [重构](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/重构.md) From 872c20998733315311b2cbbefbbee131f4c0ca07 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Wed, 1 Aug 2018 00:15:26 +0800 Subject: [PATCH 28/87] auto commit --- notes/构建工具.md | 147 ++++++++++++++++++ pics/897503d0-59e3-4752-903d-529fbdb72fee.jpg | Bin 0 -> 20480 bytes 2 files changed, 147 insertions(+) create mode 100644 notes/构建工具.md create mode 100644 pics/897503d0-59e3-4752-903d-529fbdb72fee.jpg diff --git a/notes/构建工具.md b/notes/构建工具.md new file mode 100644 index 00000000..ae1cac20 --- /dev/null +++ b/notes/构建工具.md @@ -0,0 +1,147 @@ + +* [一、什么是构建工具](#一什么是构建工具) +* [二、Java 主流构建工具](#二java-主流构建工具) +* [三、Maven](#三maven) + + + +# 一、什么是构建工具 + +构建工具用于构建项目的自动化工具,主要包含以下工作: + +## 依赖管理 + +不再需要手动导入 Jar 依赖包,并且可以自动处理依赖关系,也就是说某个依赖如果依赖于其它依赖,构建工具可以帮助我们自动处理这种依赖管理; + +## 运行单元测试 + +不再需要在项目代码中添加测试代码。 + +## 将源代码转化为可执行文件 + +包含预处理、编译、汇编、链接等步骤。 + +## 将可执行文件进行打包 + +不再需要使用 IDE 将应用程序打包成 Jar 包。 + +## 发布到生成服务器上 + +不再需要通过 FTP 将 Jar 包上传到服务器上。 + +参考资料: + +- [What is a build tool?](https://stackoverflow.com/questions/7249871/what-is-a-build-tool) + +# 二、Java 主流构建工具 + +主要包括 Ant、Maven 和 Gradle。 + +


+ +Gradle 和 Maven 的区别是,它使用 Groovy 这种特定领域语言(DSL)来管理构建脚本,而不再使用 XML 这种标记性语言。因为项目如果庞大的话,XML 很容易就变得臃肿。 + +例如要在项目中引入 Junit,Maven 的代码如下: + +```xml + + + 4.0.0 + + jizg.study.maven.hello + hello-first + 0.0.1-SNAPSHOT + + + + junit + junit + 4.10 + test + + + +``` + +而 Gradle 只需要几行代码: + +```java +dependencies { + testCompile "junit:junit:4.10" +} +``` + +参考资料: + +- [Java Build Tools Comparisons: Ant vs Maven vs Gradle](https://programmingmitra.blogspot.com/2016/05/java-build-tools-comparisons-ant-vs.html) +- [maven 2 gradle](http://sagioto.github.io/maven2gradle/) +- [新一代构建工具 gradle](https://www.imooc.com/learn/833) + +# 三、Maven + +## 概述 + +提供了项目对象模型(POM)文件来管理项目的构建。 + +## 仓库 + +仓库的搜索顺序为:本地仓库、中央仓库、远程仓库。 + +- 本地仓库用来存储项目的依赖库; +- 中央仓库是下载依赖库的默认位置; +- 远程仓库,因为并非所有的库存储在中央仓库,或者中央仓库访问速度很慢,远程仓库是中央仓库的补充。 + +## POM + +POM 代表项目对象模型,它是一个 XML 文件,保存在项目根目录的 pom.xml 文件中。 + +```xml + + junit + junit + 4.12 + test + +``` + +[groupId, artifactId, version, packaging, classfier] 称为一个项目的坐标,其中 groupId、artifactId、version 必须定义,packaging 可选(默认为 Jar),classfier 不能直接定义的,需要结合插件使用。 + +- groupId:项目组 Id,必须全球唯一; +- artifactId:项目 Id,即项目名; +- version:项目版本; +- packaging:项目打包方式。 + +## 依赖原则 + +### 依赖路径最短优先原则 + +```html +A -> B -> C -> X(1.0) +A -> D -> X(2.0) +``` +由于 X(2.0) 路径最短,所以使用 X(2.0)。 + +### 声明顺序优先原则 + +```html +A -> B -> X(1.0) +A -> C -> X(2.0) +``` + +在 POM 中最先声明的优先,上面的两个依赖如果先声明 B,那么最后使用 X(1.0)。 + +### 覆写优先原则 + +子 POM 内声明的依赖优先于父 POM 中声明的依赖。 + +## 解决依赖冲突 + +找到 Maven 加载的 Jar 包版本,使用 `mvn dependency:tree` 查看依赖树,根据依赖原则来调整依赖在 POM 文件的声明顺序。 + +参考资料: + +- [POM Reference](http://maven.apache.org/pom.html#Dependency_Version_Requirement_Specification) + + + diff --git a/pics/897503d0-59e3-4752-903d-529fbdb72fee.jpg b/pics/897503d0-59e3-4752-903d-529fbdb72fee.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e0935e5715e3a6e196b2046bcf0547d4800d4c3f GIT binary patch literal 20480 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 Date: Wed, 1 Aug 2018 00:16:52 +0800 Subject: [PATCH 29/87] auto commit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fe167481..c06de1d0 100644 --- a/README.md +++ b/README.md @@ -145,7 +145,7 @@ Docker 基本原理。 > [构建工具](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/构建工具.md) -参考 正则表达式必知必会。 +构建工具的基本概念、主流构建工具介绍 ## 编码实践 :speak_no_evil: From 5c6d152dba5f4cdcd78827db3605e206424b6713 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Wed, 1 Aug 2018 00:20:53 +0800 Subject: [PATCH 30/87] auto commit --- notes/构建工具.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/notes/构建工具.md b/notes/构建工具.md index ae1cac20..c0e4acd5 100644 --- a/notes/构建工具.md +++ b/notes/构建工具.md @@ -7,15 +7,15 @@ # 一、什么是构建工具 -构建工具用于构建项目的自动化工具,主要包含以下工作: +构建工具是用于构建项目的自动化工具,主要包含以下工作: ## 依赖管理 -不再需要手动导入 Jar 依赖包,并且可以自动处理依赖关系,也就是说某个依赖如果依赖于其它依赖,构建工具可以帮助我们自动处理这种依赖管理; +不再需要手动导入 Jar 依赖包,并且可以自动处理依赖关系,也就是说某个依赖如果依赖于其它依赖,构建工具可以帮助我们自动处理这种依赖管理。 ## 运行单元测试 -不再需要在项目代码中添加测试代码。 +不再需要在项目代码中添加测试代码,从而污染项目代码。 ## 将源代码转化为可执行文件 @@ -25,7 +25,7 @@ 不再需要使用 IDE 将应用程序打包成 Jar 包。 -## 发布到生成服务器上 +## 发布到生产服务器上 不再需要通过 FTP 将 Jar 包上传到服务器上。 From 428975aef07fa091034df033790aade5e189e78b Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Wed, 1 Aug 2018 00:56:41 +0800 Subject: [PATCH 31/87] =?UTF-8?q?Java=20=E5=87=BD=E6=95=B0=E9=87=8D?= =?UTF-8?q?=E5=86=99=E6=97=B6=EF=BC=8C=E5=AD=90=E7=B1=BB=E7=9A=84=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E5=80=BC=E7=B1=BB=E5=9E=8B=E8=A6=81=E7=AD=89=E4=BA=8E?= =?UTF-8?q?=E6=88=96=E8=80=85=E5=B0=8F=E4=BA=8E=E7=88=B6=E7=B1=BB=E7=9A=84?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- notes/Java 基础.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/notes/Java 基础.md b/notes/Java 基础.md index 907eea00..564d643e 100644 --- a/notes/Java 基础.md +++ b/notes/Java 基础.md @@ -549,9 +549,9 @@ SuperExtendExample.func() ## 重写与重载 -- 重写(Override)存在于继承体系中,指子类实现了一个与父类在方法声明上完全相同的一个方法; +- 重写(Override)存在于继承体系中,指子类实现了一个与父类在方法声明上完全相同的一个方法,子类的返回值类型要等于或者小于父类的返回值; -- 重载(Overload)存在于同一个类中,指一个方法与已经存在的方法名称上相同,但是参数类型、个数、顺序至少有一个不同。应该注意的是,返回值不同,其它都相同不算是重载。 +- 重载(Overload)存在于同一个类中,指一个方法与已经存在的方法名称上相同,但是参数类型、个数、顺序至少有一个不同。应该注意的是,返回值不同,其它都相同不算是重载,但如果返回值类型等于或者小于父类的返回值则算是重写。 # 五、Object 通用方法 From 34f1d045617c9db1c36e71f1d44f268ae455252a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=91=E6=B0=B8=E5=B7=9D?= Date: Wed, 1 Aug 2018 09:53:19 +0800 Subject: [PATCH 32/87] Update README.md --- README.md | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index c06de1d0..fe49083c 100644 --- a/README.md +++ b/README.md @@ -175,7 +175,9 @@ Google 开源项目的代码风格规范。 笔记内容是笔者一个字一个字打上去的,难免会有一些笔误,如果发现笔误可直接在相应文档进行编辑修改。 -欢迎提交对本仓库的改进建议~ +如果想要提交一个仓库现在还没有的全新内容,可以先将相应的文档放到 other 目录下。 + +欢迎在 Issue 中提交对本仓库的改进建议~ **Authorization** @@ -183,21 +185,21 @@ Google 开源项目的代码风格规范。 转载使用请注明出处,谢谢! -**Uploading** - -笔者在本地使用为知笔记软件进行书写,为了方便将本地笔记内容上传到 Github 上,实现了一整套自动化上传方案,包括文本文件的导出、提取图片、Markdown 文档转换、Git 同步。 - -进行 Markdown 文档转换是因为 Github 使用的 GFM 不支持 MathJax 公式和 TOC 标记,所以需要替换 MathJax 公式为 CodeCogs 的云服务和重新生成 TOC 目录。 - -这里提供了笔者实现的 GFM 文档转换工具的链接:[GFM-Converter](https://github.com/CyC2018/GFM-Converter)。 - **Typesetting** 笔记内容按照 [中文文案排版指北](http://mazhuang.org/wiki/chinese-copywriting-guidelines/) 进行排版,以保证内容的可读性。 笔记不使用 `![]()` 这种方式来引用图片,而是用 `` 标签。一方面是为了能够控制图片以合适的大小显示,另一方面是因为 GFM 不支持 `
![]()
` 让图片居中显示,只能使用 `
` 达到居中的效果。 -这里提供了笔者实现的中英混排文档在线排版工具的链接:[Text-Typesetting](https://github.com/CyC2018/Markdown-Typesetting)。 +笔者将自己实现的文档排版功能提取出来,放在 Github Page 中,无需下载安装即可免费试用:[Text-Typesetting](https://github.com/CyC2018/Markdown-Typesetting)。 + +**Uploading** + +笔者在本地使用为知笔记软件进行书写,为了方便将本地笔记内容上传到 Github 上,实现了一整套自动化上传方案,包括文本文件的导出、提取图片、Markdown 文档转换、Git 同步。 + +进行 Markdown 文档转换是因为 Github 使用的 GFM 不支持 MathJax 公式和 TOC 标记,所以需要替换 MathJax 公式为 CodeCogs 的云服务和重新生成 TOC 目录。 + +笔者将自己实现文档转换功能提取出来,方便大家在需要将本地 Markdown 上传到 Github,或者制作项目 README 文档时生成目录时使用:[GFM-Converter](https://github.com/CyC2018/GFM-Converter)。 **Statement** From a255b9913befb2158d8310c116742158bb34cf32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=91=E6=B0=B8=E5=B7=9D?= Date: Wed, 1 Aug 2018 09:56:51 +0800 Subject: [PATCH 33/87] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fe49083c..294ac656 100644 --- a/README.md +++ b/README.md @@ -191,7 +191,7 @@ Google 开源项目的代码风格规范。 笔记不使用 `![]()` 这种方式来引用图片,而是用 `` 标签。一方面是为了能够控制图片以合适的大小显示,另一方面是因为 GFM 不支持 `
![]()
` 让图片居中显示,只能使用 `
` 达到居中的效果。 -笔者将自己实现的文档排版功能提取出来,放在 Github Page 中,无需下载安装即可免费试用:[Text-Typesetting](https://github.com/CyC2018/Markdown-Typesetting)。 +笔者将自己实现的文档排版功能提取出来,放在 Github Page 中,无需下载安装即可免费使用:[Text-Typesetting](https://github.com/CyC2018/Markdown-Typesetting)。 **Uploading** From fa13575bfb2e56f4479f9a5501d446a722e00d90 Mon Sep 17 00:00:00 2001 From: fighter Date: Wed, 1 Aug 2018 18:20:48 +0800 Subject: [PATCH 34/87] fix typos --- notes/MySQL.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/notes/MySQL.md b/notes/MySQL.md index d49fc952..0ab28ad8 100644 --- a/notes/MySQL.md +++ b/notes/MySQL.md @@ -95,15 +95,15 @@ VARCHAR 会保留字符串末尾的空格,而 CHAR 会删除。 ## 时间和日期 -MySQL 提供了两种相似的日期时间类型:DATATIME 和 TIMESTAMP。 +MySQL 提供了两种相似的日期时间类型:DATETIME 和 TIMESTAMP。 -### 1. DATATIME +### 1. DATETIME 能够保存从 1001 年到 9999 年的日期和时间,精度为秒,使用 8 字节的存储空间。 它与时区无关。 -默认情况下,MySQL 以一种可排序的、无歧义的格式显示 DATATIME 值,例如“2008-01-16 22:37:08”,这是 ANSI 标准定义的日期和时间表示方法。 +默认情况下,MySQL 以一种可排序的、无歧义的格式显示 DATETIME 值,例如“2008-01-16 22:37:08”,这是 ANSI 标准定义的日期和时间表示方法。 ### 2. TIMESTAMP @@ -329,7 +329,7 @@ Explain 用来分析 SELECT 查询语句,开发人员可以通过分析 Explai 一个大查询如果一次性执行的话,可能一次锁住很多数据、占满整个事务日志、耗尽系统资源、阻塞很多小的但重要的查询。 ```sql -DELEFT FROM messages WHERE create < DATE_SUB(NOW(), INTERVAL 3 MONTH); +DELETE FROM messages WHERE create < DATE_SUB(NOW(), INTERVAL 3 MONTH); ``` ```sql @@ -351,7 +351,7 @@ do { - 查询本身效率也可能会有所提升。例如下面的例子中,使用 IN() 代替连接查询,可以让 MySQL 按照 ID 顺序进行查询,这可能比随机的连接要更高效。 ```sql -SELECT * FROM tab +SELECT * FROM tag JOIN tag_post ON tag_post.tag_id=tag.id JOIN post ON tag_post.post_id=post.id WHERE tag.tag='mysql'; From ef16ad9ed6152cbcf28a3636c846632ca104bd34 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Thu, 2 Aug 2018 00:24:52 +0800 Subject: [PATCH 35/87] auto commit --- notes/HTTP.md | 81 ++++++++++++++++++++++++++--------------- notes/Java 基础.md | 2 +- notes/MySQL.md | 6 +-- notes/计算机操作系统.md | 31 +++++++++++----- 4 files changed, 77 insertions(+), 43 deletions(-) diff --git a/notes/HTTP.md b/notes/HTTP.md index 7f54bd1a..243dc283 100644 --- a/notes/HTTP.md +++ b/notes/HTTP.md @@ -360,9 +360,9 @@ console.log(document.cookie); ### 5. Secure 和 HttpOnly -标记为 Secure 的 Cookie 只应通过被 HTTPS 协议加密过的请求发送给服务端。但即便设置了 Secure 标记,敏感信息也不应该通过 Cookie 传输,因为 Cookie 有其固有的不安全性,Secure 标记也无法提供确实的安全保障。 +标记为 Secure 的 Cookie 只能通过被 HTTPS 协议加密过的请求发送给服务端。但即便设置了 Secure 标记,敏感信息也不应该通过 Cookie 传输,因为 Cookie 有其固有的不安全性,Secure 标记也无法提供确实的安全保障。 -标记为 HttpOnly 的 Cookie 不能被 JavaScript 脚本调用。因为跨站脚本攻击 (XSS) 常常使用 JavaScript 的 `Document.cookie` API 窃取用户的 Cookie 信息,因此使用 HttpOnly 标记可以在一定程度上避免 XSS 攻击。 +标记为 HttpOnly 的 Cookie 不能被 JavaScript 脚本调用。跨站脚本攻击 (XSS) 常常使用 JavaScript 的 `Document.cookie` API 窃取用户的 Cookie 信息,因此使用 HttpOnly 标记可以在一定程度上避免 XSS 攻击。 ```html Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOnly @@ -382,15 +382,15 @@ Path 标识指定了主机下的哪些路径可以接受 Cookie(该 URL 路径 除了可以将用户信息通过 Cookie 存储在用户浏览器中,也可以利用 Session 存储在服务器端,存储在服务器端的信息更加安全。 -Session 可以存储在服务器上的文件、数据库或者内存中。也可以将 Session 存储在内存型数据库中,比如 Redis。 +Session 可以存储在服务器上的文件、数据库或者内存中。也可以将 Session 存储在内存型数据库中,比如 Redis,效率会更高。 使用 Session 维护用户登录的过程如下: - 用户进行登录时,用户提交包含用户名和密码的表单,放入 HTTP 请求报文中; - 服务器验证该用户名和密码; -- 如果正确则把用户信息存储到 Redis 中,它在 Redis 中的 ID 称为 Session ID; +- 如果正确则把用户信息存储到 Redis 中,它在 Redis 中的 Key 称为 Session ID; - 服务器返回的响应报文的 Set-Cookie 首部字段包含了这个 Session ID,客户端收到响应报文之后将该 Cookie 值存入浏览器中; -- 客户端之后对同一个服务器进行请求时会包含该 Cookie 值,服务器收到之后提取出 Session ID,从 Redis 中取出用户信息,继续之后的业务操作。 +- 客户端之后对同一个服务器进行请求时会包含该 Cookie 值,服务器收到之后提取出 Session ID,从 Redis 中取出用户信息,继续之前的业务操作。 应该注意 Session ID 的安全性问题,不能让它被恶意攻击者轻易获取,那么就不能产生一个容易被猜到的 Session ID 值。此外,还需要经常重新生成 Session ID。在对安全性要求极高的场景下,例如转账等操作,除了使用 Session 管理用户状态之外,还需要对用户进行重新验证,比如重新输入密码,或者使用短信验证码等方式。 @@ -409,7 +409,7 @@ Session 可以存储在服务器上的文件、数据库或者内存中。也可 ### 1. 优点 - 缓解服务器压力; -- 降低客户端获取资源的延迟(缓存资源比服务器上的资源离客户端更近)。 +- 降低客户端获取资源的延迟:缓存通常位于内存中,读取缓存的速度更快。并且缓存在地理位置上也有可能比源服务器来得近,例如浏览器缓存。 ### 2. 实现方法 @@ -460,7 +460,10 @@ max-age 指令出现在响应报文中,表示缓存资源在缓存服务器中 Cache-Control: max-age=31536000 ``` -Expires 首部字段也可以用于告知缓存服务器该资源什么时候会过期。在 HTTP/1.1 中,会优先处理 Cache-Control : max-age 指令;而在 HTTP/1.0 中,Cache-Control : max-age 指令会被忽略掉。 +Expires 首部字段也可以用于告知缓存服务器该资源什么时候会过期。 + +- 在 HTTP/1.1 中,会优先处理 max-age 指令; +- 在 HTTP/1.0 中,max-age 指令会被忽略掉。 ```html Expires: Wed, 04 Jul 2012 08:26:05 GMT @@ -496,13 +499,16 @@ If-Modified-Since: Wed, 21 Oct 2015 07:28:00 GMT ### 1. 短连接与长连接 -当浏览器访问一个包含多张图片的 HTML 页面时,除了请求访问 HTML 页面资源,还会请求图片资源,如果每进行一次 HTTP 通信就要断开一次 TCP 连接,连接建立和断开的开销会很大。长连接只需要建立一次 TCP 连接就能进行多次 HTTP 通信。 +当浏览器访问一个包含多张图片的 HTML 页面时,除了请求访问 HTML 页面资源,还会请求图片资源。如果每进行一次 HTTP 通信就要断开一次 TCP 连接,连接建立和断开的开销会很大。 -从 HTTP/1.1 开始默认是长连接的,如果要断开连接,需要由客户端或者服务器端提出断开,使用 Connection : close;而在 HTTP/1.1 之前默认是短连接的,如果需要长连接,则使用 Connection : Keep-Alive。 +长连接只需要建立一次 TCP 连接就能进行多次 HTTP 通信。 + +- 从 HTTP/1.1 开始默认是长连接的,如果要断开连接,需要由客户端或者服务器端提出断开,使用 `Connection : close`; +- 在 HTTP/1.1 之前默认是短连接的,如果需要使用长连接,则使用 `Connection : Keep-Alive`。 ### 2. 流水线 -默认情况下,HTTP 请求是按顺序发出的,下一个请求只有在当前请求收到相应之后才会被发出。由于会受到网络延迟和带宽的限制,在下一个请求被发送到服务器之前,可能需要等待很长时间。 +默认情况下,HTTP 请求是按顺序发出的,下一个请求只有在当前请求收到响应之后才会被发出。由于会受到网络延迟和带宽的限制,在下一个请求被发送到服务器之前,可能需要等待很长时间。 流水线是在同一条长连接上发出连续的请求,而不用等待响应返回,这样可以避免连接延迟。 @@ -512,17 +518,17 @@ If-Modified-Since: Wed, 21 Oct 2015 07:28:00 GMT ### 1. 类型 -**(一)服务端驱动型内容协商** +**(一)服务端驱动型** 客户端设置特定的 HTTP 首部字段,例如 Accept、Accept-Charset、Accept-Encoding、Accept-Language、Content-Languag,服务器根据这些字段返回特定的资源。 它存在以下问题: - 服务器很难知道客户端浏览器的全部信息; -- 客户端提供的信息相当冗长(HTTP/2 协议的首部压缩机制缓解了这个问题),并且存在隐私风险(HTTP 指纹识别技术)。 +- 客户端提供的信息相当冗长(HTTP/2 协议的首部压缩机制缓解了这个问题),并且存在隐私风险(HTTP 指纹识别技术); - 给定的资源需要返回不同的展现形式,共享缓存的效率会降低,而服务器端的实现会越来越复杂。 -**(二)代理驱动型协商** +**(二)代理驱动型** 服务器返回 300 Multiple Choices 或者 406 Not Acceptable,客户端从中选出最合适的那个资源。 @@ -538,9 +544,11 @@ Vary: Accept-Language ## 内容编码 -内容编码将实体主体进行压缩,从而减少传输的数据量。常用的内容编码有:gzip、compress、deflate、identity。 +内容编码将实体主体进行压缩,从而减少传输的数据量。 -浏览器发送 Accept-Encoding 首部,其中包含有它所支持的压缩算法,以及各自的优先级,服务器则从中选择一种,使用该算法对响应的消息主体进行压缩,并且发送 Content-Encoding 首部来告知浏览器它选择了哪一种算法。由于该内容协商过程是基于编码类型来选择资源的展现形式的,在响应中,Vary 首部中至少要包含 Content-Encoding,这样的话,缓存服务器就可以对资源的不同展现形式进行缓存。 +常用的内容编码有:gzip、compress、deflate、identity。 + +浏览器发送 Accept-Encoding 首部,其中包含有它所支持的压缩算法,以及各自的优先级。服务器则从中选择一种,使用该算法对响应的消息主体进行压缩,并且发送 Content-Encoding 首部来告知浏览器它选择了哪一种算法。由于该内容协商过程是基于编码类型来选择资源的展现形式的,在响应的 Vary 首部至少要包含 Content-Encoding。 ## 范围请求 @@ -622,10 +630,14 @@ HTTP/1.1 使用虚拟主机技术,使得一台服务器拥有多个域名, - 网络访问控制 - 访问日志记录 -代理服务器分为正向代理和反向代理两种,用户察觉得到正向代理的存在;而反向代理一般位于内部网络中,用户察觉不到。 +代理服务器分为正向代理和反向代理两种: + +- 用户察觉得到正向代理的存在。

+- 而反向代理一般位于内部网络中,用户察觉不到。 +

### 2. 网关 @@ -634,7 +646,7 @@ HTTP/1.1 使用虚拟主机技术,使得一台服务器拥有多个域名, ### 3. 隧道 -使用 SSL 等加密手段,为客户端和服务器之间建立一条安全的通信线路。 +使用 SSL 等加密手段,在客户端和服务器之间建立一条安全的通信线路。 # 六、HTTPs @@ -644,7 +656,7 @@ HTTP 有以下安全性问题: - 不验证通信方的身份,通信方的身份有可能遭遇伪装; - 无法证明报文的完整性,报文有可能遭篡改。 -HTTPs 并不是新协议,而是让 HTTP 先和 SSL(Secure Sockets Layer)通信,再由 SSL 和 TCP 通信。也就是说 HTTPs 使用了隧道进行通信。 +HTTPs 并不是新协议,而是让 HTTP 先和 SSL(Secure Sockets Layer)通信,再由 SSL 和 TCP 通信,也就是说 HTTPs 使用了隧道进行通信。 通过使用 SSL,HTTPs 具有了加密(防窃听)、认证(防伪装)和完整性保护(防篡改)。 @@ -727,7 +739,11 @@ HTTP/2.0 将报文分成 HEADERS 帧和 DATA 帧,它们都是二进制格式

-在通信过程中,只会有一个 TCP 连接存在,它承载了任意数量的双向数据流(Stream)。一个数据流都有一个唯一标识符和可选的优先级信息,用于承载双向信息。消息(Message)是与逻辑请求或响应消息对应的完整的一系列帧。帧(Fram)是最小的通信单位,来自不同数据流的帧可以交错发送,然后再根据每个帧头的数据流标识符重新组装。 +在通信过程中,只会有一个 TCP 连接存在,它承载了任意数量的双向数据流(Stream)。 + +- 一个数据流都有一个唯一标识符和可选的优先级信息,用于承载双向信息。 +- 消息(Message)是与逻辑请求或响应消息对应的完整的一系列帧。 +- 帧(Fram)是最小的通信单位,来自不同数据流的帧可以交错发送,然后再根据每个帧头的数据流标识符重新组装。

@@ -739,7 +755,11 @@ HTTP/2.0 在客户端请求一个资源时,会把相关的资源一起发送 ## 首部压缩 -HTTP/1.1 的首部带有大量信息,而且每次都要重复发送。HTTP/2.0 要求客户端和服务器同时维护和更新一个包含之前见过的首部字段表,从而避免了重复传输。不仅如此,HTTP/2.0 也使用 Huffman 编码对首部字段进行压缩。 +HTTP/1.1 的首部带有大量信息,而且每次都要重复发送。 + +HTTP/2.0 要求客户端和服务器同时维护和更新一个包含之前见过的首部字段表,从而避免了重复传输。 + +不仅如此,HTTP/2.0 也使用 Huffman 编码对首部字段进行压缩。

@@ -751,7 +771,9 @@ GET 用于获取资源,而 POST 用于传输实体主体。 ## 参数 -GET 和 POST 的请求都能使用额外的参数,但是 GET 的参数是以查询字符串出现在 URL 中,而 POST 的参数存储在实体主体中。 +GET 和 POST 的请求都能使用额外的参数,但是 GET 的参数是以查询字符串出现在 URL 中,而 POST 的参数存储在实体主体中。不能因为 POST 参数存储在实体主体中就认为它的安全性更高,因为照样可以通过一些抓包工具(Fiddler)查看。 + +因为 URL 只支持 ASCII 码,因此 GET 的参数中如果存在中文等字符就需要先进行编码。例如 `中文` 会转换为 `%E4%B8%AD%E6%96%87`,而空格会转换为 `%20`。POST 参考支持标准字符集。 ``` GET /test/demo_form.asp?name1=value1&name2=value2 HTTP/1.1 @@ -763,10 +785,6 @@ Host: w3schools.com name1=value1&name2=value2 ``` -不能因为 POST 参数存储在实体主体中就认为它的安全性更高,因为照样可以通过一些抓包工具(Fiddler)查看。 - -因为 URL 只支持 ASCII 码,因此 GET 的参数中如果存在中文等字符就需要先进行编码,例如`中文`会转换为`%E4%B8%AD%E6%96%87`,而空格会转换为`%20`。POST 支持标准字符集。 - ## 安全 安全的 HTTP 方法不会改变服务器状态,也就是说它只是可读的。 @@ -779,9 +797,13 @@ GET 方法是安全的,而 POST 却不是,因为 POST 的目的是传送实 ## 幂等性 -幂等的 HTTP 方法,同样的请求被执行一次与连续执行多次的效果是一样的,服务器的状态也是一样的。换句话说就是,幂等方法不应该具有副作用(统计用途除外)。在正确实现的条件下,GET,HEAD,PUT 和 DELETE 等方法都是幂等的,而 POST 方法不是。所有的安全方法也都是幂等的。 +幂等的 HTTP 方法,同样的请求被执行一次与连续执行多次的效果是一样的,服务器的状态也是一样的。换句话说就是,幂等方法不应该具有副作用(统计用途除外)。 -GET /pageX HTTP/1.1 是幂等的。连续调用多次,客户端接收到的结果都是一样的: +所有的安全方法也都是幂等的。 + +在正确实现的条件下,GET,HEAD,PUT 和 DELETE 等方法都是幂等的,而 POST 方法不是。 + +GET /pageX HTTP/1.1 是幂等的,连续调用多次,客户端接收到的结果都是一样的: ``` GET /pageX HTTP/1.1 @@ -790,7 +812,7 @@ GET /pageX HTTP/1.1 GET /pageX HTTP/1.1 ``` -POST /add_row HTTP/1.1 不是幂等的。如果调用多次,就会增加多行记录: +POST /add_row HTTP/1.1 不是幂等的,如果调用多次,就会增加多行记录: ``` POST /add_row HTTP/1.1 -> Adds a 1nd row @@ -820,7 +842,8 @@ DELETE /idX/delete HTTP/1.1 -> Returns 404 > XMLHttpRequest 是一个 API,它为客户端提供了在客户端和服务器之间传输数据的功能。它提供了一个通过 URL 来获取数据的简单方式,并且不会使整个页面刷新。这使得网页只更新一部分页面而不会打扰到用户。XMLHttpRequest 在 AJAX 中被大量使用。 -在使用 XMLHttpRequest 的 POST 方法时,浏览器会先发送 Header 再发送 Data。但并不是所有浏览器会这么做,例如火狐就不会。而 GET 方法 Header 和 Data 会一起发送。 +- 在使用 XMLHttpRequest 的 POST 方法时,浏览器会先发送 Header 再发送 Data。但并不是所有浏览器会这么做,例如火狐就不会。 +- 而 GET 方法 Header 和 Data 会一起发送。 # 九、HTTP/1.0 与 HTTP/1.1 的区别 diff --git a/notes/Java 基础.md b/notes/Java 基础.md index 907eea00..cda00ea0 100644 --- a/notes/Java 基础.md +++ b/notes/Java 基础.md @@ -549,7 +549,7 @@ SuperExtendExample.func() ## 重写与重载 -- 重写(Override)存在于继承体系中,指子类实现了一个与父类在方法声明上完全相同的一个方法; +- 重写(Override)存在于继承体系中,指子类实现了一个与父类在方法声明上完全相同的一个方法,子类的返回值类型要等于或者小于父类的返回值; - 重载(Overload)存在于同一个类中,指一个方法与已经存在的方法名称上相同,但是参数类型、个数、顺序至少有一个不同。应该注意的是,返回值不同,其它都相同不算是重载。 diff --git a/notes/MySQL.md b/notes/MySQL.md index d49fc952..f6aa853b 100644 --- a/notes/MySQL.md +++ b/notes/MySQL.md @@ -95,15 +95,15 @@ VARCHAR 会保留字符串末尾的空格,而 CHAR 会删除。 ## 时间和日期 -MySQL 提供了两种相似的日期时间类型:DATATIME 和 TIMESTAMP。 +MySQL 提供了两种相似的日期时间类型:DATETIME 和 TIMESTAMP。 -### 1. DATATIME +### 1. DATETIME 能够保存从 1001 年到 9999 年的日期和时间,精度为秒,使用 8 字节的存储空间。 它与时区无关。 -默认情况下,MySQL 以一种可排序的、无歧义的格式显示 DATATIME 值,例如“2008-01-16 22:37:08”,这是 ANSI 标准定义的日期和时间表示方法。 +默认情况下,MySQL 以一种可排序的、无歧义的格式显示 DATETIME 值,例如“2008-01-16 22:37:08”,这是 ANSI 标准定义的日期和时间表示方法。 ### 2. TIMESTAMP diff --git a/notes/计算机操作系统.md b/notes/计算机操作系统.md index 52c74dd7..5c9f63a7 100644 --- a/notes/计算机操作系统.md +++ b/notes/计算机操作系统.md @@ -1,7 +1,7 @@ * [一、概述](#一概述) - * [操作系统基本特征](#操作系统基本特征) - * [操作系统基本功能](#操作系统基本功能) + * [基本特征](#基本特征) + * [基本功能](#基本功能) * [系统调用](#系统调用) * [大内核和微内核](#大内核和微内核) * [中断分类](#中断分类) @@ -35,7 +35,7 @@ # 一、概述 -## 操作系统基本特征 +## 基本特征 ### 1. 并发 @@ -63,7 +63,7 @@ 异步指进程不是一次性执行完毕,而是走走停停,以不可知的速度向前推进。 -## 操作系统基本功能 +## 基本功能 ### 1. 进程管理 @@ -152,19 +152,27 @@ Linux 的系统调用主要有以下这些: 一个进程中可以有多个线程,它们共享进程资源。 +QQ 和浏览器是两个进程,浏览器进程里面有很多线程,例如 HTTP 请求线程、事件响应线程、渲染线程等等,线程的并发执行使得在浏览器中点击一个新链接从而发起 HTTP 请求时,浏览器还可以响应用户的其它事件。 +

### 3. 区别 -- 拥有资源:进程是资源分配的基本单位,但是线程不拥有资源,线程可以访问隶属进程的资源。 +(一)拥有资源 -- 调度:线程是独立调度的基本单位,在同一进程中,线程的切换不会引起进程切换,从一个进程内的线程切换到另一个进程中的线程时,会引起进程切换。 +进程是资源分配的基本单位,但是线程不拥有资源,线程可以访问隶属进程的资源。 -- 系统开销:由于创建或撤销进程时,系统都要为之分配或回收资源,如内存空间、I/O 设备等,所付出的开销远大于创建或撤销线程时的开销。类似地,在进行进程切换时,涉及当前执行进程 CPU 环境的保存及新调度进程 CPU 环境的设置,而线程切换时只需保存和设置少量寄存器内容,开销很小。 +(二)调度 -- 通信方面:进程间通信 (IPC) 需要进程同步和互斥手段的辅助,以保证数据的一致性。而线程间可以通过直接读/写同一进程中的数据段(如全局变量)来进行通信。 +线程是独立调度的基本单位,在同一进程中,线程的切换不会引起进程切换,从一个进程内的线程切换到另一个进程中的线程时,会引起进程切换。 -举例:QQ 和浏览器是两个进程,浏览器进程里面有很多线程,例如 HTTP 请求线程、事件响应线程、渲染线程等等,线程的并发执行使得在浏览器中点击一个新链接从而发起 HTTP 请求时,浏览器还可以响应用户的其它事件。 +(三)系统开销 + +由于创建或撤销进程时,系统都要为之分配或回收资源,如内存空间、I/O 设备等,所付出的开销远大于创建或撤销线程时的开销。类似地,在进行进程切换时,涉及当前执行进程 CPU 环境的保存及新调度进程 CPU 环境的设置,而线程切换时只需保存和设置少量寄存器内容,开销很小。 + +(四)通信方面 + +进程间通信 (IPC) 需要进程同步和互斥手段的辅助,以保证数据的一致性。而线程间可以通过直接读/写同一进程中的数据段(如全局变量)来进行通信。 ## 进程状态的切换 @@ -211,7 +219,10 @@ Linux 的系统调用主要有以下这些: 将所有就绪进程按 FCFS 的原则排成一个队列,每次调度时,把 CPU 时间分配给队首进程,该进程可以执行一个时间片。当时间片用完时,由计时器发出时钟中断,调度程序便停止该进程的执行,并将它送往就绪队列的末尾,同时继续把 CPU 时间分配给队首的进程。 -时间片轮转算法的效率和时间片的大小有很大关系。因为进程切换都要保存进程的信息并且载入新进程的信息,如果时间片太小,会导致进程切换得太频繁,在进程切换上就会花过多时间。 +时间片轮转算法的效率和时间片的大小有很大关系: + +- 因为进程切换都要保存进程的信息并且载入新进程的信息,如果时间片太小,会导致进程切换得太频繁,在进程切换上就会花过多时间。 +- 而如果时间片过长,那么实时性就不能得到保证。

From 4ab241fd8175ec4105727c790f01d4a37f6f440c Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Thu, 2 Aug 2018 00:25:48 +0800 Subject: [PATCH 36/87] auto commit --- notes/Java 基础.md | 2 +- notes/MySQL.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/notes/Java 基础.md b/notes/Java 基础.md index 564d643e..cda00ea0 100644 --- a/notes/Java 基础.md +++ b/notes/Java 基础.md @@ -551,7 +551,7 @@ SuperExtendExample.func() - 重写(Override)存在于继承体系中,指子类实现了一个与父类在方法声明上完全相同的一个方法,子类的返回值类型要等于或者小于父类的返回值; -- 重载(Overload)存在于同一个类中,指一个方法与已经存在的方法名称上相同,但是参数类型、个数、顺序至少有一个不同。应该注意的是,返回值不同,其它都相同不算是重载,但如果返回值类型等于或者小于父类的返回值则算是重写。 +- 重载(Overload)存在于同一个类中,指一个方法与已经存在的方法名称上相同,但是参数类型、个数、顺序至少有一个不同。应该注意的是,返回值不同,其它都相同不算是重载。 # 五、Object 通用方法 diff --git a/notes/MySQL.md b/notes/MySQL.md index 0ab28ad8..f6aa853b 100644 --- a/notes/MySQL.md +++ b/notes/MySQL.md @@ -329,7 +329,7 @@ Explain 用来分析 SELECT 查询语句,开发人员可以通过分析 Explai 一个大查询如果一次性执行的话,可能一次锁住很多数据、占满整个事务日志、耗尽系统资源、阻塞很多小的但重要的查询。 ```sql -DELETE FROM messages WHERE create < DATE_SUB(NOW(), INTERVAL 3 MONTH); +DELEFT FROM messages WHERE create < DATE_SUB(NOW(), INTERVAL 3 MONTH); ``` ```sql @@ -351,7 +351,7 @@ do { - 查询本身效率也可能会有所提升。例如下面的例子中,使用 IN() 代替连接查询,可以让 MySQL 按照 ID 顺序进行查询,这可能比随机的连接要更高效。 ```sql -SELECT * FROM tag +SELECT * FROM tab JOIN tag_post ON tag_post.tag_id=tag.id JOIN post ON tag_post.post_id=post.id WHERE tag.tag='mysql'; From 2abde21661dcefbddebdfe96719d7cb12d658bf2 Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Thu, 2 Aug 2018 08:03:42 +0800 Subject: [PATCH 37/87] =?UTF-8?q?Update=20Java=20=E8=99=9A=E6=8B=9F?= =?UTF-8?q?=E6=9C=BA.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- notes/Java 虚拟机.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/notes/Java 虚拟机.md b/notes/Java 虚拟机.md index 3bb9f289..d67ef5bd 100644 --- a/notes/Java 虚拟机.md +++ b/notes/Java 虚拟机.md @@ -102,7 +102,7 @@ Class 文件中的常量池(编译器生成的各种字面量和符号引用 ## 直接内存 -在 JDK 1.4 中新加入了 NIO 类,它可以使用 Native 函数库直接分配堆外内存,然后通过一个存储在 Java 堆里的 DirectByteBuffer 对象作为这块内存的引用进行操作。这样能在一些场景中显著提高性能,因为避免了在 Java 堆和 Native 堆中来回复制数据。 +在 JDK 1.4 中新加入了 NIO 类,它可以使用 Native 函数库直接分配堆外内存,然后通过一个存储在 Java 堆里的 DirectByteBuffer 对象作为这块内存的引用进行操作。这样能在一些场景中显著提高性能,因此避免了在 Java 堆和 Native 堆中来回复制数据。 # 二、垃圾收集 @@ -146,7 +146,7 @@ Java 虚拟机使用该算法来判断对象是否可被回收,在 Java 中 GC ### 3. 引用类型 -无论是通过引用计算算法判断对象的引用数量,还是通过可达性分析算法判断对象是否可达,判定对象是否可被回收都与引用有关。 +无论是通过引用计数算法判断对象的引用数量,还是通过可达性分析算法判断对象是否可达,判定对象是否可被回收都与引用有关。 Java 具有四种强度不同的引用类型。 @@ -256,7 +256,7 @@ finalize() 类似 C++ 的析构函数,用来做关闭外部资源等工作。 一般将 Java 堆分为新生代和老年代。 - 新生代使用:复制算法 -- 老年代使用:标记 - 清理 或者 标记 - 整理 算法 +- 老年代使用:标记 - 清除 或者 标记 - 整理 算法 ## 垃圾收集器 From ef9dc26fb6af0862f532d3efc26915b2c6c4f4be Mon Sep 17 00:00:00 2001 From: Keqi Huang Date: Thu, 2 Aug 2018 08:10:35 +0800 Subject: [PATCH 38/87] =?UTF-8?q?Update=20Java=20=E8=99=9A=E6=8B=9F?= =?UTF-8?q?=E6=9C=BA.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- notes/Java 虚拟机.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notes/Java 虚拟机.md b/notes/Java 虚拟机.md index d67ef5bd..906f4ef6 100644 --- a/notes/Java 虚拟机.md +++ b/notes/Java 虚拟机.md @@ -102,7 +102,7 @@ Class 文件中的常量池(编译器生成的各种字面量和符号引用 ## 直接内存 -在 JDK 1.4 中新加入了 NIO 类,它可以使用 Native 函数库直接分配堆外内存,然后通过一个存储在 Java 堆里的 DirectByteBuffer 对象作为这块内存的引用进行操作。这样能在一些场景中显著提高性能,因此避免了在 Java 堆和 Native 堆中来回复制数据。 +在 JDK 1.4 中新加入了 NIO 类,它可以使用 Native 函数库直接分配堆外内存,然后通过一个存储在 Java 堆里的 DirectByteBuffer 对象作为这块内存的引用进行操作。这样能在一些场景中显著提高性能,因为其避免了在 Java 堆和 Native 堆中来回复制数据。 # 二、垃圾收集 From 726366858b1c19bf495e95d2b8d092fdd654e0d6 Mon Sep 17 00:00:00 2001 From: luocaodan Date: Thu, 2 Aug 2018 18:28:38 +0800 Subject: [PATCH 39/87] =?UTF-8?q?Update=20Java=20=E5=B9=B6=E5=8F=91.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- notes/Java 并发.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notes/Java 并发.md b/notes/Java 并发.md index ab3528f2..b704f70c 100644 --- a/notes/Java 并发.md +++ b/notes/Java 并发.md @@ -1419,7 +1419,7 @@ public final int incrementAndGet() { } ``` -以下代码是 getAndAddInt() 源码,var1 指示内存地址,var2 指示旧值,var4 指示操作需要加的数值,这里为 1。通过 getIntVolatile(var1, var2) 得到旧的预期值,通过调用 compareAndSwapInt() 来进行 CAS 比较,如果 var2==var5,那么就更新内存地址为 var1 的变量为 var5+var4。可以看到 getAndAddInt() 在一个循环中进行,发生冲突的做法是不断的进行重试。 +以下代码是 getAndAddInt() 源码,var1 指示对象内存地址,var2 指示该字段相对对象内存地址的偏移,var4 指示操作需要加的数值,这里为 1。通过 getIntVolatile(var1, var2) 得到旧的预期值,通过调用 compareAndSwapInt() 来进行 CAS 比较,如果 该字段内存地址中的值==var5,那么就更新内存地址为 var1+var2 的变量为 var5+var4。可以看到 getAndAddInt() 在一个循环中进行,发生冲突的做法是不断的进行重试。 ```java public final int getAndAddInt(Object var1, long var2, int var4) { From 1d99676008f1f907397315a3fa9ef1a6eb01257d Mon Sep 17 00:00:00 2001 From: Zoctan <752481828@qq.com> Date: Thu, 2 Aug 2018 22:40:04 +0800 Subject: [PATCH 40/87] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20=E2=80=9D=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E4=BC=A0=E9=80=92=E2=80=9C=20=E4=B8=AD=E4=B8=80?= =?UTF-8?q?=E7=82=B9=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- notes/Java 基础.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/notes/Java 基础.md b/notes/Java 基础.md index cda00ea0..675b0918 100644 --- a/notes/Java 基础.md +++ b/notes/Java 基础.md @@ -223,7 +223,7 @@ System.out.println(s4 == s5); // true Java 的参数是以值传递的形式传入方法中,而不是引用传递。 -Dog dog 的 dog 是一个指针,存储的是对象的地址。在将一个参数传入一个方法时,本质上是将对象的地址以值的方式传递到形参中。 +Dog dog 的 dog 是一个指针,存储的是对象的地址。在将一个参数传入一个方法时,本质上是将对象的地址以值的方式传递到形参中。而在方法中改变对象的成员变量值也会使原对象的成员变量发生变化,因为是改变同一个地址指向的内容。 ```java public class Dog { @@ -236,6 +236,10 @@ public class Dog { String getName() { return name; } + + void setName(String name) { + this.name = name; + } String getObjectAddress() { return super.toString(); @@ -251,6 +255,9 @@ public class PassByValueExample { func(dog); System.out.println(dog.getObjectAddress()); // Dog@4554617c System.out.println(dog.getName()); // A + func2(dog); + System.out.println(dog.getObjectAddress()); // Dog@4554617c + System.out.println(dog.getName()); // C } private static void func(Dog dog) { @@ -259,6 +266,13 @@ public class PassByValueExample { System.out.println(dog.getObjectAddress()); // Dog@74a14482 System.out.println(dog.getName()); // B } + + private static void func2(Dog dog) { + System.out.println(dog.getObjectAddress()); // Dog@4554617c + dog.setName("C"); + System.out.println(dog.getObjectAddress()); // Dog@4554617c + System.out.println(dog.getName()); // C + } } ``` From fd0e8c11a843e112518a85969cce083a8a233a84 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Thu, 2 Aug 2018 23:03:37 +0800 Subject: [PATCH 41/87] add group --- README.md | 2 +- other/Group.md | 9 +++++++++ other/group.jpg | Bin 0 -> 114283 bytes 3 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 other/Group.md create mode 100644 other/group.jpg diff --git a/README.md b/README.md index 294ac656..a2816aeb 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@
diff --git a/other/Group.md b/other/Group.md new file mode 100644 index 00000000..59b35913 --- /dev/null +++ b/other/Group.md @@ -0,0 +1,9 @@ +创建交流群的主要目的是为了为大家提供一个交流平台,方便大家在学习的过程中互相讨论。 + +这个交流群不是一个笔者的问题回答群,我更希望大家能够愿意积极回答,我相信提问和回答的过程都可以提升自己对知识的掌握程度。 + +至于交流群和 Issue 有什么区别,主要是两方面:一是交流群实时性高一些,二是交流群会更活跃一些。另外,Issue 主要是用来发布一些项目中的错误和一些改进建议,当然也可以发布一些可以讨论的问题,交流群可以讨论的内容比较广,例如在阅读本项目过程中不理解的地方可以在交流群中寻求别人的帮助、新技术的讨论、招聘信息、学习和工作的感受等等。 + +交流群不讨论政治,不讨论有争议性的话题,不发表仇视言论,不传播谣言,不发布广告(招聘信息之类的可以)。 + +

diff --git a/other/group.jpg b/other/group.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cbc68eb523bc7a466b58c2130065abdb8faf9388 GIT binary patch literal 114283 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%0A~;-3FYl(^4L+xSclz4?ogH^B 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 Date: Thu, 2 Aug 2018 23:04:38 +0800 Subject: [PATCH 42/87] fix --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a2816aeb..c015a100 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ From 5fefd1a67f3b1d19d10b74d40a8ba379884a799f Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Thu, 2 Aug 2018 23:05:50 +0800 Subject: [PATCH 43/87] fix --- other/Group.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/other/Group.md b/other/Group.md index 59b35913..388b0ac6 100644 --- a/other/Group.md +++ b/other/Group.md @@ -6,4 +6,4 @@ 交流群不讨论政治,不讨论有争议性的话题,不发表仇视言论,不传播谣言,不发布广告(招聘信息之类的可以)。 -

+

From 77f2be3635e017caf238bbbdc53093fde762b813 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=91=E6=B0=B8=E5=B7=9D?= <1029579233@qq.com> Date: Thu, 2 Aug 2018 23:06:41 +0800 Subject: [PATCH 44/87] fix --- other/Group.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/other/Group.md b/other/Group.md index 388b0ac6..15d2b7d0 100644 --- a/other/Group.md +++ b/other/Group.md @@ -6,4 +6,4 @@ 交流群不讨论政治,不讨论有争议性的话题,不发表仇视言论,不传播谣言,不发布广告(招聘信息之类的可以)。 -

+

From 274026e13816b13e067d859d0a9c55071d30b7e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=91=E6=B0=B8=E5=B7=9D?= <1029579233@qq.com> Date: Thu, 2 Aug 2018 23:07:16 +0800 Subject: [PATCH 45/87] fix --- other/Group.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/other/Group.md b/other/Group.md index 15d2b7d0..ae3a89f6 100644 --- a/other/Group.md +++ b/other/Group.md @@ -6,4 +6,5 @@ 交流群不讨论政治,不讨论有争议性的话题,不发表仇视言论,不传播谣言,不发布广告(招聘信息之类的可以)。 -

+ +

From d0fa9aff51e474dab7db2fb64c3c841c40d40a02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=91=E6=B0=B8=E5=B7=9D?= <1029579233@qq.com> Date: Thu, 2 Aug 2018 23:10:09 +0800 Subject: [PATCH 46/87] fix --- other/Group.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/other/Group.md b/other/Group.md index ae3a89f6..5e7bbc90 100644 --- a/other/Group.md +++ b/other/Group.md @@ -2,9 +2,10 @@ 这个交流群不是一个笔者的问题回答群,我更希望大家能够愿意积极回答,我相信提问和回答的过程都可以提升自己对知识的掌握程度。 +因为笔者白天要上班,因此不能及时进行回复,大部分时间会处于潜水状态。 + 至于交流群和 Issue 有什么区别,主要是两方面:一是交流群实时性高一些,二是交流群会更活跃一些。另外,Issue 主要是用来发布一些项目中的错误和一些改进建议,当然也可以发布一些可以讨论的问题,交流群可以讨论的内容比较广,例如在阅读本项目过程中不理解的地方可以在交流群中寻求别人的帮助、新技术的讨论、招聘信息、学习和工作的感受等等。 交流群不讨论政治,不讨论有争议性的话题,不发表仇视言论,不传播谣言,不发布广告(招聘信息之类的可以)。 -

From 480a8070cd9daf6954749c7de45fbb9846874337 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Fri, 3 Aug 2018 00:12:55 +0800 Subject: [PATCH 47/87] auto commit --- notes/Java 基础.md | 16 +----------- notes/Java 并发.md | 2 +- notes/Java 虚拟机.md | 6 ++--- notes/Linux.md | 58 ++++++++++++++--------------------------- notes/MySQL.md | 47 +++++++++++---------------------- notes/Redis.md | 3 +++ notes/计算机操作系统.md | 34 ++++++++++++++++-------- 7 files changed, 66 insertions(+), 100 deletions(-) diff --git a/notes/Java 基础.md b/notes/Java 基础.md index 675b0918..0bce5622 100644 --- a/notes/Java 基础.md +++ b/notes/Java 基础.md @@ -223,7 +223,7 @@ System.out.println(s4 == s5); // true Java 的参数是以值传递的形式传入方法中,而不是引用传递。 -Dog dog 的 dog 是一个指针,存储的是对象的地址。在将一个参数传入一个方法时,本质上是将对象的地址以值的方式传递到形参中。而在方法中改变对象的成员变量值也会使原对象的成员变量发生变化,因为是改变同一个地址指向的内容。 +以下代码中 Dog dog 的 dog 是一个指针,存储的是对象的地址。在将一个参数传入一个方法时,本质上是将对象的地址以值的方式传递到形参中。但是如果在方法中改变对象的字段值会改变原对象该字段值,因为改变的是同一个地址指向的内容。 ```java public class Dog { @@ -236,10 +236,6 @@ public class Dog { String getName() { return name; } - - void setName(String name) { - this.name = name; - } String getObjectAddress() { return super.toString(); @@ -255,9 +251,6 @@ public class PassByValueExample { func(dog); System.out.println(dog.getObjectAddress()); // Dog@4554617c System.out.println(dog.getName()); // A - func2(dog); - System.out.println(dog.getObjectAddress()); // Dog@4554617c - System.out.println(dog.getName()); // C } private static void func(Dog dog) { @@ -266,13 +259,6 @@ public class PassByValueExample { System.out.println(dog.getObjectAddress()); // Dog@74a14482 System.out.println(dog.getName()); // B } - - private static void func2(Dog dog) { - System.out.println(dog.getObjectAddress()); // Dog@4554617c - dog.setName("C"); - System.out.println(dog.getObjectAddress()); // Dog@4554617c - System.out.println(dog.getName()); // C - } } ``` diff --git a/notes/Java 并发.md b/notes/Java 并发.md index b704f70c..627b824f 100644 --- a/notes/Java 并发.md +++ b/notes/Java 并发.md @@ -1419,7 +1419,7 @@ public final int incrementAndGet() { } ``` -以下代码是 getAndAddInt() 源码,var1 指示对象内存地址,var2 指示该字段相对对象内存地址的偏移,var4 指示操作需要加的数值,这里为 1。通过 getIntVolatile(var1, var2) 得到旧的预期值,通过调用 compareAndSwapInt() 来进行 CAS 比较,如果 该字段内存地址中的值==var5,那么就更新内存地址为 var1+var2 的变量为 var5+var4。可以看到 getAndAddInt() 在一个循环中进行,发生冲突的做法是不断的进行重试。 +以下代码是 getAndAddInt() 源码,var1 指示对象内存地址,var2 指示该字段相对对象内存地址的偏移,var4 指示操作需要加的数值,这里为 1。通过 getIntVolatile(var1, var2) 得到旧的预期值,通过调用 compareAndSwapInt() 来进行 CAS 比较,如果 该字段内存地址中的值 ==var5,那么就更新内存地址为 var1+var2 的变量为 var5+var4。可以看到 getAndAddInt() 在一个循环中进行,发生冲突的做法是不断的进行重试。 ```java public final int getAndAddInt(Object var1, long var2, int var4) { diff --git a/notes/Java 虚拟机.md b/notes/Java 虚拟机.md index 906f4ef6..3bb9f289 100644 --- a/notes/Java 虚拟机.md +++ b/notes/Java 虚拟机.md @@ -102,7 +102,7 @@ Class 文件中的常量池(编译器生成的各种字面量和符号引用 ## 直接内存 -在 JDK 1.4 中新加入了 NIO 类,它可以使用 Native 函数库直接分配堆外内存,然后通过一个存储在 Java 堆里的 DirectByteBuffer 对象作为这块内存的引用进行操作。这样能在一些场景中显著提高性能,因为其避免了在 Java 堆和 Native 堆中来回复制数据。 +在 JDK 1.4 中新加入了 NIO 类,它可以使用 Native 函数库直接分配堆外内存,然后通过一个存储在 Java 堆里的 DirectByteBuffer 对象作为这块内存的引用进行操作。这样能在一些场景中显著提高性能,因为避免了在 Java 堆和 Native 堆中来回复制数据。 # 二、垃圾收集 @@ -146,7 +146,7 @@ Java 虚拟机使用该算法来判断对象是否可被回收,在 Java 中 GC ### 3. 引用类型 -无论是通过引用计数算法判断对象的引用数量,还是通过可达性分析算法判断对象是否可达,判定对象是否可被回收都与引用有关。 +无论是通过引用计算算法判断对象的引用数量,还是通过可达性分析算法判断对象是否可达,判定对象是否可被回收都与引用有关。 Java 具有四种强度不同的引用类型。 @@ -256,7 +256,7 @@ finalize() 类似 C++ 的析构函数,用来做关闭外部资源等工作。 一般将 Java 堆分为新生代和老年代。 - 新生代使用:复制算法 -- 老年代使用:标记 - 清除 或者 标记 - 整理 算法 +- 老年代使用:标记 - 清理 或者 标记 - 整理 算法 ## 垃圾收集器 diff --git a/notes/Linux.md b/notes/Linux.md index 8f27d75c..ebcc347b 100644 --- a/notes/Linux.md +++ b/notes/Linux.md @@ -11,7 +11,6 @@ * [GNU](#gnu) * [开源协议](#开源协议) * [二、磁盘](#二磁盘) - * [HDD](#hdd) * [磁盘接口](#磁盘接口) * [磁盘的文件名](#磁盘的文件名) * [三、分区](#三分区) @@ -185,21 +184,6 @@ GNU 计划,译为革奴计划,它的目标是创建一套完全自由的操 # 二、磁盘 -## HDD - -Hard Disk Drives(HDD) 俗称硬盘,具有以下结构: - -- 盘面(Platter):一个硬盘有多个盘面; -- 磁道(Track):盘面上的圆形带状区域,一个盘面可以有多个磁道; -- 扇区(Track Sector):磁道上的一个弧段,一个磁道可以有多个扇区,它是最小的物理储存单位,目前主要有 512 bytes 与 4 K 两种大小; -- 磁头(Head):与盘面非常接近,能够将盘面上的磁场转换为电信号(读),或者将电信号转换为盘面的磁场(写); -- 制动手臂(Actuator arm):用于在磁道之间移动磁头; -- 主轴(Spindle):使整个盘面转动。 - -

- -[Decoding UCS Invicta – Part 1](https://blogs.cisco.com/datacenter/decoding-ucs-invicta-part-1) - ## 磁盘接口 ### 1. IDE @@ -1025,10 +1009,10 @@ g/re/p(globally search a regular expression and print),使用正则表示式 ```html $ grep [-acinv] [--color=auto] 搜寻字符串 filename --c : 计算找到个数 +-c : 统计个数 -i : 忽略大小写 -n : 输出行号 --v : 反向选择,亦即显示出没有 搜寻字符串 内容的那一行 +-v : 反向选择,也就是显示出没有 搜寻字符串 内容的那一行 --color=auto :找到的关键字加颜色显示 ``` @@ -1068,7 +1052,7 @@ $ printf '%10s %5i %5i %5i %8.2f \n' $(cat printf.txt) awk 每次处理一行,处理的最小单位是字段,每个字段的命名方式为:\$n,n 为字段号,从 1 开始,\$0 表示一整行。 -示例 1:取出登录用户的用户名和 ip +示例:取出登录用户的用户名和 IP ```html $ last -n 5 @@ -1077,7 +1061,9 @@ dmtsai pts/0 192.168.1.100 Thu Jul 9 23:36 - 02:58 (03:22) dmtsai pts/0 192.168.1.100 Thu Jul 9 17:23 - 23:36 (06:12) dmtsai pts/0 192.168.1.100 Thu Jul 9 08:02 - 08:17 (00:14) dmtsai tty1 Fri May 29 11:55 - 12:11 (00:15) +``` +```html $ last -n 5 | awk '{print $1 "\t" $3}' ``` @@ -1087,7 +1073,7 @@ $ last -n 5 | awk '{print $1 "\t" $3}' $ awk '条件类型 1 {动作 1} 条件类型 2 {动作 2} ...' filename ``` -示例 2:/etc/passwd 文件第三个字段为 UID,对 UID 小于 10 的数据进行处理。 +示例:/etc/passwd 文件第三个字段为 UID,对 UID 小于 10 的数据进行处理。 ```text $ cat /etc/passwd | awk 'BEGIN {FS=":"} $3 < 10 {print $1 "\t " $3}' @@ -1104,7 +1090,7 @@ awk 变量: | NR | 目前所处理的是第几行数据 | | FS | 目前的分隔字符,默认是空格键 | -示例 3:输出正在处理的行号,并显示每一行有多少字段 +示例:显示正在处理的行号以及每一行有多少字段 ```html $ last -n 5 | awk '{print $1 "\t lines: " NR "\t columns: " NF}' @@ -1125,19 +1111,19 @@ dmtsai lines: 5 columns: 9 示例一:查看自己的进程 -``` +```sh # ps -l ``` 示例二:查看系统所有进程 -``` +```sh # ps aux ``` 示例三:查看特定的进程 -``` +```sh # ps aux | grep threadx ``` @@ -1147,7 +1133,7 @@ dmtsai lines: 5 columns: 9 示例:两秒钟刷新一次 -``` +```sh # top -d 2 ``` @@ -1157,7 +1143,7 @@ dmtsai lines: 5 columns: 9 示例:查看所有进程树 -``` +```sh # pstree -A ``` @@ -1167,14 +1153,12 @@ dmtsai lines: 5 columns: 9 示例:查看特定端口的进程 -``` +```sh # netstat -anp | grep port ``` ## 进程状态 -

- | 状态 | 说明 | | :---: | --- | | R | running or runnable (on run queue) | @@ -1183,9 +1167,11 @@ dmtsai lines: 5 columns: 9 | Z | zombie (terminated but not reaped by its parent) | | T | stopped (either by a job control signal or because it is being traced) | +

+ ## SIGCHLD -当一个子进程改变了它的状态时:停止运行,继续运行或者退出,有两件事会发生在父进程中: +当一个子进程改变了它的状态时(停止运行,继续运行或者退出),有两件事会发生在父进程中: - 得到 SIGCHLD 信号; - waitpid() 或者 wait() 调用会返回。 @@ -1194,7 +1180,7 @@ dmtsai lines: 5 columns: 9 其中子进程发送的 SIGCHLD 信号包含了子进程的信息,包含了进程 ID、进程状态、进程使用 CPU 的时间等。 -在子进程退出时,它的进程描述符不会立即释放,这是为了让父进程得到子进程信息。父进程通过 wait() 和 waitpid() 来获得一个已经退出的子进程的信息。 +在子进程退出时,它的进程描述符不会立即释放,这是为了让父进程得到子进程信息,父进程通过 wait() 和 waitpid() 来获得一个已经退出的子进程的信息。 ## wait() @@ -1206,11 +1192,7 @@ pid_t wait(int *status) 如果成功,返回被收集的子进程的进程 ID;如果调用进程没有子进程,调用就会失败,此时返回 -1,同时 errno 被置为 ECHILD。 -参数 status 用来保存被收集的子进程退出时的一些状态,如果对这个子进程是如何死掉的毫不在意,只想把这个子进程消灭掉,可以设置这个参数为 NULL: - -```c -pid = wait(NULL); -``` +参数 status 用来保存被收集的子进程退出时的一些状态,如果对这个子进程是如何死掉的毫不在意,只想把这个子进程消灭掉,可以设置这个参数为 NULL。 ## waitpid() @@ -1238,9 +1220,9 @@ options 参数主要有 WNOHANG 和 WUNTRACED 两个选项,WNOHANG 可以使 w 僵尸进程通过 ps 命令显示出来的状态为 Z(zombie)。 -系统所能使用的进程号是有限的,如果大量的产生僵尸进程,将因为没有可用的进程号而导致系统不能产生新的进程。 +系统所能使用的进程号是有限的,如果产生大量僵尸进程,将因为没有可用的进程号而导致系统不能产生新的进程。 -要消灭系统中大量的僵尸进程,只需要将其父进程杀死,此时僵尸进程就会变成孤儿进程,从而被 init 所收养,这样 init 就会释放所有的僵死进程所占有的资源,从而结束僵尸进程。 +要消灭系统中大量的僵尸进程,只需要将其父进程杀死,此时僵尸进程就会变成孤儿进程,从而被 init 所收养,这样 init 就会释放所有的僵尸进程所占有的资源,从而结束僵尸进程。 # 参考资料 diff --git a/notes/MySQL.md b/notes/MySQL.md index f6aa853b..1c575fae 100644 --- a/notes/MySQL.md +++ b/notes/MySQL.md @@ -9,7 +9,7 @@ * [字符串](#字符串) * [时间和日期](#时间和日期) * [三、索引](#三索引) - * [B Tree 原理](#b-tree-原理) + * [B+ Tree 原理](#b-tree-原理) * [索引分类](#索引分类) * [索引的优点](#索引的优点) * [索引优化](#索引优化) @@ -125,49 +125,33 @@ MySQL 提供了 FROM_UNIXTIME() 函数把 UNIX 时间戳转换为日期,并提 索引是在存储引擎层实现的,而不是在服务器层实现的,所以不同存储引擎具有不同的索引类型和实现。 -## B Tree 原理 +## B+ Tree 原理 -### 1. B-Tree +### 1. 数据结构 -

+B Tree 指的是 Balance Tree,也就是平衡树。平衡树时一颗查找树,并且所有叶子节点位于同一层。 -定义一条数据记录为一个二元组 [key, data],B-Tree 是满足下列条件的数据结构: +B+ Tree 是基于 B Tree 和叶子节点顺序访问指针进行实现,它具有 B Tree 的平衡性,并且通过顺序访问指针来提高区间查询的性能。 -- 所有叶节点具有相同的深度,也就是说 B-Tree 是平衡的; -- 一个节点中的 key 从左到右非递减排列; -- 如果某个指针的左右相邻 key 分别是 keyi 和 keyi+1,且不为 null,则该指针指向节点的所有 key 大于等于 keyi 且小于等于 keyi+1。 - -查找算法:首先在根节点进行二分查找,如果找到则返回对应节点的 data,否则在相应区间的指针指向的节点递归进行查找。 - -由于插入删除新的数据记录会破坏 B-Tree 的性质,因此在插入删除时,需要对树进行一个分裂、合并、旋转等操作以保持 B-Tree 性质。 - -### 2. B+Tree - -

- -与 B-Tree 相比,B+Tree 有以下不同点: - -- 每个节点的指针上限为 2d 而不是 2d+1(d 为节点的出度); -- 内节点不存储 data,只存储 key; -- 叶子节点不存储指针。 - -### 3. 顺序访问指针 +在 B+ Tree 中,一个节点中的 key 从左到右非递减排列,如果某个指针的左右相邻 key 分别是 keyi 和 keyi+1,且不为 null,则该指针指向节点的所有 key 大于等于 keyi 且小于等于 keyi+1

-一般在数据库系统或文件系统中使用的 B+Tree 结构都在经典 B+Tree 基础上进行了优化,在叶子节点增加了顺序访问指针,做这个优化的目的是为了提高区间访问的性能。 +### 2. 操作 -### 4. 优势 +操作时,首先在根节点进行二分查找,找到一个 key 所在的指针,然后递归地在指针所指向的节点进行查找。直到查找到叶子节点,然后在叶子节点上进行二分查找,找出 key 所对应的 data。 -红黑树等平衡树也可以用来实现索引,但是文件系统及数据库系统普遍采用 B Tree 作为索引结构,主要有以下两个原因: +插入删除操作记录会破坏平衡树的平衡性,因此在插入删除时,需要对树进行一个分裂、合并、旋转等操作。 + +### 3. 与红黑树的比较 + +红黑树等平衡树也可以用来实现索引,但是文件系统及数据库系统普遍采用 B+ Tree 作为索引结构,主要有以下两个原因: (一)更少的检索次数 平衡树检索数据的时间复杂度等于树高 h,而树高大致为 O(h)=O(logdN),其中 d 为每个节点的出度。 -红黑树的出度为 2,而 B Tree 的出度一般都非常大。红黑树的树高 h 很明显比 B Tree 大非常多,因此检索的次数也就更多。 - -B+Tree 相比于 B-Tree 更适合外存索引,因为 B+Tree 内节点去掉了 data 域,因此可以拥有更大的出度,检索效率会更高。 +红黑树的出度为 2,而 B+ Tree 的出度一般都非常大。红黑树的树高 h 很明显比 B+ Tree 大非常多,因此检索的次数也就更多。 (二)利用计算机预读特性 @@ -175,8 +159,6 @@ B+Tree 相比于 B-Tree 更适合外存索引,因为 B+Tree 内节点去掉了 操作系统一般将内存和磁盘分割成固态大小的块,每一块称为一页,内存与磁盘以页为单位交换数据。数据库系统将索引的一个节点的大小设置为页的大小,使得一次 I/O 就能完全载入一个节点,并且可以利用预读特性,相邻的节点也能够被预先载入。 -更多内容请参考:[MySQL 索引背后的数据结构及算法原理](http://blog.codinglabs.org/articles/theory-of-mysql-index.html) - ## 索引分类 ### 1. B+Tree 索引 @@ -442,3 +424,4 @@ MySQL 读写分离能提高性能的原因在于: - [服务端指南 数据存储篇 | MySQL(09) 分库与分表带来的分布式困境与应对之策](http://blog.720ui.com/2017/mysql_core_09_multi_db_table2/ "服务端指南 数据存储篇 | MySQL(09) 分库与分表带来的分布式困境与应对之策") - [How to create unique row ID in sharded databases?](https://stackoverflow.com/questions/788829/how-to-create-unique-row-id-in-sharded-databases) - [SQL Azure Federation – Introduction](http://geekswithblogs.net/shaunxu/archive/2012/01/07/sql-azure-federation-ndash-introduction.aspx "Title of this entry.") +- [MySQL 索引背后的数据结构及算法原理](http://blog.codinglabs.org/articles/theory-of-mysql-index.html) diff --git a/notes/Redis.md b/notes/Redis.md index 247d0987..c54287c8 100644 --- a/notes/Redis.md +++ b/notes/Redis.md @@ -420,6 +420,8 @@ Reids 具体有 6 种淘汰策略: 使用 Redis 缓存数据时,为了提高缓存命中率,需要保证缓存数据都是热点数据。可以将内存最大使用量设置为热点数据占用的内存量,然后启用 allkeys-lru 淘汰策略,将最近最少使用的数据淘汰。 +Redis 4.0 引入了 volatile-lfu 和 allkeys-lfu 淘汰策略,LFU 策略通过统计访问频率,将访问频率最少的键值对淘汰。 + # 八、持久化 Redis 是内存型数据库,为了保证数据在断电后不会丢失,需要将内存中的数据持久化到硬盘上。 @@ -601,3 +603,4 @@ Redis 没有关系型数据库中的表这一概念来将同种类型的数据 - [Redis 3.0 中文版- 分片](http://wiki.jikexueyuan.com/project/redis-guide) - [Redis 应用场景](http://www.scienjus.com/redis-use-case/) - [Observer vs Pub-Sub](http://developers-club.com/posts/270339/) +- [Using Redis as an LRU cache](https://redis.io/topics/lru-cache) diff --git a/notes/计算机操作系统.md b/notes/计算机操作系统.md index 5c9f63a7..6bfb559c 100644 --- a/notes/计算机操作系统.md +++ b/notes/计算机操作系统.md @@ -23,6 +23,7 @@ * [段页式](#段页式) * [分页与分段的比较](#分页与分段的比较) * [五、设备管理](#五设备管理) + * [磁盘结构](#磁盘结构) * [磁盘调度算法](#磁盘调度算法) * [六、链接](#六链接) * [编译系统](#编译系统) @@ -304,7 +305,7 @@ void P2() { 为了同步生产者和消费者的行为,需要记录缓冲区中物品的数量。数量可以使用信号量来进行统计,这里需要使用两个信号量:empty 记录空缓冲区的数量,full 记录满缓冲区的数量。其中,empty 信号量是在生产者进程中使用,当 empty 不为 0 时,生产者才可以放入物品;full 信号量是在消费者进程中使用,当 full 信号量不为 0 时,消费者才可以取走物品。 -注意,不能先对缓冲区进行加锁,再测试信号量。也就是说,不能先执行 down(mutex) 再执行 down(empty)。如果这么做了,那么可能会出现这种情况:生产者对缓冲区加锁后,执行 down(empty) 操作,发现 empty = 0,此时生产者睡眠。消费者不能进入临界区,因为生产者对缓冲区加锁了,也就无法执行 up(empty) 操作,empty 永远都为 0,那么生产者和消费者就会一直等待下去,造成死锁。 +注意,不能先对缓冲区进行加锁,再测试信号量。也就是说,不能先执行 down(mutex) 再执行 down(empty)。如果这么做了,那么可能会出现这种情况:生产者对缓冲区加锁后,执行 down(empty) 操作,发现 empty = 0,此时生产者睡眠。消费者不能进入临界区,因为生产者对缓冲区加锁了,消费者就无法执行 up(empty) 操作,empty 永远都为 0,导致生产者永远等待下,不会释放锁,消费者因此也会永远等待下去。 ```c #define N 100 @@ -314,7 +315,7 @@ semaphore empty = N; semaphore full = 0; void producer() { - while(TRUE){ + while(TRUE) { int item = produce_item(); down(&empty); down(&mutex); @@ -325,7 +326,7 @@ void producer() { } void consumer() { - while(TRUE){ + while(TRUE) { down(&full); down(&mutex); int item = remove_item(); @@ -542,7 +543,7 @@ int pipe(int fd[2]); 它具有以下限制: -- 只支持半双工通信(单向传输); +- 只支持半双工通信(单向交替传输); - 只能在父子进程中使用。

@@ -707,7 +708,7 @@ FIFO 常用于客户-服务器应用程序中,FIFO 用作汇聚点,在客户 虚拟内存的目的是为了让物理内存扩充成更大的逻辑内存,从而让程序获得更多的可用内存。 -为了更好的管理内存,操作系统将内存抽象成地址空间。每个程序拥有自己的地址空间,这个地址空间被分割成多个块,每一块称为一页。这些页被映射到物理内存,但不需要映射到连续的物理内存,也不需要所有页都必须在物理内存中。当程序引用到一部分不在物理内存中的地址空间时,由硬件执行必要的映射,将缺失的部分装入物理内存并重新执行失败的指令。 +为了更好的管理内存,操作系统将内存抽象成地址空间。每个程序拥有自己的地址空间,这个地址空间被分割成多个块,每一块称为一页。这些页被映射到物理内存,但不需要映射到连续的物理内存,也不需要所有页都必须在物理内存中。当程序引用到不在物理内存中的页时,由硬件执行必要的映射,将缺失的部分装入物理内存并重新执行失败的指令。 从上面的描述中可以看出,虚拟内存允许程序不用将地址空间中的每一页都映射到物理内存,也就是说一个程序不需要全部调入内存就可以运行,这使得有限的内存运行大程序称为可能。例如有一台计算机可以产生 16 位地址,那么一个程序的地址空间范围是 0\~64K。该计算机只有 32KB 的物理内存,虚拟内存技术允许该计算机运行一个 64K 大小的程序。 @@ -715,12 +716,11 @@ FIFO 常用于客户-服务器应用程序中,FIFO 用作汇聚点,在客户 ## 分页系统地址映射 -- 内存管理单元(MMU):管理着地址空间和物理内存的转换。 -- 页表(Page table):页(地址空间)和页框(物理内存空间)的映射表。例如下图中,页表的第 0 个表项为 010,表示第 0 个页映射到第 2 个页框。页表项的最后一位用来标记页是否在内存中。 +内存管理单元(MMU)管理着地址空间和物理内存的转换,其中的页表(Page table)存储着页(程序地址空间)和页框(物理内存空间)的映射表。 -下图的页表存放着 16 个页,这 16 个页需要用 4 个比特位来进行索引定位。因此对于虚拟地址(0010 000000000100),前 4 位是用来存储页面号,而后 12 位存储在页中的偏移量。 +下图的页表存放着 16 个页,这 16 个页需要用 4 个比特位来进行索引定位,也就是存储页面号,剩下 12 个比特位存储偏移量。 -(0010 000000000100)根据前 4 位得到页号为 2,读取表项内容为(110 1),它的前 3 为为页框号,最后 1 位表示该页在内存中。最后映射得到物理内存地址为(110 000000000100)。 +例如对于虚拟地址(0010 000000000100),前 4 位是存储页面号 2,读取表项内容为(110 1)。该页在内存中,并且页框的地址为 (110 000000000100)。

@@ -828,11 +828,22 @@ FIFO 算法可能会把经常使用的页面置换出去,为了避免这一问 # 五、设备管理 +## 磁盘结构 + +- 盘面(Platter):一个磁盘有多个盘面; +- 磁道(Track):盘面上的圆形带状区域,一个盘面可以有多个磁道; +- 扇区(Track Sector):磁道上的一个弧段,一个磁道可以有多个扇区,它是最小的物理储存单位,目前主要有 512 bytes 与 4 K 两种大小; +- 磁头(Head):与盘面非常接近,能够将盘面上的磁场转换为电信号(读),或者将电信号转换为盘面的磁场(写); +- 制动手臂(Actuator arm):用于在磁道之间移动磁头; +- 主轴(Spindle):使整个盘面转动。 + +

+ ## 磁盘调度算法 读写一个磁盘块的时间的影响因素有: -- 旋转时间(主轴旋转磁盘,使得磁头移动到适当的扇区上) +- 旋转时间(主轴转动盘面,使得磁头移动到适当的扇区上) - 寻道时间(制动手臂移动,使得磁头移动到适当的磁道上) - 实际的数据传输时间 @@ -933,8 +944,9 @@ gcc -o hello hello.c - Tanenbaum A S, Bos H. Modern operating systems[M]. Prentice Hall Press, 2014. - 汤子瀛, 哲凤屏, 汤小丹. 计算机操作系统[M]. 西安电子科技大学出版社, 2001. - Bryant, R. E., & O’Hallaron, D. R. (2004). 深入理解计算机系统. +- 史蒂文斯. UNIX 环境高级编程 [M]. 人民邮电出版社, 2014. - [Operating System Notes](https://applied-programming.github.io/Operating-Systems-Notes/) -- [进程间的几种通信方式](http://blog.csdn.net/yufaw/article/details/7409596) - [Operating-System Structures](https://www.cs.uic.edu/\~jbell/CourseNotes/OperatingSystems/2_Structures.html) - [Processes](http://cse.csusb.edu/tongyu/courses/cs460/notes/process.php) - [Inter Process Communication Presentation[1]](https://www.slideshare.net/rkolahalam/inter-process-communication-presentation1) +- [Decoding UCS Invicta – Part 1](https://blogs.cisco.com/datacenter/decoding-ucs-invicta-part-1) From df8cd08303067a37e7b6a5326bad88cfdc7abbf5 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Fri, 3 Aug 2018 00:17:10 +0800 Subject: [PATCH 48/87] auto commit --- other/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 other/README.md diff --git a/other/README.md b/other/README.md new file mode 100644 index 00000000..39876f02 --- /dev/null +++ b/other/README.md @@ -0,0 +1,3 @@ +- 其他人添加的全新内容 +- 主页 README 引用的图片 +- 微信群描述文件 \ No newline at end of file From c4cd8a30ffde6049ee703943e5fc9a53a93c54ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=91=E6=B0=B8=E5=B7=9D?= <1029579233@qq.com> Date: Fri, 3 Aug 2018 00:20:20 +0800 Subject: [PATCH 49/87] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c015a100..39cedf7b 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ From ae14046536061e69d46858fb168ac6bb53cbb716 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=91=E6=B0=B8=E5=B7=9D?= <1029579233@qq.com> Date: Fri, 3 Aug 2018 00:20:56 +0800 Subject: [PATCH 50/87] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 39cedf7b..56627328 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ From 54073390ecefa3457a027026a7aefed7c19ef2a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=91=E6=B0=B8=E5=B7=9D?= <1029579233@qq.com> Date: Fri, 3 Aug 2018 00:22:26 +0800 Subject: [PATCH 51/87] Update Group.md --- other/Group.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/other/Group.md b/other/Group.md index 5e7bbc90..fee7b8bf 100644 --- a/other/Group.md +++ b/other/Group.md @@ -1,10 +1,14 @@ -创建交流群的主要目的是为了为大家提供一个交流平台,方便大家在学习的过程中互相讨论。 +创建交流群的主要目的是为了给大家提供一个交流平台,方便大家在学习的过程中互相讨论。 -这个交流群不是一个笔者的问题回答群,我更希望大家能够愿意积极回答,我相信提问和回答的过程都可以提升自己对知识的掌握程度。 +这个交流群不是一个笔者的问题回答群,我更希望大家能够愿意积极回答,我相信提问和回答的过程都可以帮助大家对知识的掌握程度。 因为笔者白天要上班,因此不能及时进行回复,大部分时间会处于潜水状态。 -至于交流群和 Issue 有什么区别,主要是两方面:一是交流群实时性高一些,二是交流群会更活跃一些。另外,Issue 主要是用来发布一些项目中的错误和一些改进建议,当然也可以发布一些可以讨论的问题,交流群可以讨论的内容比较广,例如在阅读本项目过程中不理解的地方可以在交流群中寻求别人的帮助、新技术的讨论、招聘信息、学习和工作的感受等等。 +至于交流群和 Issue 有什么区别,主要是两方面:一是交流群实时性高一些,二是交流群会更活跃一些。 + +另外,Issue 主要是用来发布一些项目中的错误和一些改进建议,当然也可以发布一些可以讨论的问题。 + +交流群可以讨论的内容比较广,例如在阅读本项目过程中不理解的地方可以在交流群中寻求别人的帮助、新技术的讨论、招聘信息、学习和工作的感受等等。 交流群不讨论政治,不讨论有争议性的话题,不发表仇视言论,不传播谣言,不发布广告(招聘信息之类的可以)。 From 781259816ddebe5a41bf08ba169156b81e99c1e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=91=E6=B0=B8=E5=B7=9D?= <1029579233@qq.com> Date: Fri, 3 Aug 2018 13:01:18 +0800 Subject: [PATCH 52/87] Update README.md --- README.md | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 56627328..87d4d460 100644 --- a/README.md +++ b/README.md @@ -15,59 +15,59 @@ > [剑指 Offer 题解](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/剑指%20offer%20题解.md) -目录根据原书第二版进行编排。 +目录根据原书第二版进行编排,代码和原书有所不同,尽量实现地比原书更加简洁。 > [Leetcode 题解](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/Leetcode%20题解.md) -做了一个大致分类,并对每种分类题型的解题思路做了总结。 +对题目做了一个大致分类,并对每种题型的解题思路做了总结。 > [算法](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/算法.md) -主要参考 Robert Sedgewick 的算法书进行实现,源代码以及测试代码可在另一个仓库获取。 +排序、并查集、栈和队列、红黑树、散列表。 ## 操作系统 :computer: > [计算机操作系统](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/计算机操作系统.md) -参考 现代操作系统、Unix 环境高级编程、深入理解计算机系统。 +进程管理、内存管理、设备管理、链接。 > [Linux](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/Linux.md) -参考 鸟哥的 Linux 私房菜。 +基本实现原理以及基本操作。 ## 网络 :cloud: > [计算机网络](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/计算机网络.md) -参考 谢希仁的计算机网络、计算机网络 自顶向下方法、TCP/IP 详解。 +物理层、链路层、网络层、运输层、应用层。 > [HTTP](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/HTTP.md) -参考 图解 HTTP,更多的是参考网上的文档,比如 MDN、维基百科等。 +方法、状态码、Cookie、缓存、连接管理、HTTPs、HTTP 2.0。 > [Socket](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/Socket.md) -参考 Unix 网络编程。 +I/O 模型、I/O 多路复用。 ## 面向对象 :couple: > [设计模式](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/设计模式.md) -参考 Head First 设计模式、设计模式 可复用面向对象软件的基础,实现了 Gof 的 23 种设计模式。 +实现了 Gof 的 23 种设计模式。 > [面向对象思想](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/面向对象思想.md) -内容包括三大原则(继承、封装、多态)、类图、设计原则。 +三大原则(继承、封装、多态)、类图、设计原则。 ## 数据库 :floppy_disk: > [数据库系统原理](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/数据库系统原理.md) -参考 数据库系统原理。 +事务、锁、隔离级别、MVCC、间隙锁、范式。 > [SQL](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/SQL.md) -参考 SQL 必知必会。 +SQL 基本语法。 > [Leetcode-Database 题解](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/Leetcode-Database%20题解.md) @@ -75,33 +75,33 @@ Leetcode 上数据库题目的解题记录。 > [MySQL](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/MySQL.md) -参考 高性能 MySQL。 +存储引擎、索引、查询优化、切分、复制。 > [Redis](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/Redis.md) -参考 Redis 设计与实现、Redis 实战。 +五种数据类型、字典和跳跃表数据结构、使用场景、和 Memcache 的比较、淘汰策略、持久化、文件事件的 Reactor 模式、复制。 ## Java :coffee: > [Java 基础](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/Java%20基础.md) -参考 Effective Java、Java 编程思想,也有部分内容参考官方文档以及 StackOverflow。 +不会涉及很多基本语法介绍,主要是一些实现原理以及关键特性。 > [Java 容器](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/Java%20容器.md) -包含容器源码分析。 +源码分析:ArrayListVector、CopyOnWriteArrayList、LinkedList、HashMap、ConcurrentHashMap、LinkedHashMap、WeekHashMap。 > [Java 并发](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/Java%20并发.md) -参考 Java 编程思想、深入理解 Java 虚拟机。 +线程使用方式、两种互斥同步方法、线程协作、JUC、线程安全、内存模型、锁优化。 > [Java 虚拟机](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/Java%20虚拟机.md) -参考 深入理解 Java 虚拟机。 +运行时数据区域、垃圾收集、类加载。 > [Java I/O](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/Java%20IO.md) -包含 NIO 的原理以及实例。 +NIO 的原理以及实例。 ## 系统设计 :bulb: @@ -141,11 +141,11 @@ Docker 基本原理。 > [正则表达式](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/正则表达式.md) -参考 正则表达式必知必会。 +正则表达式基本语法。 > [构建工具](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/构建工具.md) -构建工具的基本概念、主流构建工具介绍 +构建工具的基本概念、主流构建工具介绍。 ## 编码实践 :speak_no_evil: From 9cd8b3ae9631d73b5d94d4022b468e8a60682c04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=91=E6=B0=B8=E5=B7=9D?= Date: Fri, 3 Aug 2018 14:40:33 +0800 Subject: [PATCH 53/87] auto commit --- BOOKLIST.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BOOKLIST.md b/BOOKLIST.md index bdd8eb92..4805a7dc 100644 --- a/BOOKLIST.md +++ b/BOOKLIST.md @@ -79,4 +79,4 @@ - [JavaScript 语言精粹](https://book.douban.com/subject/3590768/) - [利用 Python 进行数据分析](https://book.douban.com/subject/25779298/) -- [概率论与数理统计](https://book.douban.com/subject/2201479/) \ No newline at end of file +- [概率论与数理统计](https://book.douban.com/subject/2201479/) From 282c863ea73abda808654ad706bb71b6b0eccd72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=91=E6=B0=B8=E5=B7=9D?= Date: Fri, 3 Aug 2018 14:40:51 +0800 Subject: [PATCH 54/87] auto commit From a22b269f3906582b36f3a75708d87d17ed1a2488 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=91=E6=B0=B8=E5=B7=9D?= Date: Fri, 3 Aug 2018 14:43:42 +0800 Subject: [PATCH 55/87] auto commit From 2f4f1c814411214475372d73aac7fdf836fe55cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=91=E6=B0=B8=E5=B7=9D?= Date: Fri, 3 Aug 2018 14:44:06 +0800 Subject: [PATCH 56/87] auto commit --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index e43b0f98..a56b7514 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ .DS_Store + From 4c69f7a7cc83c552655e27f72a7d91cd42ef1658 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=91=E6=B0=B8=E5=B7=9D?= Date: Fri, 3 Aug 2018 15:31:36 +0800 Subject: [PATCH 57/87] auto commit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 87d4d460..39b43f30 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ > [剑指 Offer 题解](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/剑指%20offer%20题解.md) -目录根据原书第二版进行编排,代码和原书有所不同,尽量实现地比原书更加简洁。 +目录根据原书第二版进行编排,代码和原书有所不同,尽量比原书更简洁。 > [Leetcode 题解](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/Leetcode%20题解.md) From 0e7655e7aeea75fe027849315d45691280067e82 Mon Sep 17 00:00:00 2001 From: Elong Date: Fri, 3 Aug 2018 18:42:53 +0800 Subject: [PATCH 58/87] =?UTF-8?q?Update=20Java=20=E5=9F=BA=E7=A1=80.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit equals()方法的文字描述修改 --- notes/Java 基础.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notes/Java 基础.md b/notes/Java 基础.md index 0bce5622..1e20ea55 100644 --- a/notes/Java 基础.md +++ b/notes/Java 基础.md @@ -586,7 +586,7 @@ protected void finalize() throws Throwable {} **1. equals() 与 == 的区别** - 对于基本类型,== 判断两个值是否相等,基本类型没有 equals() 方法。 -- 对于引用类型,== 判断两个实例是否引用同一个对象,而 equals() 判断引用的对象是否等价。 +- 对于引用类型,== 判断两个实例是否引用同一个对象,而 equals() 则是根据引用的对象的 equals() 方法的具体实现来进行比较。 ```java Integer x = new Integer(1); From bb6d5e49790664dd8b756cc11660fd4878c2b966 Mon Sep 17 00:00:00 2001 From: luocaodan Date: Sat, 4 Aug 2018 11:23:03 +0800 Subject: [PATCH 59/87] =?UTF-8?q?Update=20Java=20=E8=99=9A=E6=8B=9F?= =?UTF-8?q?=E6=9C=BA.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 应该是jre目录下,而不是jdk目录 --- notes/Java 虚拟机.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/notes/Java 虚拟机.md b/notes/Java 虚拟机.md index 3bb9f289..dbe4e070 100644 --- a/notes/Java 虚拟机.md +++ b/notes/Java 虚拟机.md @@ -627,9 +627,9 @@ public static void main(String[] args) { 从 Java 开发人员的角度看,类加载器可以划分得更细致一些: -- 启动类加载器(Bootstrap ClassLoader)此类加载器负责将存放在 <JAVA_HOME>\lib 目录中的,或者被 -Xbootclasspath 参数所指定的路径中的,并且是虚拟机识别的(仅按照文件名识别,如 rt.jar,名字不符合的类库即使放在 lib 目录中也不会被加载)类库加载到虚拟机内存中。启动类加载器无法被 Java 程序直接引用,用户在编写自定义类加载器时,如果需要把加载请求委派给启动类加载器,直接使用 null 代替即可。 +- 启动类加载器(Bootstrap ClassLoader)此类加载器负责将存放在 <JRE_HOME>\lib 目录中的,或者被 -Xbootclasspath 参数所指定的路径中的,并且是虚拟机识别的(仅按照文件名识别,如 rt.jar,名字不符合的类库即使放在 lib 目录中也不会被加载)类库加载到虚拟机内存中。启动类加载器无法被 Java 程序直接引用,用户在编写自定义类加载器时,如果需要把加载请求委派给启动类加载器,直接使用 null 代替即可。 -- 扩展类加载器(Extension ClassLoader)这个类加载器是由 ExtClassLoader(sun.misc.Launcher$ExtClassLoader)实现的。它负责将 <JAVA_HOME>/lib/ext 或者被 java.ext.dir 系统变量所指定路径中的所有类库加载到内存中,开发者可以直接使用扩展类加载器。 +- 扩展类加载器(Extension ClassLoader)这个类加载器是由 ExtClassLoader(sun.misc.Launcher$ExtClassLoader)实现的。它负责将 <JRE_HOME>/lib/ext 或者被 java.ext.dir 系统变量所指定路径中的所有类库加载到内存中,开发者可以直接使用扩展类加载器。 - 应用程序类加载器(Application ClassLoader)这个类加载器是由 AppClassLoader(sun.misc.Launcher$AppClassLoader)实现的。由于这个类加载器是 ClassLoader 中的 getSystemClassLoader() 方法的返回值,因此一般称为系统类加载器。它负责加载用户类路径(ClassPath)上所指定的类库,开发者可以直接使用这个类加载器,如果应用程序中没有自定义过自己的类加载器,一般情况下这个就是程序中默认的类加载器。 From b9f9e9807e771074fe13dd04b048782ac6a4444f Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Sat, 4 Aug 2018 16:59:09 +0800 Subject: [PATCH 60/87] auto commit --- .gitignore | 2 +- notes/Java 基础.md | 2 +- notes/Java 并发.md | 4 +++- notes/Java 虚拟机.md | 2 +- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index a56b7514..c91a56b6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ .DS_Store - +*.txt diff --git a/notes/Java 基础.md b/notes/Java 基础.md index 1e20ea55..f5133a6f 100644 --- a/notes/Java 基础.md +++ b/notes/Java 基础.md @@ -586,7 +586,7 @@ protected void finalize() throws Throwable {} **1. equals() 与 == 的区别** - 对于基本类型,== 判断两个值是否相等,基本类型没有 equals() 方法。 -- 对于引用类型,== 判断两个实例是否引用同一个对象,而 equals() 则是根据引用的对象的 equals() 方法的具体实现来进行比较。 +- 对于引用类型,== 判断两个实例是否引用同一个对象,而 equals() 判断引用的对象是否等价,根据引用的对象的 equals() 方法的具体实现来进行比较。 ```java Integer x = new Integer(1); diff --git a/notes/Java 并发.md b/notes/Java 并发.md index 627b824f..89ab7cac 100644 --- a/notes/Java 并发.md +++ b/notes/Java 并发.md @@ -1419,7 +1419,9 @@ public final int incrementAndGet() { } ``` -以下代码是 getAndAddInt() 源码,var1 指示对象内存地址,var2 指示该字段相对对象内存地址的偏移,var4 指示操作需要加的数值,这里为 1。通过 getIntVolatile(var1, var2) 得到旧的预期值,通过调用 compareAndSwapInt() 来进行 CAS 比较,如果 该字段内存地址中的值 ==var5,那么就更新内存地址为 var1+var2 的变量为 var5+var4。可以看到 getAndAddInt() 在一个循环中进行,发生冲突的做法是不断的进行重试。 +以下代码是 getAndAddInt() 源码,var1 指示对象内存地址,var2 指示该字段相对对象内存地址的偏移,var4 指示操作需要加的数值,这里为 1。通过 getIntVolatile(var1, var2) 得到旧的预期值,通过调用 compareAndSwapInt() 来进行 CAS 比较,如果该字段内存地址中的值 ==var5,那么就更新内存地址为 var1+var2 的变量为 var5+var4。 + +可以看到 getAndAddInt() 在一个循环中进行,发生冲突的做法是不断的进行重试。 ```java public final int getAndAddInt(Object var1, long var2, int var4) { diff --git a/notes/Java 虚拟机.md b/notes/Java 虚拟机.md index dbe4e070..ec33515e 100644 --- a/notes/Java 虚拟机.md +++ b/notes/Java 虚拟机.md @@ -627,7 +627,7 @@ public static void main(String[] args) { 从 Java 开发人员的角度看,类加载器可以划分得更细致一些: -- 启动类加载器(Bootstrap ClassLoader)此类加载器负责将存放在 <JRE_HOME>\lib 目录中的,或者被 -Xbootclasspath 参数所指定的路径中的,并且是虚拟机识别的(仅按照文件名识别,如 rt.jar,名字不符合的类库即使放在 lib 目录中也不会被加载)类库加载到虚拟机内存中。启动类加载器无法被 Java 程序直接引用,用户在编写自定义类加载器时,如果需要把加载请求委派给启动类加载器,直接使用 null 代替即可。 +- 启动类加载器(Bootstrap ClassLoader)此类加载器负责将存放在 <JAVA_HOME>\lib 目录中的,或者被 -Xbootclasspath 参数所指定的路径中的,并且是虚拟机识别的(仅按照文件名识别,如 rt.jar,名字不符合的类库即使放在 lib 目录中也不会被加载)类库加载到虚拟机内存中。启动类加载器无法被 Java 程序直接引用,用户在编写自定义类加载器时,如果需要把加载请求委派给启动类加载器,直接使用 null 代替即可。 - 扩展类加载器(Extension ClassLoader)这个类加载器是由 ExtClassLoader(sun.misc.Launcher$ExtClassLoader)实现的。它负责将 <JRE_HOME>/lib/ext 或者被 java.ext.dir 系统变量所指定路径中的所有类库加载到内存中,开发者可以直接使用扩展类加载器。 From 336fa4f50f8b14518edc95f8a79bb1d59c40521e Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Sat, 4 Aug 2018 17:00:36 +0800 Subject: [PATCH 61/87] auto commit --- notes/Java 虚拟机.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/notes/Java 虚拟机.md b/notes/Java 虚拟机.md index ec33515e..69952f2e 100644 --- a/notes/Java 虚拟机.md +++ b/notes/Java 虚拟机.md @@ -627,9 +627,9 @@ public static void main(String[] args) { 从 Java 开发人员的角度看,类加载器可以划分得更细致一些: -- 启动类加载器(Bootstrap ClassLoader)此类加载器负责将存放在 <JAVA_HOME>\lib 目录中的,或者被 -Xbootclasspath 参数所指定的路径中的,并且是虚拟机识别的(仅按照文件名识别,如 rt.jar,名字不符合的类库即使放在 lib 目录中也不会被加载)类库加载到虚拟机内存中。启动类加载器无法被 Java 程序直接引用,用户在编写自定义类加载器时,如果需要把加载请求委派给启动类加载器,直接使用 null 代替即可。 +- 启动类加载器(Bootstrap ClassLoader)此类加载器负责将存放在 <JRE_HOME>\lib 目录中的,或者被 -Xbootclasspath 参数所指定的路径中的,并且是虚拟机识别的(仅按照文件名识别,如 rt.jar,名字不符合的类库即使放在 lib 目录中也不会被加载)类库加载到虚拟机内存中。启动类加载器无法被 Java 程序直接引用,用户在编写自定义类加载器时,如果需要把加载请求委派给启动类加载器,直接使用 null 代替即可。 -- 扩展类加载器(Extension ClassLoader)这个类加载器是由 ExtClassLoader(sun.misc.Launcher$ExtClassLoader)实现的。它负责将 <JRE_HOME>/lib/ext 或者被 java.ext.dir 系统变量所指定路径中的所有类库加载到内存中,开发者可以直接使用扩展类加载器。 +- 扩展类加载器(Extension ClassLoader)这个类加载器是由 ExtClassLoader(sun.misc.Launcher$ExtClassLoader)实现的。它负责将 <JAVA_HOME>/lib/ext 或者被 java.ext.dir 系统变量所指定路径中的所有类库加载到内存中,开发者可以直接使用扩展类加载器。 - 应用程序类加载器(Application ClassLoader)这个类加载器是由 AppClassLoader(sun.misc.Launcher$AppClassLoader)实现的。由于这个类加载器是 ClassLoader 中的 getSystemClassLoader() 方法的返回值,因此一般称为系统类加载器。它负责加载用户类路径(ClassPath)上所指定的类库,开发者可以直接使用这个类加载器,如果应用程序中没有自定义过自己的类加载器,一般情况下这个就是程序中默认的类加载器。 From fc97755cac62e8b12c3f0b0c45b06418947fa4b7 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Sat, 4 Aug 2018 18:32:17 +0800 Subject: [PATCH 62/87] auto commit --- notes/Java 虚拟机.md | 38 +++++++++--------- pics/926c7438-c5e1-4b94-840a-dcb24ff1dafe.png | Bin 0 -> 19456 bytes pics/c9ad2bf4-5580-4018-bce4-1b9a71804d9c.png | Bin 0 -> 30720 bytes 3 files changed, 19 insertions(+), 19 deletions(-) create mode 100644 pics/926c7438-c5e1-4b94-840a-dcb24ff1dafe.png create mode 100644 pics/c9ad2bf4-5580-4018-bce4-1b9a71804d9c.png diff --git a/notes/Java 虚拟机.md b/notes/Java 虚拟机.md index 69952f2e..4382317b 100644 --- a/notes/Java 虚拟机.md +++ b/notes/Java 虚拟机.md @@ -1,7 +1,7 @@ * [一、运行时数据区域](#一运行时数据区域) * [程序计数器](#程序计数器) - * [虚拟机栈](#虚拟机栈) + * [Java 虚拟机栈](#java-虚拟机栈) * [本地方法栈](#本地方法栈) * [堆](#堆) * [方法区](#方法区) @@ -23,19 +23,19 @@ # 一、运行时数据区域 -

+

## 程序计数器 记录正在执行的虚拟机字节码指令的地址(如果正在执行的是本地方法则为空)。 -## 虚拟机栈 +## Java 虚拟机栈 -每个 Java 方法在执行的同时会创建一个栈帧用于存储局部变量表、操作数栈、常量池引用等信息。每一个方法从调用直至执行完成的过程,就对应着一个栈帧在 Java 虚拟机栈中入栈和出栈的过程。 +每个 Java 方法在执行的同时会创建一个栈帧用于存储局部变量表、操作数栈、常量池引用等信息,从调用直至执行完成的过程,就对应着一个栈帧在 Java 虚拟机栈中入栈和出栈的过程。 -

+

-可以通过 -Xss 这个虚拟机参数来指定一个程序的 Java 虚拟机栈内存大小: +可以通过 -Xss 这个虚拟机参数来指定每个线程的 Java 虚拟机栈内存大小: ```java java -Xss=512M HackTheJava @@ -56,27 +56,22 @@ java -Xss=512M HackTheJava ## 堆 -所有对象实例都在这里分配内存。 +所有对象实例都在这里分配内存,是垃圾收集的主要区域("GC 堆")。 -是垃圾收集的主要区域("GC 堆")。现代的垃圾收集器基本都是采用分代收集算法,主要思想是针对不同的对象采取不同的垃圾回收算法。虚拟机把 Java 堆分成以下三块: +现代的垃圾收集器基本都是采用分代收集算法,针对不同的对象采取不同的垃圾回收算法,可以将堆分成两块: - 新生代(Young Generation) - 老年代(Old Generation) -- 永久代(Permanent Generation) -当一个对象被创建时,它首先进入新生代,之后有可能被转移到老年代中。 - -新生代存放着大量的生命很短的对象,因此新生代在三个区域中垃圾回收的频率最高。为了更高效地进行垃圾回收,把新生代继续划分成以下三个空间: +新生代可以继续划分成以下三个空间: - Eden(伊甸园) - From Survivor(幸存者) - To Survivor -

+堆不需要连续内存,并且可以动态增加其内存,增加失败会抛出 OutOfMemoryError 异常。 -Java 堆不需要连续内存,并且可以动态增加其内存,增加失败会抛出 OutOfMemoryError 异常。 - -可以通过 -Xms 和 -Xmx 两个虚拟机参数来指定一个程序的 Java 堆内存大小,第一个参数设置初始值,第二个参数设置最大值。 +可以通过 -Xms 和 -Xmx 两个虚拟机参数来指定一个程序的堆内存大小,第一个参数设置初始值,第二个参数设置最大值。 ```java java -Xms=1M -Xmx=2M HackTheJava @@ -86,11 +81,13 @@ java -Xms=1M -Xmx=2M HackTheJava 用于存放已被加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。 -和 Java 堆一样不需要连续的内存,并且可以动态扩展,动态扩展失败一样会抛出 OutOfMemoryError 异常。 +和堆一样不需要连续的内存,并且可以动态扩展。 + +动态扩展失败一样会抛出 OutOfMemoryError 异常。 对这块区域进行垃圾回收的主要目标是对常量池的回收和对类的卸载,但是一般比较难实现。 -JDK 1.7 之前,HotSpot 虚拟机把它当成永久代来进行垃圾回收,JDK 1.8 之后,取消了永久代,用 metaspace(元数据)区替代。 +JDK 1.7 之前,HotSpot 虚拟机把它当成永久代来进行垃圾回收。但是从 JDK 1.7 开始,已经把原本放在永久代的字符串常量池移到 Native Method 中。 ## 运行时常量池 @@ -102,7 +99,9 @@ Class 文件中的常量池(编译器生成的各种字面量和符号引用 ## 直接内存 -在 JDK 1.4 中新加入了 NIO 类,它可以使用 Native 函数库直接分配堆外内存,然后通过一个存储在 Java 堆里的 DirectByteBuffer 对象作为这块内存的引用进行操作。这样能在一些场景中显著提高性能,因为避免了在 Java 堆和 Native 堆中来回复制数据。 +在 JDK 1.4 中新加入了 NIO 类,它可以使用 Native 函数库直接分配堆外内存,然后通过一个存储在 Java 堆里的 DirectByteBuffer 对象作为这块内存的引用进行操作。 + +这样能在一些场景中显著提高性能,因为避免了在 Java 堆和 Native 堆中来回复制数据。 # 二、垃圾收集 @@ -751,6 +750,7 @@ public class FileSystemClassLoader extends ClassLoader { # 参考资料 - 周志明. 深入理解 Java 虚拟机 [M]. 机械工业出版社, 2011. +- [Chapter 2. The Structure of the Java Virtual Machine](https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.5.4) - [Jvm memory](https://www.slideshare.net/benewu/jvm-memory) - [Memory Architecture Of JVM(Runtime Data Areas)](https://hackthejava.wordpress.com/2015/01/09/memory-architecture-by-jvmruntime-data-areas/) - [JVM Run-Time Data Areas](https://www.programcreek.com/2013/04/jvm-run-time-data-areas/) diff --git a/pics/926c7438-c5e1-4b94-840a-dcb24ff1dafe.png b/pics/926c7438-c5e1-4b94-840a-dcb24ff1dafe.png new file mode 100644 index 0000000000000000000000000000000000000000..c6cdfd77d1e0d23e71e918e52320e4f7ec87e5c2 GIT binary patch literal 19456 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 V_~P~dod5qh|NnFT|9?FH{{a*g7ghiO literal 0 HcmV?d00001 From e610e0fb102c9b59c86a9d153f157866dd2db73a Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Sat, 4 Aug 2018 19:21:15 +0800 Subject: [PATCH 63/87] auto commit --- notes/Java 虚拟机.md | 69 +++++++++++++---------------- pics/JNI-Java-Native-Interface.jpg | Bin 0 -> 39936 bytes 2 files changed, 31 insertions(+), 38 deletions(-) create mode 100644 pics/JNI-Java-Native-Interface.jpg diff --git a/notes/Java 虚拟机.md b/notes/Java 虚拟机.md index 4382317b..136ca5ad 100644 --- a/notes/Java 虚拟机.md +++ b/notes/Java 虚拟机.md @@ -23,7 +23,7 @@ # 一、运行时数据区域 -

+

## 程序计数器 @@ -33,7 +33,7 @@ 每个 Java 方法在执行的同时会创建一个栈帧用于存储局部变量表、操作数栈、常量池引用等信息,从调用直至执行完成的过程,就对应着一个栈帧在 Java 虚拟机栈中入栈和出栈的过程。 -

+

可以通过 -Xss 这个虚拟机参数来指定每个线程的 Java 虚拟机栈内存大小: @@ -52,7 +52,9 @@ java -Xss=512M HackTheJava 与 Java 虚拟机栈类似,它们之间的区别只不过是本地方法栈为本地方法服务。 -

+本地方法一般是用其它语言(C、C++ 或汇编语言等)编写的, 并且被编译为基于本机硬件和操作系统的程序。 + +

## 堆 @@ -105,7 +107,9 @@ Class 文件中的常量池(编译器生成的各种字面量和符号引用 # 二、垃圾收集 -程序计数器、虚拟机栈和本地方法栈这三个区域属于线程私有的,只存在于线程的生命周期内,线程结束之后也会消失,因此不需要对这三个区域进行垃圾回收。垃圾回收主要是针对 Java 堆和方法区进行。 +垃圾回收主要是针对堆和方法区进行。 + +程序计数器、虚拟机栈和本地方法栈这三个区域属于线程私有的,只存在于线程的生命周期内,线程结束之后也会消失,因此不需要对这三个区域进行垃圾回收。 ## 判断一个对象是否存活 @@ -115,6 +119,8 @@ Class 文件中的常量池(编译器生成的各种字面量和符号引用 两个对象出现循环引用的情况下,此时引用计数器永远不为 0,导致无法对它们进行回收。 +正因为循环引用的存在,因此 Java 虚拟机不使用引用计数算法。 + ```java public class ReferenceCountingGC { public Object instance = null; @@ -128,8 +134,6 @@ public class ReferenceCountingGC { } ``` -正因为循环引用的存在,因此 Java 虚拟机不使用引用计数算法。 - ### 2. 可达性分析算法 通过 GC Roots 作为起始点进行搜索,能够到达到的对象都是存活的,不可达的对象可被回收。 @@ -151,7 +155,7 @@ Java 具有四种强度不同的引用类型。 **(一)强引用** -被强引用关联的对象不会被垃圾收集器回收。 +被强引用关联的对象不会被回收。 使用 new 一个新对象的方式来创建强引用。 @@ -161,7 +165,7 @@ Object obj = new Object(); **(二)软引用** -被软引用关联的对象,只有在内存不够的情况下才会被回收。 +被软引用关联的对象只有在内存不够的情况下才会被回收。 使用 SoftReference 类来创建软引用。 @@ -173,7 +177,7 @@ obj = null; // 使对象只被软引用关联 **(三)弱引用** -被弱引用关联的对象一定会被垃圾收集器回收,也就是说它只能存活到下一次垃圾收集。 +被弱引用关联的对象一定会被回收,也就是说它只能存活到下一次垃圾收集。 使用 WeakReference 类来实现弱引用。 @@ -187,7 +191,7 @@ obj = null; 又称为幽灵引用或者幻影引用。一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用取得一个对象实例。 -为一个对象设置虚引用关联的唯一目的就是能在这个对象被收集器回收时收到一个系统通知。 +为一个对象设置虚引用关联的唯一目的就是能在这个对象被回收时收到一个系统通知。 使用 PhantomReference 来实现虚引用。 @@ -199,20 +203,20 @@ obj = null; ### 4. 方法区的回收 -因为方法区主要存放永久代对象,而永久代对象的回收率比新生代差很多,因此在方法区上进行回收性价比不高。 +因为方法区主要存放永久代对象,而永久代对象的回收率比新生代低很多,因此在方法区上进行回收性价比不高。 主要是对常量池的回收和对类的卸载。 +在大量使用反射、动态代理、CGLib 等 ByteCode 框架、动态生成 JSP 以及 OSGi 这类频繁自定义 ClassLoader 的场景都需要虚拟机具备类卸载功能,以保证不会出现内存溢出。 + 类的卸载条件很多,需要满足以下三个条件,并且满足了也不一定会被卸载: -- 该类所有的实例都已经被回收,也就是 Java 堆中不存在该类的任何实例。 +- 该类所有的实例都已经被回收,也就是堆中不存在该类的任何实例。 - 加载该类的 ClassLoader 已经被回收。 -- 该类对应的 java.lang.Class 对象没有在任何地方被引用,也就无法在任何地方通过反射访问该类方法。 +- 该类对应的 Class 对象没有在任何地方被引用,也就无法在任何地方通过反射访问该类方法。 可以通过 -Xnoclassgc 参数来控制是否对类进行卸载。 -在大量使用反射、动态代理、CGLib 等 ByteCode 框架、动态生成 JSP 以及 OSGi 这类频繁自定义 ClassLoader 的场景都需要虚拟机具备类卸载功能,以保证不会出现内存溢出。 - ### 5. finalize() finalize() 类似 C++ 的析构函数,用来做关闭外部资源等工作。但是 try-finally 等方式可以做的更好,并且该方法运行代价高昂,不确定性大,无法保证各个对象的调用顺序,因此最好不要使用。 @@ -246,16 +250,18 @@ finalize() 类似 C++ 的析构函数,用来做关闭外部资源等工作。 主要不足是只使用了内存的一半。 -现在的商业虚拟机都采用这种收集算法来回收新生代,但是并不是将内存划分为大小相等的两块,而是分为一块较大的 Eden 空间和两块较小的 Survivor 空间,每次使用 Eden 空间和其中一块 Survivor。在回收时,将 Eden 和 Survivor 中还存活着的对象一次性复制到另一块 Survivor 空间上,最后清理 Eden 和使用过的那一块 Survivor。HotSpot 虚拟机的 Eden 和 Survivor 的大小比例默认为 8:1,保证了内存的利用率达到 90%。如果每次回收有多于 10% 的对象存活,那么一块 Survivor 空间就不够用了,此时需要依赖于老年代进行分配担保,也就是借用老年代的空间存储放不下的对象。 +现在的商业虚拟机都采用这种收集算法来回收新生代,但是并不是将新生代划分为大小相等的两块,而是分为一块较大的 Eden 空间和两块较小的 Survivor 空间,每次使用 Eden 空间和其中一块 Survivor。在回收时,将 Eden 和 Survivor 中还存活着的对象一次性复制到另一块 Survivor 空间上,最后清理 Eden 和使用过的那一块 Survivor。 + +HotSpot 虚拟机的 Eden 和 Survivor 的大小比例默认为 8:1,保证了内存的利用率达到 90%。如果每次回收有多于 10% 的对象存活,那么一块 Survivor 空间就不够用了,此时需要依赖于老年代进行分配担保,也就是借用老年代的空间存储放不下的对象。 ### 4. 分代收集 现在的商业虚拟机采用分代收集算法,它根据对象存活周期将内存划分为几块,不同块采用适当的收集算法。 -一般将 Java 堆分为新生代和老年代。 +一般将堆分为新生代和老年代。 - 新生代使用:复制算法 -- 老年代使用:标记 - 清理 或者 标记 - 整理 算法 +- 老年代使用:标记 - 清除 或者 标记 - 整理 算法 ## 垃圾收集器 @@ -263,8 +269,8 @@ finalize() 类似 C++ 的析构函数,用来做关闭外部资源等工作。 以上是 HotSpot 虚拟机中的 7 个垃圾收集器,连线表示垃圾收集器可以配合使用。 -- 单线程与并行(多线程):单线程指的是垃圾收集器只使用一个线程进行收集,而并行使用多个线程。 -- 串行与并发:串行指的是垃圾收集器与用户程序交替执行,这意味着在执行垃圾收集的时候需要停顿用户程序;并发指的是垃圾收集器和用户程序同时执行。除了 CMS 和 G1 之外,其它垃圾收集器都是以串行的方式执行。 +- 单线程与多线程:单线程指的是垃圾收集器只使用一个线程进行收集,而多线程使用多个线程; +- 串行与并行:串行指的是垃圾收集器与用户程序交替执行,这意味着在执行垃圾收集的时候需要停顿用户程序;并形指的是垃圾收集器和用户程序同时执行。除了 CMS 和 G1 之外,其它垃圾收集器都是以串行的方式执行。 ### 1. Serial 收集器 @@ -290,15 +296,15 @@ Serial 翻译为串行,也就是说它以串行的方式执行。 ### 3. Parallel Scavenge 收集器 -与 ParNew 一样是并行的多线程收集器。 +与 ParNew 一样是多线程收集器。 其它收集器关注点是尽可能缩短垃圾收集时用户线程的停顿时间,而它的目标是达到一个可控制的吞吐量,它被称为“吞吐量优先”收集器。这里的吞吐量指 CPU 用于运行用户代码的时间占总时间的比值。 停顿时间越短就越适合需要与用户交互的程序,良好的响应速度能提升用户体验。而高吞吐量则可以高效率地利用 CPU 时间,尽快完成程序的运算任务,主要适合在后台运算而不需要太多交互的任务。 -提供了两个参数用于精确控制吞吐量,分别是控制最大垃圾收集停顿时间 -XX:MaxGCPauseMillis 参数以及直接设置吞吐量大小的 -XX:GCTimeRatio 参数(值为大于 0 且小于 100 的整数)。缩短停顿时间是以牺牲吞吐量和新生代空间来换取的:新生代空间变小,垃圾回收变得频繁,导致吞吐量下降。 +缩短停顿时间是以牺牲吞吐量和新生代空间来换取的:新生代空间变小,垃圾回收变得频繁,导致吞吐量下降。 -还提供了一个参数 -XX:+UseAdaptiveSizePolicy,这是一个开关参数,打开参数后,就不需要手工指定新生代的大小(-Xmn)、Eden 和 Survivor 区的比例(-XX:SurvivorRatio)、晋升老年代对象年龄(-XX:PretenureSizeThreshold)等细节参数了,虚拟机会根据当前系统的运行情况收集性能监控信息,动态调整这些参数以提供最合适的停顿时间或者最大的吞吐量,这种方式称为 GC 自适应的调节策略(GC Ergonomics)。 +可以通过一个开关参数打卡 GC 自适应的调节策略(GC Ergonomics),就不需要手工指定新生代的大小(-Xmn)、Eden 和 Survivor 区的比例、晋升老年代对象年龄等细节参数了。虚拟机会根据当前系统的运行情况收集性能监控信息,动态调整这些参数以提供最合适的停顿时间或者最大的吞吐量,这种方式称为 。 ### 4. Serial Old 收集器 @@ -323,8 +329,6 @@ Serial 翻译为串行,也就是说它以串行的方式执行。 CMS(Concurrent Mark Sweep),Mark Sweep 指的是标记 - 清除算法。 -特点:并发收集、低停顿。 - 分为以下四个流程: - 初始标记:仅仅只是标记一下 GC Roots 能直接关联到的对象,速度很快,需要停顿。 @@ -344,7 +348,7 @@ CMS(Concurrent Mark Sweep),Mark Sweep 指的是标记 - 清除算法。 G1(Garbage-First),它是一款面向服务端应用的垃圾收集器,在多 CPU 和大内存的场景下有很好的性能。HotSpot 开发团队赋予它的使命是未来可以替换掉 CMS 收集器。 -Java 堆被分为新生代、老年代和永久代,其它收集器进行收集的范围都是整个新生代或者老年代,而 G1 可以直接对新生代和老年代一起回收。 +堆被分为新生代和老年代,其它收集器进行收集的范围都是整个新生代或者老年代,而 G1 可以直接对新生代和老年代一起回收。

@@ -372,18 +376,6 @@ G1 把堆划分成多个大小相等的独立区域(Region),新生代和 更详细内容请参考:[Getting Started with the G1 Garbage Collector](http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/G1GettingStarted/index.html) -### 8. 比较 - -| 收集器 | 单线程/并行 | 串行/并发 | 新生代/老年代 | 收集算法 | 目标 | 适用场景 | -| :---: | :---: | :---: | :---: | :---: | :---: | :---: | -| **Serial** | 单线程 | 串行 | 新生代 | 复制 | 响应速度优先 | 单 CPU 环境下的 Client 模式 | -| **Serial Old** | 单线程 | 串行 | 老年代 | 标记-整理 | 响应速度优先 | 单 CPU 环境下的 Client 模式、CMS 的后备预案 | -| **ParNew** | 并行 |串行 | 新生代 | 复制算法 | 响应速度优先 | 多 CPU 环境时在 Server 模式下与 CMS 配合 | -| **Parallel Scavenge** | 并行 | 串行 | 新生代 | 复制算法 | 吞吐量优先 | 在后台运算而不需要太多交互的任务 | -| **Parallel Old** | 并行 | 串行 | 老年代 | 标记-整理 | 吞吐量优先 | 在后台运算而不需要太多交互的任务 | -| **CMS** | 并行 | 并发 | 老年代 | 标记-清除 | 响应速度优先 | 集中在互联网站或 B/S 系统服务端上的 Java 应用 | -| **G1** | 并行 | 并发 | 新生代 + 老年代 | 标记-整理 + 复制算法 | 响应速度优先 | 面向服务端应用,将来替换 CMS | - ## 内存分配与回收策略 ### 1. Minor GC 和 Full GC @@ -752,6 +744,7 @@ public class FileSystemClassLoader extends ClassLoader { - 周志明. 深入理解 Java 虚拟机 [M]. 机械工业出版社, 2011. - [Chapter 2. The Structure of the Java Virtual Machine](https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.5.4) - [Jvm memory](https://www.slideshare.net/benewu/jvm-memory) +- [JNI Part1: Java Native Interface Introduction and “Hello World” application](http://electrofriends.com/articles/jni/jni-part1-java-native-interface/) - [Memory Architecture Of JVM(Runtime Data Areas)](https://hackthejava.wordpress.com/2015/01/09/memory-architecture-by-jvmruntime-data-areas/) - [JVM Run-Time Data Areas](https://www.programcreek.com/2013/04/jvm-run-time-data-areas/) - [Android on x86: Java Native Interface and the Android Native Development Kit](http://www.drdobbs.com/architecture-and-design/android-on-x86-java-native-interface-and/240166271) diff --git a/pics/JNI-Java-Native-Interface.jpg b/pics/JNI-Java-Native-Interface.jpg new file mode 100644 index 0000000000000000000000000000000000000000..28b45e2eeca627f17f7cd0e96a09a197874a07b3 GIT binary patch literal 39936 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

g8o<7Fayj(qwXrap;|{wYe-wYJ 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 literal 0 HcmV?d00001 diff --git a/pics/71f61bc3-582d-4c27-8bdd-dc7fb135bf8f.png b/pics/71f61bc3-582d-4c27-8bdd-dc7fb135bf8f.png new file mode 100644 index 0000000000000000000000000000000000000000..4e99159f155cea26f0e7dc6e4c669c45008d1cf0 GIT binary patch literal 24576 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