Skip to content

Commit 5e2c97e

Browse files
committed
Update Java Note
1 parent a8af5d1 commit 5e2c97e

File tree

4 files changed

+55
-47
lines changed

4 files changed

+55
-47
lines changed

DB.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6856,7 +6856,7 @@ MySQL 中还存在 binlog(二进制日志)也可以记录写操作并用于
68566856
* 内容不同:redo log 是物理日志,内容基于磁盘的 Page;binlog 的内容是二进制的,根据 binlog_format 参数的不同,可能基于SQL 语句、基于数据本身或者二者的混合(日志部分详解)
68576857
* 写入时机不同:binlog 在事务提交时一次写入;redo log 的写入时机相对多元
68586858

6859-
binlog 为什么不支持奔溃恢复
6859+
binlog 为什么不支持崩溃恢复
68606860

68616861
* binlog 记录的是语句,并不记录数据页级的数据(哪个页改了哪些地方),所以没有能力恢复数据页
68626862
* binlog 是追加写,保存全量的日志,没有标志确定从哪个点开始的数据是已经刷盘了,而 redo log 只要在 checkpoint_lsn 后面的就是没有刷盘的
@@ -9767,9 +9767,9 @@ Redis 为文件事件编写了多个处理器,这些事件处理器分别用
97679767
Redis 客户端与服务器进行连接并发送命令的整个过程:
97689768

97699769
* Redis 服务器正在运作监听套接字的 AE_READABLE 事件,关联连接应答处理器
9770-
* 当 Redis 客户端向服务器发起连接,监听套接字将产生 AE_READABLE 事件,触发连接应答处理器执行,对客户端的连接请求进行应答,创建客户端套接字以及客户端状态,并将客户端套接字的 AE_READABLE 事件与命令请求处理器进行关联
9770+
* 当 Redis 客户端向服务器发起连接,监听套接字将产生 AE_READABLE 事件,触发连接应答处理器执行,对客户端的连接请求进行应答,创建客户端套接字以及客户端状态,并将客户端套接字的 **AE_READABLE 事件与命令请求处理器**进行关联
97719771
* 客户端向服务器发送命令请求,客户端套接字产生 AE_READABLE 事件,引发命令请求处理器执行,读取客户端的命令内容传给相关程序去执行
9772-
* 执行命令会产生相应的命令回复,为了将这些命令回复传送回客户端,服务器会将客户端套接字的 AE_WRITABLE 事件与命令回复处理器进行关联
9772+
* 执行命令会产生相应的命令回复,为了将这些命令回复传送回客户端,服务器会将客户端套接字的 **AE_WRITABLE 事件与命令回复处理器**进行关联
97739773
* 当客户端尝试读取命令回复时,客户端套接字产生 AE_WRITABLE 事件,触发命令回复处理器执行,在命令回复全部写入套接字后,服务器就会解除客户端套接字的 AE_WRITABLE 事件与命令回复处理器之间的关联
97749774

97759775

