Skip to content

Commit 28556c1

Browse files
committed
change image
1 parent d63950a commit 28556c1

9 files changed

Lines changed: 120 additions & 5 deletions

File tree

docs/JavaBasic.md

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -715,4 +715,14 @@ RuntimeException异常就是应用程序运行时,可能会抛出的异常。
715715

716716
### 包装类型和基本类型的区别是什么?
717717

718-
最主要的区别是包装类型是对象,拥有字段和方法,可以很方便地调用一些基本的方法,初始值是null,而且可以使用null代表空值,而基本数据类型只能使用0来代表初始值。其次是基本数据类型是直接存储在栈中,而包装类型是一个对象,对象的引用变量是存储在栈中,存储了对象在堆中的地址,对象的数据是存在堆中。
718+
最主要的区别是包装类型是对象,拥有字段和方法,可以很方便地调用一些基本的方法,初始值是null,而且可以使用null代表空值,而基本数据类型只能使用0来代表初始值。其次是基本数据类型是直接存储在栈中,而包装类型是一个对象,对象的引用变量是存储在栈中,存储了对象在堆中的地址,对象的数据是存在堆中。
719+
720+
### JDK8 Stream与普通for循环的区别?
721+
722+
对于简单操作,比如最简单的遍历,Stream串行api性能明显差于显示迭代,但并行的Stream API能够发挥多核特性。
723+
724+
元素为整型时,普通for循环耗时:串行api耗时:双核CPU并行Stream API=1:2:1
725+
726+
元素为字符串型时,普通for循环耗时:串行api耗时:双核CPU并行Stream API=1:1.5:0.72。
727+
728+
https://blog.csdn.net/zhenghongcs/article/details/104305798

docs/Kafka.md

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,3 +136,37 @@
136136

137137
ISR(in-sync replica) 就是 Kafka 为某个分区维护的一组同步集合,即每个分区都有自己的一个 ISR 集合,就是从分区的从节点中找出一些节点加入到ISR集合(min.insync.replicas这个参数设定ISR中的最小副本数是多少,默认值为1)。处于 ISR 集合中的副本,意味着 follower 副本与 leader 副本保持同步状态,只有处于 ISR 集合中的副本才有资格被选举为 leader。follower从leader同步数据有一些延迟(延迟时间replica.lag.time.max.ms),一旦超过延迟时间,就会把这个这个follower从ISR列表中移除。被移除的followe会从leader复制数据进行追赶,一旦追赶上又可以重新进入ISR列表。一条 Kafka 消息,只有被 ISR 中的副本都接收到,才被视为“已同步”状态。这跟 zk 的同步机制不一样,zk 只需要超过半数节点写入,就可被视为已写入成功。
138138

139+
### 什么是零拷贝技术?
140+
传统的IO接口像read和write系统调用,在执行过程中都是涉及到数据拷贝操作的,比如调用read()接口去读取一个文件时,首先需要将CPU由用户切换成内核态,然后把文件从磁盘读取到
141+
142+
#### read()和write()
143+
144+
![图片](../static/640)
145+
146+
**read()系统调用的步骤:**
147+
1.会涉及到到一次用户态到内核态的切换,然后会发出 sys_read()系统调用,从文件读取数据。(一次上下文切换)
148+
2.磁盘控制器会使用DMA技术将磁盘文件拷贝到内核内存空间的缓冲区。(一次DMA拷贝)
149+
3.CPU会将数据从内核内存空间的缓冲区拷贝到用户进程内存空间的缓冲区。(一次CPU拷贝)
150+
4.然后read()系统调用返回后,会进行内核态往用户态的切换,这样用户程序进程就可以修改数据了。(一次上下文切换)
151+
152+
**write()系统调用的步骤:**
153+
1.首先会涉及CPU从用户态切换到内核态,然后会将数据从用户程序的内存空间拷贝到内核内存空间中的Socket缓冲区。(一次上下文切换,一次CPU拷贝)
154+
2.网卡会使用DMA技术,将数据从内核内存空间中的缓冲区拷贝到网卡。(一次DMA拷贝)
155+
3.write()调用完成后会从内核态切换到用户态。(一次上下文切换)
156+
157+
#### 2.MMAP和write()
158+
159+
![图片](../static/640-20210326173442637)
160+
161+
##### mmap
162+
163+
1.CPU从用户态切换到内核态,磁盘控制器使用DMA技术将数据从磁盘拷贝到内核的内存空间。不会将数据拷贝到用户程序的内存空间,而是将一块物理内存让用户进程的空间与内核空间进行共享,将内核中的这部分内存空间映射到用户进程的内存空间,从而让用户进程可以直接访问这部分内存。(一次上下文切换,一次DMA拷贝)
164+
165+
2.mmap调用完毕后,CPU会从内核态切换到用户态。(一次上下文切换)
166+
167+
mmap相比于read()系统调用还是会有2次上下文切换,但是可以减少一次CPU拷贝,因为数据是存在内核的内存空间中。
168+
169+
##### write
170+
171+
https://mp.weixin.qq.com/s/xDZ9NnyUZSoR9npuMLdpWA
172+
https://blog.csdn.net/choumu8867/article/details/100658332

