Skip to content

Commit f5c54d3

Browse files
20240911
1 parent fb6b6d6 commit f5c54d3

File tree

4 files changed

+30
-14
lines changed

4 files changed

+30
-14
lines changed

_posts/2022-06-21-java.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,8 @@ JVM触发GC时,首先会让所有的用户线程到达安全点SafePoint时阻
171171
- Mixed GC:整个新生代和部分老年代,只有G1收集器有
172172
- Full GC:整个Java堆和方法区
173173

174+
## 空间担保策略
175+
空间担保策略是 JVM 的一种机制,确保在 Minor GC 时,存活的对象能够成功晋升到老年代。如果老年代没有足够的空间来接收新晋升的对象,JVM 可能会提前触发 Full GC 来释放空间,或者调整内存分配策略避免此类情况的发生。
174176

175177
## 垃圾收集算法
176178
- 标记——清除算法:顾名思义,标记可回收的对象并清除。
@@ -370,6 +372,12 @@ put() 的流程:
370372
2. (n - 1) & hash 计算数组下标,当 n 为二次幂时,等价于取余操作((n - 1)& hash = hash % n)。
371373
3. 判断当前下标是否有元素,若有元素,使用尾插法。再根据链表长度判断是否需要转换成红黑树。
372374

375+
扩容的过程:
376+
1. 将数组扩容成原数组的两倍
377+
2. 重新计算下标,将原 hash 值与 **新数组长度减一**(类似于 put 操作的第二步) 进行“与”操作
378+
3. 如果高位结果是0,桶位置不变
379+
4. 如果高位结果是1,桶位置是原位置 + 扩容长度
380+
373381
Set:
374382
- HashSet: 乱序,基于HashMap实现
375383
- LinkedHashSet: 按插入的顺序排序,基于LinkedHashMap实现

_posts/2022-06-22-mysql.md

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -195,22 +195,20 @@ EXPLAIN 命令的extra一栏中有Using index condition,表明使用了索引
195195

196196
## 事务的隔离
197197

198-
MVCC 用于解决不可重复读的问题,在读已提交和可重复读两种隔离级别生效
198+
MVCC 用于解决脏读和不可重复读的问题,在读已提交和可重复读两种隔离级别生效。读已提交是每次 select 都会重新生成一次 Read View,而可重复读是一次事务只会创建一次且在第一次查询时创建 Read View。
199199

200200
MVCC: Read view + undo log + 两个隐藏字段,基于乐观锁的理论为了解决读写冲突,可以在读已提交和可重复读的隔离级别下使用。
201201
- Read View 是一个事务快照,保存当前事务开启时所有活跃的事务列表。通过与版本链的配合可以实现对数据的 “快照读”。其中也有四个字段,分别是creater_trx_id, m_ids, min_trx_id, max_trx_id。
202202
- undo log 是存放更新前的数据(快照),保存了历史快照
203203
- 隐藏字段:row_trx_id 和 roll_pointer,前者表示更新行数据的事务id,后者是上一次修改之前保存在 undo log 中的记录位置(指针),使**每行记录变化前后形成了一条版本链**
204204

