0%

###命令介绍
MySQL的EXPLAIN命令用于SQL语句的查询执行计划(QEP)。

这条命令的输出结果能够让我们了解MySQL 优化器是如何执行

执行下面的SQL

1
explain select * FROM book where name like '活%'

得到下面的数据

idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfileredExtra
编号查询方式表名分区连接方式索引(可能)索引索引长度作用列行数百分比额外
1SIMPLEbooknullALLnullnullnullnull11411.11Using where

###建表语句

Read more »

简单理解IOC和AOP

IOC:Inversion of Control,依赖倒置

生活场景助记

如有有天你想喝一瓶矿泉水,你可以去小区便利店,告诉老板你要买矿泉水,然后老板卖给你。

但是你可能需要想这下雨天怎么去小卖部?是否要带伞?去了之后是否有我想要的水等一系列问题。

解决这个问题:

  1. 使用外卖!到平台注册,告诉平台你需要什么水。
  2. 平台给你送到家,你只管付钱拿到水之后直接喝,不用考虑上述问题。

是不是和Spring的做法很类似呢?Spring就是小卖部,你就是A对象,水就是B对象
第一:在Spring中声明一个类:A
第二:告诉Spring,A需要B

Read more »

Zookeeper的作用

zookeeper用来注册服务和进行负载均衡,哪一个服务由哪一个机器来提供必需让调用者知道,简单来说就是ip地址和服务名称的对应关系。

当然也可以 通过硬编码的方式把这种对应关系在调用方业务代码中实现,但是如果提供服务的机器挂掉调用者无法知晓,如果不更改代码会继续请求挂掉的机器提供服务。

zookeeper通过心跳机制可以检测挂掉的机器并将挂掉机器的ip和服务对应关系从列表中删除。至于支持高并发,简单来说就是横向扩展,在不更改代码 的情况通过添加机器来提高运算能力。

通过添加新的机器向zookeeper注册服务,服务的提供者多了能服务的客户就多了。

dubbo

是管理中间层的工具,在业务层到数据仓库间有非常多服务的接入和服务提供者需要调度,dubbo提供一个框架解决这个问题。

注意这里的dubbo只是一个框架,至于你架子上放什么是完全取决于你的,就像一个汽车骨架,你需要配你的轮子引擎。

这个框架中要完成调度必须要有一个分布式的注册中心,储存所有服务的元数据,你可以用zk,也可以用别的,只是大家都用zk。

zookeeper和dubbo的关系

Dubbo的将注册中心进行抽象,是得它可以外接不同的存储媒介给注册中心提供服务,有ZooKeeper,Memcached,Redis等。

引入了ZooKeeper作为存储媒介,也就把ZooKeeper的特性引进来。

  1. 负载均衡:单注册中心的承载能力是有限的,在流量达到一定程度的时 候就需要分流,负载均衡就是为了分流而存在的,一个ZooKeeper群配合相应的Web应用就可以很容易达到负载均衡;
  2. 资源同步:单单有负载均衡还不 够,节点之间的数据和资源需要同步,ZooKeeper集群就天然具备有这样的功能;
  3. 命名服务:将树状结构用于维护全局的服务地址列表,服务提供者在启动 的时候,向ZK上的指定节点/dubbo/${serviceName}/providers目录下写入自己的URL地址,这个操作就完成了服务的发布
  4. Mast选举,分布式锁等。

参考

https://www.cnblogs.com/xiaofei1208/p/7077733.html

名词解释

  1. 脏读: 对于两个事物 T1, T2, T1 读取了已经被 T2 更新但还没有被提交的字段. 之后, 若 T2 回滚, T1读取的内容就是临时且无效的.
  2. 不可重复读: 对于两个事物 T1, T2, T1 读取了一个字段, 然后 T2 更新了该字段. 之后, T1再次读取同一个字段, 值就不同了.
  3. 幻读: 对于两个事物 T1, T2, T1 从一个表中读取了一个字段, 然后 T2 在该表中插入了一些新的行. 之后, 如果 T1 再次读取同一个表, 就会多出几行.

数据库的4个事物隔离级别

√:可能会出现
×:为不会出现

name名称级别脏读不可重复读幻读
Read uncommitted读未提交1
Read committed读提交2×
Repeatable read重复读3××
Serializable序列化4×××

oracle

Oracle 支持的 2 种事务隔离级别:READ COMMITED, SERIALIZABLE.

Oracle 默认的事务隔离级别为: READ COMMITED

mysql

Mysql 支持 4 中事务隔离级别.

Mysql 默认的事务隔离级别为: REPEATABLE READ

延伸

参考:https://www.cnblogs.com/andy6/p/6045679.html

定义

最多有两棵子树的有序树,称为二叉树。二叉树是一种特殊的树。

性质

这里规定二叉树的根结点的层次为1。

  1. 性质1:则二叉树的第i 层最多有2i-1个结点(在此二叉树的层次从1开始,i≥1)
  2. 性质2:深度为k的二叉树最多有2k-1个结点。(k≥1)
  3. 性质3:对任何一棵二叉树T, 如果其叶结点个数为n0, 度为2的非叶结点个数为n2, 则有
    n0 = n2 + 1
  4. 性质4:具有 n(n>0)个结点的完全二叉树的深度为⎣log2n⎦+1;⎦x⎦表示不超过x的最大整数。
  5. 性质5:如果对一棵有n个结点的完全二叉树的结点按层序编号(从第1层到第⎣l og2n⎦ +1层,每层从左到右),则对任一结点i(1≤i≤n),有:
    5.1 (1)如果i=1,则结点i无双亲,是二叉树的根;如果i>1,则其双亲是结点⎣i/2⎦。
    5.2 (2) 如果2i<=n, 则结点i的左孩子结点是2i;否则,结点i为叶子结点,无左孩子结点。
    5.3 (3)如果2i+1<=n,则结点i的右孩子是结点2i+1; 否则,结点i为叶子结点,无右孩子结点。