docs/LeetCode1.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1600,7 +1600,7 @@ public boolean canFinish(int numCourses, int[][] prerequisites) {
16001600
}
16011601
```
16021602
##### 拓扑排序
1603-
这种解法有点像是宽度优先遍历,就是先建立邻接表,并且计算每个节点的入度,然后找到入度为0的节点(也就是没有被其他节点指向的节点),将它们入队列,然后对队列元素进行出队操作,取出队首元素,将它的子节点的入度都-1,然后子节点入度减到0时,就将这个子节点添加到队列中,在过程中会统计入过队列的节点数。原理就是如果没有环的,最终队列出队完成后,进入过队列的节点数是等于总节点数的。就是假设图的结构是1->2,2->3,3->4,4->2,也就是2,3,4形成一个环,最开始1是入度为0的节点,1会入队列,然后对节点2的入度-1,节点2的入度还剩下1,此时2不会入队列,所以最终进过队列的元素只有节点1,所以最终统计的数量是<总节点数的。
1603+
这种解法有点像是宽度优先遍历,就是先建立邻接表,并且计算每个节点的入度,然后找到入度为0的节点(也就是没有被其他节点指向的节点),将它们入队列,然后对队列元素进行出队操作,取出队首元素,将它的子节点的入度都-1,然后子节点入度减到0时,就将这个子节点添加到队列中,在过程中会统计入过队列的节点数。原理就是如果没有环的,最终队列出队完成后,进入过队列的节点数是等于总节点数的。就是假设图的结构是1->2,2->3,3->4,4->2,也就是2,3,4形成一个环,最开始1是入度为0的节点,1会入队列,然后对节点2的入度-1,节点2的入度还剩下1,此时2不会入队列,所以最终进过队列的元素只有节点1,所以最终统计的数量是<总节点数的(如果不存在环,则所有节点的入度都会变成0,也就是结果集中的节点树会等于总节点数)
16041604

16051605
### 第309题-最佳买卖股票时机含冷冻期
16061606

docs/MySQLNote.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ undo log是一种逻辑日志,是旧数据的备份。有两个作用用于事
169169

170170
##### redo log是什么?
171171

172-
redo log用于保证数据的持久性。redo log记录的是数据页的物理变化,是新数据的备份,在事务提交前,将redo log 持久化就行,不需要将数据持久化,系统崩溃时,可以根据redo log将数据恢复到最新状态。
172+
redo log用于保证数据的持久性。redo log记录的是数据页的物理变化,是物理日志,是新数据的备份,在事务提交前,将redo log 持久化就行,不需要将数据持久化,系统崩溃时,可以根据redo log将数据恢复到最新状态。
173173

174174
redo log只做顺序追加操作,当事务需要回滚时,在redo log中也不会删除之前的事务记录。
175175

@@ -193,6 +193,8 @@ redo log只做顺序追加操作,当事务需要回滚时,在redo log中也
193193

194194
保存的是逻辑日志,主要是存储每一条会修改数据的SQL。
195195

196+
https://blog.csdn.net/qq_41652863/article/details/98800650
197+
196198

197199
### MySQL中的事务是什么?
198200

@@ -272,6 +274,8 @@ innodb在解决幻读的问题主要是通MVVC 多版本并发版本控制来实
272274

273275
https://dev.mysql.com/doc/refman/5.7/en/innodb-multi-versioning.html
274276

277+
https://blog.csdn.net/qq_41652863/article/details/98800650
278+
275279
### MySQL是怎么解决幻读的问题的?
276280

277281
幻读就是事务执行过程中,在查询一个范围的数据时,有新的数据插入到这个范围,导致两次查询的数据不一致。因为读分为快照读和实时读,

docs/Spring.md

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,4 +241,44 @@ public class NdBeanPostProcessor implements BeanPostProcessor {
241241
}
242242
```
243243