205-
另外,读已提交是每次 select 都会重新生成一次 Read View,而可重复读是一次事务只会创建一次且在第一次查询时创建 Read View
206-
207205
MVCC(Multiversion Concurrency Control) + 间隙锁在RR的隔离级别下能解决大部分幻读情况
208-
- 快照读的情况下(普通 select 语句),通过 MVCC 的方式,在执行第一个查询语句后,会创建一个 Read View,后续的查询语句利用这个 Read View,通过这个 Read View 就可以在 undo log 版本链找到事务开始时的数据,多次查询获取的是同一个快照数据。
209-
- 当前读的情况下(select ... for update 等语句),通过 Next-Lock Key(临键锁),其他事务的插入操作会被阻塞。
206+
- 仅快照读的情况下(普通 select 语句),通过 MVCC 的方式,在执行第一个查询语句后,会创建一个 Read View,后续的查询语句利用这个 Read View,通过这个 Read View 就可以在 undo log 版本链找到事务开始时的数据,多次查询获取的是同一个快照数据。
207+
- 仅当前读的情况下(select ... for update 等语句),通过 Next-Lock Key(临键锁),其他事务的插入操作会被阻塞。
210208
- 查询条件不走索引,退化成**表锁**
211209
- 查询条件走普通索引,锁住查询条件附近的间隙,等于**间隙锁**
212210
- 查询条件走唯一索引,只锁一条数据,等价于**记录锁**
213-
- 解决不了的幻读情况:(MVCC只对于插入数据后的当前读,更新,删除等操作(不使用快照读),仍然存在幻读的问题
211+
- 解决不了的幻读情况:快照读和当前读发生在同一个事务中(更新、删除等操作本质也需要进行当前读
214212
1. 事务A快照读,事务B新增数据并提交,接着事务A修改事务B新增的数据并快照读,此时发生幻读。
215213
2. 事务A快照读,事务B新增数据并提交,接着事务A当前读,此时发生幻读。
216214

_posts/2023-07-06-redis.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,9 +152,11 @@ redis 4.0 后部分命令开始使用多线程。
152152
- Redis 的瓶颈是内存和带宽,而不是 CPU。
153153

154154
[什么是多路IO复用](https://juejin.cn/post/7015927248100261901):一个服务端进程可以同时处理多个客户端连接。用于AOF持久化任务和处理客户端请求。其实现函数有:
155-
- select:数据结构是bitmap,采用轮询,限制连接数为1024个
155+
- select:数据结构是bitmap,采用轮询,限制连接数为1024个(最大文件描述符数量)
156156
- poll:数据结构是数组,解决了select的个数限制,但依旧是轮询
157157
- epoll:数据结构是红黑树,使用回调的方式,解决了个数限制,也解决了轮询方式
158+
1. 边缘触发(Edge Trigger,ET),更适合高流量或发送大文件的场景,例如 nginx
159+
2. 水平触发(Level Trigger,LT),默认,能保证事件一定被处理。
158160

159161

160162

_posts/2023-09-07-note-from-work.md

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,15 @@ pin: false
2121

2222
7. `.gitignore` 是在文件从工作区被 **add** 到暂存区时判断是否要被忽略,对于已经在暂存区的文件,不作判断。
2323

24+
## 数据结构
25+
26+
### 红黑树特性
27+
1. 节点非红即黑
28+
2. 根节点是黑色
29+
3. 叶子节点是黑色的空节点
30+
4. 红节点的子节点是黑节点
31+
5. 从根节点到空节点的每条路径,包含相同数量的黑色节点
32+
2433
## 常见NoSQL数据库类型
2534
1. 键值数据库:Redis
2635
2. 列式数据库:HBase, ClickHouse,适用于联机分析处理(OLAP)场景,数仓等
@@ -310,10 +319,9 @@ SSL 加密是绝对安全的,但是 HTTPS 并不是绝对安全的,可以通
310319
5. 套接字,也可以用于不同主机之间进程的通信
311320

312321
线程间通信方式:
313-
1. 临界区
314-
2. 互斥量(Synchronized/Lock)
315-
3. 信号量(Semphore)
316-
4. 事件(Notify/Wait)
322+
1. 共享内存,比如 volatile 保证内存的可见性。
323+
2. 消息传递,比如 wait/notify/notifyAll 等待通知方式和 join 方式。
324+
3. 管道流
317325

318326
## 用户态和内核态
319327

@@ -403,7 +411,7 @@ Paxos 和 Raft 算法都属于一致性算法,所以是保证 CP
403411

404412
### 为什么三次握手
405413

406-
防止建立历史连接,使得重复连接
414+
因为三次握手才能保证双方具有接收和发送的能力,并且防止重复建立历史连接。
407415

408416
### 为什么四次挥手
409417

@@ -436,9 +444,9 @@ DNS 在进行区域传输的时候使用 TCP,其他情况使用 UDP。
436444
2. 表示层
437445
3. 会话层
438446
2. 传输层:TCP,UDP
439-
3. 网络层:IP,ARP
447+
3. 网络层:IP
440448
4. 网络接口层
441-
1. 数据链路层
449+
1. 数据链路层:ARP
442450
2. 物理层
443451

444452
# 架构

0 commit comments

Comments
 (0)