@@ -10303,7 +10303,7 @@ struct redisCommand {
1030310303

1030410304
##### 基本介绍
1030510305

10306-
Redis 服务器以周期性事件的方式来运行 serverCron 函数,服务器初始化时读取配置 server.hz 的值,默认为 10,代表每秒钟执行 10 次,即每隔 100 毫秒执行一次,执行指令 info server 可以查看
10306+
Redis 服务器以周期性事件的方式来运行 serverCron 函数,服务器初始化时读取配置 server.hz 的值,默认为 10,代表每秒钟执行 10 次,即**每隔 100 毫秒执行一次**,执行指令 info server 可以查看
1030710307

1030810308
serverCron 函数负责定期对自身的资源和状态进行检查和调整,从而确保服务器可以长期、稳定地运行
1030910309

@@ -12644,7 +12644,7 @@ struct redisServer {
1264412644

1264512645
##### 文件写入
1264612646

12647-
服务器在处理文件事件时可能会执行写命令,追加一些内容到 aof_buf 缓冲区里,所以服务器每次结束一个事件循环之前,就会执行 flushAppendOnlyFile 函数,判断是否需要**将 aof_buf 缓冲区中的内容写入和保存到 AOF 文件**里
12647+
服务器在处理文件事件时会执行**写命令,追加一些内容到 aof_buf 缓冲区**里,所以服务器每次结束一个事件循环之前,就会执行 flushAppendOnlyFile 函数,判断是否需要**将 aof_buf 缓冲区中的内容写入和保存到 AOF 文件**里
1264812648

1264912649
flushAppendOnlyFile 函数的行为由服务器配置的 appendfsync 选项的值来决定
1265012650

@@ -15909,7 +15909,7 @@ Cache Aside Pattern 中服务端需要同时维系 DB 和 cache,并且是以 D
1590915909
* 首次请求数据一定不在 cache 的问题,一般采用缓存预热的方法,将热点数据可以提前放入 cache 中
1591015910
* 写操作比较频繁的话导致 cache 中的数据会被频繁被删除,影响缓存命中率
1591115911

15912-
删除缓存而不是更新缓存的原因:每次更新数据库都更新缓存,造成无效写操作较多(懒惰加载,需要的时候再放入缓存)
15912+
**删除缓存而不是更新缓存的原因**:每次更新数据库都更新缓存,造成无效写操作较多(懒惰加载,需要的时候再放入缓存)
1591315913

1591415914

1591515915

Frame.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1544,9 +1544,9 @@ Reactor 对象通过 select 监控客户端请求事件,收到事件后通过
15441544

15451545
采用多个 Reactor ,执行流程:
15461546

1547-
* Reactor 主线程 MainReactor 通过 select 监控建立连接事件,收到事件后通过 Acceptor 接收,处理建立连接事件,处理完成后 MainReactor 会将连接分配给 Reactor 子线程的 SubReactor(有多个)处理
1547+
* Reactor 主线程 MainReactor 通过 select **监控建立连接事件**,收到事件后通过 Acceptor 接收,处理建立连接事件,处理完成后 MainReactor 会将连接分配给 Reactor 子线程的 SubReactor(有多个)处理
15481548

1549-
* SubReactor 将连接加入连接队列进行监听,并创建一个 Handler 用于处理该连接的事件,当有新的事件发生时,SubReactor 会调用连接对应的 Handler 进行响应
1549+
* SubReactor 将连接加入连接队列进行监听其他事件,并创建一个 Handler 用于处理该连接的事件,当有新的事件发生时,SubReactor 会调用连接对应的 Handler 进行响应
15501550

15511551
* Handler 通过 read 读取数据后,会分发给 Worker 线程池进行业务处理
15521552

Tool.md

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -959,10 +959,10 @@ Linux 系统中查看进程使用情况的命令是 ps 指令
959959
* -T:开启线程查看
960960
* -p:指定线程号
961961

962-
一般常用格式为 ps -ef 或者 ps aux 两种。显示的信息大体一致,略有区别
963-
两者区别:
964-
如果想查看进程的 CPU 占用率和内存占用率,可以使用 aux
965-
如果想查看进程的父进程 ID 和完整的 COMMAND 命令,可以使用 ef
962+
一般常用格式为 ps -ef 或者 ps aux 两种。显示的信息大体一致,略有区别
963+
964+
* 如果想查看进程的 CPU 占用率和内存占用率,可以使用 aux
965+
* 如果想查看进程的父进程 ID 和完整的 COMMAND 命令,可以使用 ef
966966

967967
`ps -T -p <pid>`:显示某个进程的线程
968968

@@ -1520,7 +1520,7 @@ cat 是一个文本文件查看和连接工具。用于小文件
15201520

15211521
#### less
15221522

1523-
less用于查看文件,但是less 在查看之前不会加载整个文件用于大文件
1523+
less 用于查看文件,但是 less 在查看之前不会加载整个文件用于大文件
15241524

15251525
命令:less [options] Filename
15261526

@@ -2015,10 +2015,10 @@ vi/vim 中提供了 **三种** 可视模式, 可以方便程序员的选择 **
20152015
20162016
vim 中提供有一个 被复制文本的缓冲区
20172017
2018-
- 复制 命令会将选中的文字保存在缓冲区
2019-
- 删除 命令删除的文字会被保存在缓冲区
2020-
- 在需要的位置, 使用 粘贴 命令可以将缓冲对的文字插入到光标所在的位置
2021-
- vim中的文本缓冲区只有一个,如果后续做过 复制、剪切操作, 之前缓冲区中的内容会被替换.
2018+
- 复制命令会将选中的文字保存在缓冲区
2019+
- 删除命令删除的文字会被保存在缓冲区
2020+
- 在需要的位置,使用粘贴命令可以将缓冲对的文字插入到光标所在的位置
2021+
- vim 中的文本缓冲区只有一个,如果后续做过 复制、剪切操作之前缓冲区中的内容会被替换.
20222022
20232023
| 快捷键 | 功能描述 |
20242024
| :-----: | :--------------------------: |
@@ -2028,7 +2028,7 @@ vim 中提供有一个 被复制文本的缓冲区
20282028
| p | 将剪切板中的内容粘贴到光标后 |
20292029
| P(大写) | 将剪切板中的内容粘贴到光标前 |
20302030
2031-
注意:vi中的 **文本缓冲区**和系统的**剪切板**不是同一个,在其他软件中使用 Ctrl + C 复制的内容,不能在vim 中通过 `p` 命令粘贴,可以在 **编辑模式** 下使用 **鼠标右键粘贴**
2031+
注意:vim 中的文本缓冲区和系统的剪切板不是同一个,在其他软件中使用 Ctrl + C 复制的内容,不能在 vim 中通过 `p` 命令粘贴,可以在编辑模式下使用鼠标右键粘贴
20322032
20332033
20342034
@@ -2059,8 +2059,8 @@ vim 中提供有一个 被复制文本的缓冲区
20592059
| R | 替换当前行光标后的字符 | 替换模式 |
20602060
20612061
- 光标选中要替换的字符
2062-
- `R` 命令可以进入 **替换模式**, 替换完成后, 按下ESC, 按下 ESC可以回到 **命令模式**
2063-
- **替换命令** 的作用就是不用进入 **编辑模式**, 对文件进行 **轻量级的修改**
2062+
- `R` 命令可以进入替换模式**替换完成后按下 ESC 可以回到 **命令模式**
2063+
- 替换命令的作用就是不用进入编辑模式,对文件进行轻量级的修改
20642064
20652065
20662066
@@ -2091,11 +2091,11 @@ vim 中提供有一个 被复制文本的缓冲区
20912091
20922092
* 如果 vim异常退出, 在磁盘上可能会保存有 交换文件
20932093
2094-
* 下次再使用 vim 编辑文件时, 会看到以下屏幕信息,
2094+
* 下次再使用 vim 编辑文件时会看到以下屏幕信息
20952095
20962096
![](https://seazean.oss-cn-beijing.aliyuncs.com/img/Tool/vim异常.png)
20972097
2098-
* ls -a 一下,会看到隐藏的.swp文件 删除了此文件即可
2098+
* ls -a 一下,会看到隐藏的 .swp 文件 删除了此文件即可
20992099
21002100
21012101

Web.md

Lines changed: 33 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2105,18 +2105,6 @@ URL 和 URI
21052105

21062106
* 区别:`URL - HOST = URI`,URI 是抽象的定义,URL 用地址定位,URI 用名称定位。**只要能唯一标识资源的是 URI,在 URI 的基础上给出其资源的访问方式的是 URL**
21072107

2108-
短连接和长连接:
2109-
2110-
* 短连接:客户端和服务器每进行一次 HTTP 操作,就建立一次连接,任务结束就中断连接
2111-
2112-
使用短连接的情况下,当浏览器访问的某个 HTML 或其他类型的 Web 页中包含有其他的 Web 资源(图像文件、CSS 文件等),每遇到这样一个 Web 资源,浏览器就会经过三次握手重新建立一个 HTTP 会话
2113-
2114-
* 长连接:使用长连接的 HTTP 协议,会在响应头加入这行代码 `Connection:keep-alive`
2115-
2116-
使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输 HTTP 数据的 TCP 连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。Keep-Alive 有一个保持时间,不会永久保持连接,设置以后可以实现长连接,前提是需要客户端和服务端都支持长连接
2117-
2118-
* HTTP 协议的长连接和短连接,实质上是 TCP 协议的长连接和短连接
2119-
21202108
**从浏览器地址栏输入 URL 到请求返回发生了什么?**
21212109

21222110
* 进行 URL 解析,进行编码
@@ -2137,6 +2125,10 @@ URL 和 URI
21372125

21382126

21392127

2128+
推荐阅读:https://xiaolincoding.com/network/
2129+
2130+
2131+
21402132
***
21412133

21422134

@@ -2155,25 +2147,35 @@ HTTP 1.0 和 HTTP 1.1 的主要区别:
21552147

21562148
* 长短连接:
21572149

2158-
**在HTTP/1.0中,默认使用的是短连接**,每次请求都要重新建立一次连接。HTTP 基于 TCP/IP 协议的,每一次建立或者断开连接都需要三次握手四次挥手,开销会比较大
2150+
**在HTTP/1.0中,默认使用的是短连接**,每次请求都要重新建立一次连接,比如获取 HTML 和 CSS 文件,需要两次请求。HTTP 基于 TCP/IP 协议的,每一次建立或者断开连接都需要三次握手四次挥手,开销会比较大
21592151

2160-
**HTTP 1.1起,默认使用长连接** ,默认开启 `Connection: keep-alive`,HTTP/1.1 的持续连接有非流水线方式和流水线方式 ,流水线方式是客户端在收到 HTTP 的响应报文之前就能接着发送新的请求报文,非流水线方式是客户端在收到前一个响应后才能发送下一个请求
2152+
**HTTP 1.1起,默认使用长连接** ,默认开启 `Connection: keep-alive`,Keep-Alive 有一个保持时间,不会永久保持连接。持续连接有非流水线方式和流水线方式 ,流水线方式是客户端在收到 HTTP 的响应报文之前就能接着发送新的请求报文,非流水线方式是客户端在收到前一个响应后才能发送下一个请求
2153+
2154+
HTTP 协议的长连接和短连接,实质上是 TCP 协议的长连接和短连接
21612155

21622156
* 错误状态响应码:在 HTTP1.1 中新增了 24 个错误状态响应码,如 409(Conflict)表示请求的资源与资源的当前状态发生冲突,410(Gone)表示服务器上的某个资源被永久性的删除
21632157

2164-
* 缓存处理:在 HTTP1.0 中主要使用 header 里的 If-Modified-Since,Expires 来做为缓存判断的标准,HTTP1.1 则引入了更多的**缓存控制策略**例如 Entity tag,If-Unmodified-Since,If-Match,If-None-Match等
2158+
* 缓存处理:在 HTTP1.0 中主要使用 header 里的 If-Modified-Since,Expires 来做为缓存判断的标准,HTTP1.1 则引入了更多的缓存控制策略,例如 Entity tag,If-Unmodified-Since,If-Match,If-None-Match等
21652159

2166-
* 带宽优化及网络连接的使用:HTTP1.0 存在一些浪费带宽的现象,例如客户端只需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1 则在请求头引入了 range 头域,允许只**请求资源的某个部分**,即返回码是 206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接
2160+
* 带宽优化及网络连接的使用:HTTP1.0 存在一些浪费带宽的现象,例如客户端只需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持**断点续传**功能,HTTP1.1 则在请求头引入了 range 头域,允许只**请求资源的某个部分**,即返回码是 206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接
21672161

21682162
* HOST 头处理:在 HTTP1.0 中认为每台服务器都绑定一个唯一的 IP 地址,因此请求消息中的 URL 并没有传递主机名。HTTP1.1 时代虚拟主机技术发展迅速,在一台物理服务器上可以存在多个虚拟主机,并且共享一个 IP 地址,故 HTTP1.1 增加了 HOST 信息
21692163

21702164
HTTP 1.1 和 HTTP 2.0 的主要区别:
21712165

21722166
* 新的二进制格式:HTTP1.1 基于文本格式传输数据,HTTP2.0 采用二进制格式传输数据,解析更高效
2173-
* **多路复用**:在一个连接里,允许同时发送多个请求或响应,**并且这些请求或响应能够并行的传输而不被阻塞**,避免 HTTP1.1 出现的队头堵塞问题
2174-
* 头部压缩,HTTP1.1 的 header 带有大量信息,而且每次都要重复发送;HTTP2.0 把 header 从数据中分离,并封装成头帧和数据帧,**使用特定算法压缩头帧**。并且 HTTP2.0 在客户端和服务器端记录了之前发送的键值对,对于相同的数据不会重复发送。比如请求 A 发送了所有的头信息字段,请求 B 则只需要发送差异数据,这样可以减少冗余数据,降低开销
2167+
* **多路复用**:在一个连接里,允许同时发送多个请求或响应,并且这些请求或响应能够并行的传输而不被阻塞,避免 HTTP1.1 出现的队头堵塞问题
2168+
* 头部压缩,HTTP1.1 的 header 带有大量信息,而且每次都要重复发送;HTTP2.0 把 header 从数据中分离,并封装成头帧和数据帧,使用特定算法压缩头帧。并且 HTTP2.0 在客户端和服务器端记录了之前发送的键值对,对于相同的数据不会重复发送。比如请求 A 发送了所有的头信息字段,请求 B 则只需要发送差异数据,这样可以减少冗余数据,降低开销
21752169
* **服务端推送**:HTTP2.0 允许服务器向客户端推送资源,无需客户端发送请求到服务器获取
21762170

2171+
2172+
2173+
****
2174+
2175+
2176+
2177+
## 安全请求
2178+
21772179
HTTP 和 HTTPS 的区别:
21782180

21792181
* 端口 :HTTP 默认使用端口 80,HTTPS 默认使用端口 443
@@ -2187,17 +2189,23 @@ HTTP 和 HTTPS 的区别:
21872189
* 缺点:无法安全的将密钥传输给通信方
21882190

21892191
* 非对称加密:加密和解密使用不同的秘钥,一把作为公开的公钥,另一把作为私钥,**公钥公开给任何人**(类似于把锁和箱子给别人,对方打开箱子放入数据,上锁后发送),典型的非对称加密算法有 RSA、DSA 等
2190-
* 优点:可以更安全地将公开密钥传输给通信发送方
2191-
* 缺点:运算速度慢
2192-
2192+
2193+
* 公钥加密,私钥解密:为了**保证内容传输的安全**,因为被公钥加密的内容,其他人是无法解密的,只有持有私钥的人,才能解密出实际的内容
2194+
* 私钥加密,公钥解密:为了**保证消息不会被冒充**,因为私钥是不可泄露的,如果公钥能正常解密出私钥加密的内容,就能证明这个消息是来源于持有私钥身份的人发送的
2195+
* 可以更安全地将公开密钥传输给通信发送方,但是运算速度慢
2196+
21932197
* **使用对称加密和非对称加密的方式传送数据**
21942198

21952199
* 使用非对称密钥加密方式,传输对称密钥加密方式所需要的 Secret Key,从而保证安全性
21962200
* 获取到 Secret Key 后,再使用对称密钥加密方式进行通信,从而保证效率
21972201

21982202
思想:锁上加锁
2199-
2200-
* 数字签名:附加在报文上的特殊加密校验码,可以防止报文被篡改,一般是通过哈希算法
2203+
2204+
名词解释:
2205+
2206+
* 哈希算法:通过哈希函数计算出内容的哈希值,传输到对端后会重新计算内容的哈希,进行哈希比对来校验内容的完整性
2207+
2208+
* 数字签名:附加在报文上的特殊加密校验码,可以防止报文被篡改。一般是通过私钥对内容的哈希值进行加密,公钥正常解密并对比哈希值后,可以确保该内容就是对端发出的,防止出现中间人替换的问题
22012209

22022210
* 数字证书:由权威机构给某网站颁发的一种认可凭证
22032211

@@ -2206,9 +2214,9 @@ HTTPS 工作流程:服务器端的公钥和私钥,用来进行非对称加
22062214
![](https://seazean.oss-cn-beijing.aliyuncs.com/img/Web/HTTP-HTTPS加密过程.png)
22072215

22082216
1. 客户端向服务器发起 HTTPS 请求,连接到服务器的 443 端口,请求携带了浏览器支持的加密算法和哈希算法,协商加密算法
2209-
2. 服务器端会向数字证书认证机构提出公开密钥的申请,认证机构对公开密钥做数字签名后进行分配,会将公钥绑定在数字证书(又叫公钥证书,内容有公钥,网站地址,证书颁发机构,失效日期等)
2217+
2. 服务器端会向数字证书认证机构注册公开密钥,认证机构**用 CA 私钥**对公开密钥做数字签名后绑定在数字证书(又叫公钥证书,内容有公钥,网站地址,证书颁发机构,失效日期等)
22102218
3. 服务器将数字证书发送给客户端,私钥由服务器持有
2211-
4. 客户端收到服务器端的数字证书后对证书进行检查,验证其合法性,如果发现发现证书有问题,那么 HTTPS 传输就无法继续。如果公钥合格,那么客户端会生成一个随机值,**这个随机值就是用于进行对称加密的密钥**,将该密钥称之为 client key(客户端密钥、会话密钥)。用服务器的公钥对客户端密钥进行非对称加密,这样客户端密钥就变成密文,HTTPS 中的第一次 HTTP 请求结束
2219+
4. 客户端收到服务器端的数字证书后**通过 CA 公钥**(事先置入浏览器或操作系统)对证书进行检查,验证其合法性。如果公钥合格,那么客户端会生成一个随机值,这个随机值就是用于进行对称加密的密钥,将该密钥称之为 client key(客户端密钥、会话密钥)。用服务器的公钥对客户端密钥进行非对称加密,这样客户端密钥就变成密文,HTTPS 中的第一次 HTTP 请求结束
22122220
5. 客户端会发起 HTTPS 中的第二个 HTTP 请求,将加密之后的客户端密钥发送给服务器
22132221
6. 服务器接收到客户端发来的密文之后,会用自己的私钥对其进行非对称解密,解密之后的明文就是客户端密钥,然后用客户端密钥对数据进行对称加密,这样数据就变成了密文
22142222
7. 服务器将加密后的密文发送给客户端

0 commit comments

Comments
 (0)