0%

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;
}

早些天不忙的时候看的入门,从有道云笔记搬过来的

简介

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

Docker的应用场景

  1. Web 应用的自动化打包和发布。
  2. 自动化测试和持续集成、发布。
  3. 在服务型环境中部署和调整数据库或其他的后台应用。
  4. 从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。
Read more »

昨天在群里看到有人问怎么通过sql在oracle中取微秒

以前没有遇到过,就搜索了一下,找了一会给找到了

1
select to_char(systimestamp, 'yyyy-mm-dd hh24:mi:ss ff') from dual;

输出:年-月-日 时:分:秒 微秒

1
2017-9-24 10:38:27 129368

很少问题是搜索引擎找不到的,学会如何描述问题才是关键