244-
4.**Bean销毁阶段**,用户可以自定义destroyMethod()方法,在Bean被销毁时被调用。
244+
4.**Bean销毁阶段**,用户可以自定义destroyMethod()方法,在Bean被销毁时被调用。
245+
246+
### BeanFactoryFactoryBean有什么区别?
247+
248+
BeanFactory是一个接口,定义了IOC容器的最基本的规范,并提供了IOC容器应遵守的的最基本的方法。在Spring代码中,BeanFactory只是个接口,并不是IOC容器的具体实现,但是Spring容器给出了很多种实现,如 DefaultListableBeanFactoryXmlBeanFactoryApplicationContext等,都是附加了某种功能的实现。
249+
250+
```java
251+
package org.springframework.beans.factory;
252+
import org.springframework.beans.BeansException;
253+
public interface BeanFactory {
254+
String FACTORY_BEAN_PREFIX = "&";
255+
Object getBean(String name) throws BeansException;
256+
<T> T getBean(String name, Class<T> requiredType) throws BeansException;
257+
<T> T getBean(Class<T> requiredType) throws BeansException;
258+
Object getBean(String name, Object... args) throws BeansException;
259+
boolean containsBean(String name);
260+
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
261+
boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
262+
boolean isTypeMatch(String name, Class<?> targetType) throws NoSuchBeanDefinitionException;
263+
Class<?> getType(String name) throws NoSuchBeanDefinitionException;
264+
String[] getAliases(String name);
265+
}
266+
```
267+
268+
FactoryBean是一个接口,有一个创建bean对象的方法getObject(),当一些bean对象不能由ioc容器简单得调用类的构造器方法来创建实例对象时使用,可以将Bean类实现FactoryBean接口,实现getObject()方法,供ioc容器调用来创建bean对象。
269+
270+
```java
271+
public interface FactoryBean<T> {
272+
@Nullable
273+
T getObject() throws Exception;
274+
275+
@Nullable
276+
Class<?> getObjectType();
277+
278+
default boolean isSingleton() {
279+
return true;
280+
}
281+
}
282+
```
283+
284+
https://www.cnblogs.com/aspirant/p/9082858.html

docs/idgenerator.md

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -308,4 +308,31 @@ https://tech.meituan.com/2017/04/21/mt-leaf.html
308308

309309
| **二进制** | 45-47位 | 48-50位 | 51-54位 | 55-57位 | 58-60位 | 61-64位 |
310310
| ---------- | ------- | ------- | ------- | ------- | ------- | ------- |
311-
| **十进制** | 14位 | 15位 | 16位 | 17位 | 18位 | 19位 |
311+
| **十进制** | 14位 | 15位 | 16位 | 17位 | 18位 | 19位 |
312+
313+
314+
315+
调研了Leaf和uid-generator,由于Leaf有额外的zookeeper依赖,
316+
317+
所以选用了uid-generator,做的改进如下:
318+
319+
1.原本是一旦时钟回拨就抛出异常,修改为时钟回拨小于1s时,就不抛出抛出异常,进行等待1s。
320+
321+
2.加了序列号抛弃策略。按照原有序列号位数分配,是13位,就是每秒可以生成的id数是8192个id,如果并发量比较小,由于每秒获取的id的序列号部分都是从0开始的,或导致后缀0的数据会比较多,容易造成数据倾斜的问题,而且也容易泄露数据信息。可以增加抛弃策略,就是取每一秒的id时,计算一个最大值为序列号的10%随机数,从这个随机数开始取。
322+
323+
3.修改了位数分配,原有的时间位是28位的秒级时间差,最长服务年限只支持8.7年,我们把时间差位数分配了30位,最长可以支持34年。原本机器位是22位,支持启动400万次,我们其实不需要那么多次启动,调整成20位,支持100万次启动。1+30+20+13
324+
325+
4.增加机器位用完时的取余操作,便于复用。
326+
327+
328+
329+
leaf的缺点:
330+
331+
1.号段模式的信息安全性问题,不考虑机器线下和重启丢掉的这些id,id是完全连续的,容易被竞争对手猜到信息安全性。
332+
333+
2.小问题修复,就是Leaf为了减少对Zookeeper的依赖,在本地也存了一个上次使用的workid的缓存文件,保证在Zookeeper挂掉的情况下,id生成服务能正常启动,读取本地缓存的workid,然后启动。但是本地缓存文件里面只存储了workid,没有存储上次生成的id的时间戳,假如启动前服务器的时间被修改了,那么启动时就没法对时间进行校验,就会导致生成的id重复。
334+
335+
3.缺乏对最大支持年限的检查,时间戳部分溢出会影响符号位,导致生成的id是负数。
336+
337+
4.注册中心只支持Zookeeper,issue里面很多人提出,对于他们的项目来说,由于需要引入Zookeeper依赖,增加部署和维护Zookeeper成本。所以我fork了这个项目,增加了使用MySQL作为注册中心,以及本地配置作为注册中心的模块。
338+

static/640

10.7 KB
Binary file not shown.

static/640-20210326173442637

10.4 KB
Binary file not shown.

static/qe222wewewqere.jpeg

14.1 KB
Loading

0 commit comments

Comments
 (0)