完整代码

https://github.com/hisenyuan/btree

二叉链表的实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
package com.hisen.interview.tiger20171110.btree;

/**
* @author : yhx
* @date : 2017/11/10 18:42
* @descriptor : 二叉树的 - 二叉链表实现
*/
public class LinkBTree implements BTree {

private Object data;
private BTree lChild;
private BTree rChild;

public LinkBTree() {
this.clearTree();
}

public LinkBTree(Object data) {
this.data = data;
this.rChild = null;
this.lChild = null;
}

@Override
public void addLfetTree(BTree lChild) {
this.lChild = lChild;
}

@Override
public BTree getLfetTree() {
return lChild;
}

@Override
public void addRightTree(BTree rChild) {
this.rChild = rChild;
}

@Override
public BTree getRightTree() {
return rChild;
}

@Override
public void clearTree() {
this.data = null;
this.rChild = null;
this.lChild = null;
}

@Override
public int getDeep() {
return deep(this);
}


@Override
public Object getRootData() {
return data;
}

@Override
public boolean hasLeftTree() {
if (lChild != null) {
return true;
}
return false;
}

@Override
public boolean hasRightTree() {
if (rChild != null) {
return true;
}
return false;
}

@Override
public boolean isEmptyTree() {
if ((lChild == null && rChild == null && data == null) || this == null) {
return true;
}
return false;
}

@Override
public boolean isLeaf() {
if (lChild == null && rChild == null) {
return true;
}
return false;
}

@Override
public void removeLeftTree() {
lChild = null;
}

@Override
public void removeRightTree() {
rChild = null;
}

@Override
public BTree getRoot() {
return this;
}

@Override
public void setRootData() {
this.data = data;
}

@Override
public int size() {
return size(this);
}

private int size(BTree bTree) {
if (bTree == null) {
return 0;
} else if (bTree.isLeaf()) {
return 1;
} else {
if (bTree.getLfetTree() == null) {
return size(bTree.getRightTree()) + 1;
} else if (bTree.getRightTree() == null) {
return size(bTree.getLfetTree()) + 1;
} else {
return size(bTree.getLfetTree()) + size(bTree.getRightTree()) + 1;
}
}
}

/**
* 计算二叉树的高度
*/
private int deep(BTree bTree) {
if (bTree.isEmptyTree()) {
return 0;
} else if (bTree.isLeaf()) {
return 1;
} else {
if (bTree.getLfetTree() == null) {
return deep(bTree.getRightTree()) + 1;
} else if (bTree.getRightTree() == null) {
return deep(bTree.getLfetTree()) + 1;
} else {
return Math.max(deep(bTree.getLfetTree()), deep(bTree.getRightTree())) + 1;
}
}
}
}

二叉树的各种遍历

遍历方式:前序、中序、后序、层次

Read more »

1
2
3
4
5
6
7
8
#删除原有的规则
route delete 0.0.0.0

#新增外网 172.16.188.254为网关(修改之前先看好)
route add 0.0.0.0 mask 0.0.0.0 172.16.188.254 metric 30 -p

#新增内网 16.0.0.0为内网网段 17.82.200.254为网关
route add 16.0.0.0 mask 255.0.0.0 17.82.200.254 metric 10 -p

带来的问题就是:
内网的数据库,在启动之后。时不时会自动断开,导致影响正常工作,时不时得重启程序才能测试

在eclipse中有列编辑模式:toggle block selection mode

在idea中也可以,而且还比较高级,哈哈

idea -> 右上角 -> Edit -> Column Selection Mode -> 移动光标到你想要弄的行

完事在重复一次,就可以退出列编辑模式

最小公倍数:
数论中的一种概念,两个整数公有的倍数成为他们的公倍数

其中一个最小的公倍数是他们的最小公倍数

同样地,若干个整数公有的倍数中最小的正整数称为它们的最小公倍数


求最小公倍数算法:

最小公倍数=两整数的乘积÷最大公约数


求最大公约数算法:

(1) 辗转相除法

有两整数a和b:

  1. a%b得余数c
  2. 若c=0,则b即为两数的最大公约数
  3. 若c≠0,则a=b,b=c,再回去执行1

例如:求27和15的最大公约数过程为

  1. 27÷15余12
  2. 5÷12余3
  3. 12÷3余0

因此,3即为最大公约数


代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
/**
* 最大公约数
*/
public int getGCD(int m, int n) {
if (n == 0) {
return m;
}
return getGCD(n, m % n);
}

/**
* 最小公倍数
* @param m
* @param n
* @return
*/
public int getLCM(int m, int n) {
int mn = m * n;
return mn / getGCD(m, n);
}

/**
* 辗转相除求最大公约数
* 有两整数a和b:
* ① a%b得余数c
* ② 若c=0,则b即为两数的最大公约数
* ③ 若c≠0,则a=b,b=c,再回去执行①
*/
public int divisionGCD(int m, int n) {
int a;
while (n != 0) {
a = m % n;
m = n;
n = a;
}
return m;
}
/**
* 相减法求最大公约数
* 有两整数a和b:
* ① 若a>b,则a=a-b
* ② 若a<b,则b=b-a
* ③ 若a=b,则a(或b)即为两数的最大公约数
* ④ 若a≠b,则再回去执行①
*/
public int subtractionGCD(int m,int n){
while(m != n){
if (m>n){
m = m-n;
}else {
n = n - m;
}
}
return m;
}