-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfeed.xml
1178 lines (871 loc) · 85.1 KB
/
feed.xml
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
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>chankin's Blog</title>
<description></description>
<link>https://Chankin026.github.io/</link>
<atom:link href="https://Chankin026.github.io/feed.xml" rel="self" type="application/rss+xml"/>
<pubDate>Sun, 24 Feb 2019 23:01:36 +0800</pubDate>
<lastBuildDate>Sun, 24 Feb 2019 23:01:36 +0800</lastBuildDate>
<generator>Jekyll v3.8.5</generator>
<item>
<title>mysql主从复制的理解和实现</title>
<description><ul id="markdown-toc">
<li><a href="#mysql的复制概念" id="markdown-toc-mysql的复制概念">Mysql的复制概念</a> <ul>
<li><a href="#mysql的binarylog" id="markdown-toc-mysql的binarylog">Mysql的binary—log</a></li>
<li><a href="#mysql复制所解决的问题" id="markdown-toc-mysql复制所解决的问题">Mysql复制所解决的问题</a></li>
<li><a href="#主从复制原理" id="markdown-toc-主从复制原理">主从复制原理</a></li>
<li><a href="#主从复制的优点" id="markdown-toc-主从复制的优点">主从复制的优点</a></li>
<li><a href="#缺点" id="markdown-toc-缺点">缺点</a></li>
</ul>
</li>
<li><a href="#mysql主从同步的实现" id="markdown-toc-mysql主从同步的实现">MySQL主从同步的实现</a> <ul>
<li><a href="#配置master" id="markdown-toc-配置master">配置master</a></li>
<li><a href="#配置slave" id="markdown-toc-配置slave">配置slave</a></li>
<li><a href="#测试" id="markdown-toc-测试">测试</a></li>
</ul>
</li>
<li><a href="#深入了解" id="markdown-toc-深入了解">深入了解</a></li>
<li><a href="#参考地址" id="markdown-toc-参考地址">参考地址</a></li>
</ul>
<h3 id="mysql的复制概念">Mysql的复制概念</h3>
<img src="/images/mysql1.png" alt="1546356512911" />
Mysql内置的复制功能是构建大型高可用高性能应用的基础。 允许将来自一个MySQL数据库(master)的数据复制到一个或多个MySQL数据库服务器( slave ), 它可以进行<strong>异步的复制</strong>,并不需要永久的连接。
通过配置,可以复制所有的数据库,某个数据库和表。 而实现复制功能的关键在于开启mysql的二进制日志log-bin。
<h4 id="mysql的binarylog">Mysql的binary—log</h4>
MySQL的二进制日志binlog可以说是MySQL最重要的日志,它记录了数据库的DDL和DML语句(除了查询语句),以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的。
<em>DDL主要用于</em>create、alter、drop等*
<em>DML主要用于select、insert、update和delete数据</em>
binlog日志包括两类文件:
1)二进制日志索引文件(文件名后缀为.index)用于记录所有的二进制文件
2)二进制日志文件(文件名后缀为.00000*)记录数据库所有的DDL和DML(除了select)语句事件。
<img src="/images/mysql2.png" alt="binary-log" />
<h4 id="mysql复制所解决的问题">Mysql复制所解决的问题</h4>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code> 1. 数据分布 (Data distribution )
2. 负载均衡(load balancing)
3. 数据备份(Backups) ,保证数据安全
4. 高可用性和容错行(High availability and failover)
5. 实现读写分离,缓解数据库压力
</code></pre></div></div>
<h4 id="主从复制原理">主从复制原理</h4>
<ol>
<li>
master服务器将数据改变记录到binlog日志
</li>
<li>
salve服务器在一定时间间隔内探测master的binlog日志是否改变。
1)如果改变,则I/O线程请求master二进制事件。
2)同时master为每个I/O线程启动一个dump线程,用于向其发送二进制事件。
3)slave将事件保存至本地的中继日志(relay log) 中。
4)slave将启动SQL线程从中继日志(relay log) 读取二进制日志,在slave上回放。使得其数据和master保持一致。
</li>
<li>
最后I/O线程和SQL线程将进入睡眠状态,等待下一次探测。
</li>
</ol>
<img src="/images/mysql3.png" alt="过程" />
Mysql复制的流程图如下:
<img src="/images/mysql4.png" alt="流程" />
<h4 id="主从复制的优点">主从复制的优点</h4>
<ol>
<li>在从服务器实现查询,降低主服务器压力;(主库写,从库读,降压)</li>
<li>从主服务器中进行数据备份,避免备份期间影响主服务器服务;(确保数据安全)</li>
<li>当主服务器出现问题时,可以切换到从服务器。(提升性能)</li>
</ol>
<h4 id="缺点">缺点</h4>
复制是异步且串行化的, 复制在slave上是串行化的,也就是说master上的并行更新操作不能在slave上并行操作。
<h3 id="mysql主从同步的实现">MySQL主从同步的实现</h3>
我这里是windows加centos, 需要ping 互通 以及开放端口号
首先,尽量保持两个服务器上的mysql版本一致
将windos中配置为master服务器,CentOS为slave服务器
<h4 id="配置master">配置master</h4>
需修改my.ini
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">[</span>mysqld]
<span class="c"># 添加生成记录文件位置</span>
log-bin<span class="o">=</span>mysql-bin
<span class="c"># 设置为master服务器</span>
server-id<span class="o">=</span>1
</code></pre></div></div>
重启mysql服务
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>net stop/start mysql
</code></pre></div></div>
登录mysql
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">show</span> <span class="n">master</span> <span class="n">status</span><span class="p">;</span> <span class="o">#</span> <span class="err">记录</span><span class="n">file</span><span class="err">和</span><span class="n">Postion</span><span class="err">值</span>
</code></pre></div></div>
<img src="/images/mysql5.png" alt="记录" />
创建并授权用户,后两个slave分别是用户名和密码
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">#</span> <span class="err">这里</span><span class="n">ip</span><span class="err">为</span><span class="n">slaveip</span><span class="err">地址</span> <span class="n">ip</span> <span class="n">addr</span><span class="err">查询</span>
<span class="k">grant</span> <span class="n">replication</span> <span class="n">slave</span> <span class="k">on</span> <span class="o">*</span><span class="p">.</span><span class="o">*</span> <span class="k">to</span> <span class="s1">'chankin'</span><span class="o">@</span><span class="s1">'192.168.2.108'</span> <span class="n">identified</span> <span class="k">by</span> <span class="s1">'chankin'</span><span class="p">;</span>
<span class="o">#</span> <span class="err">权限生效</span>
<span class="n">flush</span> <span class="k">privileges</span><span class="p">;</span>
</code></pre></div></div>
<hr />
<h4 id="配置slave">配置slave</h4>
修改vim /etc/my.cnf 配置文件
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># 添加生成记录文件位置</span>
log-bin<span class="o">=</span>mysql-bin
<span class="c"># 设置为从服务器</span>
server-id<span class="o">=</span>2
</code></pre></div></div>
重启mysql服务
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>systemctl restart mysql
</code></pre></div></div>
配置同步参数,登陆mysql,输入如下信息:
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">mysql</span><span class="o">&gt;</span> <span class="n">CHANGE</span> <span class="n">MASTER</span> <span class="k">TO</span>
<span class="o">&gt;</span> <span class="n">MASTER_HOST</span><span class="o">=</span><span class="s1">'192.168.2.100'</span><span class="p">,</span> <span class="o">#</span> <span class="n">master</span> <span class="n">ip</span>
<span class="o">&gt;</span> <span class="n">MASTER_USER</span><span class="o">=</span><span class="s1">'chankin'</span><span class="p">,</span> <span class="o">#</span> <span class="err">同步账户名</span>
<span class="o">&gt;</span> <span class="n">MASTER_PASSWORD</span><span class="o">=</span><span class="s1">'chankin1'</span><span class="p">,</span> <span class="o">#</span> <span class="err">同步密码</span>
<span class="o">&gt;</span> <span class="n">MASTER_LOG_FILE</span><span class="o">=</span><span class="s1">'mysql-bin.000002'</span><span class="p">,</span> <span class="o">#</span> <span class="err">从</span><span class="n">master</span><span class="err">服务器同步的日志文件</span>
<span class="o">&gt;</span> <span class="n">MASTER_LOG_POS</span><span class="o">=</span><span class="mi">762</span><span class="p">;</span> <span class="o">#</span> <span class="err">日志的开始位置。</span>
</code></pre></div></div>
启动slave并查看
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">mysql</span><span class="o">&gt;</span> <span class="k">start</span> <span class="n">slave</span><span class="p">;</span> <span class="o">#</span> <span class="err">启动从服务器复制功能</span>
<span class="n">mysql</span><span class="o">&gt;</span> <span class="k">show</span> <span class="n">slave</span> <span class="n">status</span> <span class="err">\</span><span class="k">G</span> <span class="o">#</span> <span class="err">查看从服务器状态</span>
</code></pre></div></div>
<img src="/images/mysql6.png" alt="status" />
Slave_IO_Running: connecting 说明没有配置成功
检查 发现密码错了,停止slave服务重新配置同步参数
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">mysql</span><span class="o">&gt;</span> <span class="n">stop</span> <span class="n">slave</span><span class="p">;</span> <span class="o">#</span> <span class="err">停止复制</span>
<span class="o">#</span> <span class="err">省略</span>
<span class="n">mysql</span><span class="o">&gt;</span> <span class="k">show</span> <span class="n">slave</span> <span class="n">status</span> <span class="err">\</span><span class="k">G</span> <span class="o">#</span> <span class="err">再次检查</span>
</code></pre></div></div>
<img src="/images/mysql7.png" alt="status" />
<strong>Slave_IO_Running: Yes 和 Slave_SQL_Running: Yes</strong> 说明 主从同步配置成了。
<h4 id="测试">测试</h4>
在master服务器上创建数据库-表 , 插入数据
slave上select就可查到了
具体略
<h3 id="深入了解">深入了解</h3>
<a href="https://www.cnblogs.com/kevingrace/p/6256603.html">Mysql主从同步(1)-主从/主主环境部署梳理</a>
<h3 id="参考地址">参考地址</h3>
<a href="https://www.cnblogs.com/kylinlin/p/5258719.html">Mysql主从同步(复制)</a>
<a href="https://www.cnblogs.com/kevingrace/p/5907254.html">Mysql之binlog日志说明及利用binlog日志恢复数据操作记录</a>
<a href="https://www.cnblogs.com/chhuang/p/4182868.html">集群CLUSTER种类介绍</a>
</description>
<pubDate>Tue, 20 Nov 2018 00:00:00 +0800</pubDate>
<link>https://Chankin026.github.io/2018/11/20/Mysql-replication/</link>
<guid isPermaLink="true">https://Chankin026.github.io/2018/11/20/Mysql-replication/</guid>
<category>Mysql</category>
<category>Mysql</category>
</item>
<item>
<title>Docker的入门</title>
<description><ul id="markdown-toc">
<li><a href="#了解docker概念" id="markdown-toc-了解docker概念">了解Docker概念:</a></li>
<li><a href="#理解docker原理" id="markdown-toc-理解docker原理">理解Docker原理:</a></li>
<li><a href="#简单的运用docker" id="markdown-toc-简单的运用docker">简单的运用Docker</a></li>
<li><a href="#使用镜像" id="markdown-toc-使用镜像">使用镜像</a> <ul>
<li><a href="#拉取镜像" id="markdown-toc-拉取镜像">拉取镜像</a></li>
<li><a href="#运行镜像" id="markdown-toc-运行镜像">运行镜像</a></li>
</ul>
</li>
</ul>
<h2 id="了解docker概念">了解Docker概念:</h2>
<a href="http://dockone.io/article/6051">可能是把Docker的概念讲的最清楚的一篇文章</a>
<h2 id="理解docker原理">理解Docker原理:</h2>
<strong><a href="http://dockone.io/article/783">10张图带你深入理解Docker容器和镜像</a></strong>
–大神级别文章,清晰地阐述了其存储原理及命令
<strong><a href="http://guide.daocloud.io/dcs/daocloud-services-9152632.html">DCS 文档</a></strong>
<strong><a href="http://guide.daocloud.io/dcs/allen-docker-9153965.html">Docker 系列:</a></strong>
<ul>
<li><a href="http://guide.daocloud.io/dcs/docker-9153976.html">一图看尽 docker 容器文件系统</a></li>
<li><a href="http://guide.daocloud.io/dcs/docker-logs-9153967.html">docker logs 实现剖析</a></li>
<li><a href="http://guide.daocloud.io/dcs/docker-exec-9153970.html">docker exec 与容器日志</a></li>
<li><a href="http://guide.daocloud.io/dcs/docker-9153973.html">Docker 容器日志的那些事儿</a></li>
<li><a href="http://guide.daocloud.io/dcs/docker-9153979.html">深刻理解 Docker 镜像大小</a></li>
<li><a href="http://guide.daocloud.io/dcs/docker-9153982.html">Docker 镜像内有啥,存哪?</a></li>
<li><a href="http://guide.daocloud.io/dcs/docker-json-9153985.html">深入理解 Docker 镜像 json 文件</a></li>
<li><a href="http://guide.daocloud.io/dcs/docker-build-cache-9153988.html">docker build 的 cache 机制</a></li>
<li><a href="http://guide.daocloud.io/dcs/docker-commit-9153991.html">docker commit 的来龙去脉</a></li>
<li><a href="http://guide.daocloud.io/dcs/docker-root-9153994.html">Docker 容器的 root 安全吗?</a></li>
<li><a href="http://guide.daocloud.io/dcs/docker-9153997.html">存储类 Docker 容器的明文密码问题</a></li>
<li><a href="http://guide.daocloud.io/dcs/docker-9154000.html">Docker 容器明文密码问题解决之道</a></li>
</ul>
<h2 id="简单的运用docker">简单的运用Docker</h2>
安装:
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>yum <span class="nb">install </span>docker
</code></pre></div></div>
安装好后启动docker:
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>systemctl start docker <span class="c">#启动docker stop restart 停止 重启</span>
docker ‐v
systemctl <span class="nb">enable </span>docker <span class="c">#开机启动</span>
</code></pre></div></div>
<h2 id="使用镜像">使用镜像</h2>
<h3 id="拉取镜像">拉取镜像</h3>
在docker hub上已经有很多现成的镜像了,只需要执行docker pull命令就可以拉取到本地:
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker search tomcat <span class="c">#搜索镜像 </span>
docker pull tomcat <span class="c"># 命令:docker pull 镜像名:[标签(版本)] </span>
</code></pre></div></div>
就这样,简单的一条命令就把tomcat运行环境的镜像pull到本地了,这里没有选取tomcat的版本,默认是latest。
查看本地镜像列表:
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker images <span class="c">#本地镜像列表</span>
</code></pre></div></div>
<img src="https://raw.githubusercontent.com/objcoding/objcoding.github.io/master/images/docker.png" alt="images" />
<h3 id="运行镜像">运行镜像</h3>
拉取镜像后,那么我们试着运行一下镜像:
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker run <span class="nt">--name</span> mytomcat <span class="nt">-d</span> <span class="nt">-p</span> 8888:8080 tomcat
<span class="c"># --name 指定名称</span>
<span class="c"># 最后一个参数运行的镜像名</span>
<span class="c">#-d 后台运行 -p ‐p: 将主机的端口8888映射到容器的一个端口8080 </span>
</code></pre></div></div>
常用的一些参数如下:
<ul>
<li>
-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
</li>
<li>
-d: 后台运行容器,并返回容器ID;
</li>
<li>
-i: 以交互模式运行容器,通常与 -t 同时使用;
</li>
<li>
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
</li>
<li>
–name=”nginx-lb”: 为容器指定一个名称;
</li>
<li>
–dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
</li>
<li>
–dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
</li>
<li>
-h “mars”: 指定容器的hostname;
</li>
<li>
-e username=”ritchie”: 设置环境变量;
</li>
<li>
–env-file=[]: 从指定文件读入环境变量;
</li>
<li>
–cpuset=”0-2” or –cpuset=”0,1,2”: 绑定容器到指定CPU运行;
</li>
<li>
-m :设置容器使用内存最大值;
</li>
<li>
–net=”bridge”: 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
</li>
<li>
–link=[]: 添加链接到另一个容器;
</li>
<li>
–expose=[]: 开放一个端口或一组端口;
</li>
</ul>
</description>
<pubDate>Wed, 14 Nov 2018 00:00:00 +0800</pubDate>
<link>https://Chankin026.github.io/2018/11/14/Docker(1)/</link>
<guid isPermaLink="true">https://Chankin026.github.io/2018/11/14/Docker(1)/</guid>
<category>Docker</category>
<category>Docker</category>
</item>
<item>
<title>RSA非对称加密的简单理解</title>
<description>RSA是一种公开密钥算法。通常是通讯双方各成一对RSA公秘钥,公钥和私钥都可以用于加密和解密。其中私钥用户保存(不公开),公钥对外公开,任何人都可以获取。
假设A给B发送文本
RSA签名加密过程如下:
<ol>
<li>B传递自己的公钥给A;</li>
<li>A对明文进行Hash运算得到信息摘要,用自己的私钥对摘要进行加密,形成数字签名, 同时使用B发送给A的公钥对明文加密,形成密文;</li>
<li>将密文和数字签名发送给B;</li>
<li>B收到 A发过来的签名和密文, 获得A的公钥对数字签名进行解签, 进行Hash算法得到信息摘要;</li>
<li>再用自己的私钥对进行解密,得到明文,对明文进行Hash算法得到信息摘要;</li>
<li>将两个摘要进行对比,两者一致则说明文本没有被篡改过。</li>
</ol>
</description>
<pubDate>Sat, 03 Nov 2018 00:00:00 +0800</pubDate>
<link>https://Chankin026.github.io/2018/11/03/RSA/</link>
<guid isPermaLink="true">https://Chankin026.github.io/2018/11/03/RSA/</guid>
<category>RSA</category>
<category>Algorithm</category>
</item>
<item>
<title>CAP 定理的含义[转载]</title>
<description><ul id="markdown-toc">
<li><a href="#cap-定理的含义" id="markdown-toc-cap-定理的含义">CAP 定理的含义</a> <ul>
<li><a href="#一分布式系统的三个指标" id="markdown-toc-一分布式系统的三个指标">一、分布式系统的三个指标</a></li>
<li><a href="#二partition-tolerance" id="markdown-toc-二partition-tolerance">二、Partition tolerance</a></li>
<li><a href="#三consistency" id="markdown-toc-三consistency">三、Consistency</a></li>
<li><a href="#四availability" id="markdown-toc-四availability">四、Availability</a></li>
<li><a href="#五consistency-和-availability-的矛盾" id="markdown-toc-五consistency-和-availability-的矛盾">五、Consistency 和 Availability 的矛盾</a></li>
</ul>
</li>
</ul>
在学习redis 的时候不是很了解cap这个概念,从网上找到了阮一峰老师的文章,就转载过来了。 当然 阮老师 还有很多其他扫盲的文章,建议都看看
<h1 id="cap-定理的含义">CAP 定理的含义</h1>
原文地址:http://www.ruanyifeng.com/blog/2018/07/cap.html
作者: <a href="http://www.ruanyifeng.com/">阮一峰</a>
日期: <a href="http://www.ruanyifeng.com/blog/2018/07/">2018年7月16日</a>
分布式系统(distributed system)正变得越来越重要,大型网站几乎都是分布式的。
分布式系统的最大难点,就是各个节点的状态如何同步。CAP 定理是这方面的基本定理,也是理解分布式系统的起点。
本文介绍该定理。它其实很好懂,而且是显而易见的。下面的内容主要参考了 Michael Whittaker 的<a href="https://mwhittaker.github.io/blog/an_illustrated_proof_of_the_cap_theorem/">文章</a>。
<h2 id="一分布式系统的三个指标">一、分布式系统的三个指标</h2>
<img src="https://www.wangbase.com/blogimg/asset/201807/bg2018071607.jpg" alt="img" />
1998年,加州大学的计算机科学家 Eric Brewer 提出,分布式系统有三个指标。
<blockquote>
<ul>
<li>Consistency</li>
<li>Availability</li>
<li>Partition tolerance</li>
</ul>
</blockquote>
它们的第一个字母分别是 C、A、P。
Eric Brewer 说,这三个指标不可能同时做到。这个结论就叫做 CAP 定理。
<h2 id="二partition-tolerance">二、Partition tolerance</h2>
先看 Partition tolerance,中文叫做”分区容错”。
大多数分布式系统都分布在多个子网络。每个子网络就叫做一个区(partition)。分区容错的意思是,区间通信可能失败。比如,一台服务器放在中国,另一台服务器放在美国,这就是两个区,它们之间可能无法通信。
<img src="https://www.wangbase.com/blogimg/asset/201807/bg2018071601.png" alt="img" />
上图中,G1 和 G2 是两台跨区的服务器。G1 向 G2 发送一条消息,G2 可能无法收到。系统设计的时候,必须考虑到这种情况。
一般来说,分区容错无法避免,因此可以认为 CAP 的 P 总是成立。CAP 定理告诉我们,剩下的 C 和 A 无法同时做到。
<h2 id="三consistency">三、Consistency</h2>
Consistency 中文叫做”一致性”。意思是,写操作之后的读操作,必须返回该值。举例来说,某条记录是 v0,用户向 G1 发起一个写操作,将其改为 v1。
<img src="https://www.wangbase.com/blogimg/asset/201807/bg2018071602.png" alt="img" />
接下来,用户的读操作就会得到 v1。这就叫一致性。
<img src="https://www.wangbase.com/blogimg/asset/201807/bg2018071603.png" alt="img" />
问题是,用户有可能向 G2 发起读操作,由于 G2 的值没有发生变化,因此返回的是 v0。G1 和 G2 读操作的结果不一致,这就不满足一致性了。
<img src="https://www.wangbase.com/blogimg/asset/201807/bg2018071604.png" alt="img" />
为了让 G2 也能变为 v1,就要在 G1 写操作的时候,让 G1 向 G2 发送一条消息,要求 G2 也改成 v1。
<img src="https://www.wangbase.com/blogimg/asset/201807/bg2018071605.png" alt="img" />
这样的话,用户向 G2 发起读操作,也能得到 v1。
<img src="https://www.wangbase.com/blogimg/asset/201807/bg2018071606.png" alt="img" />
<h2 id="四availability">四、Availability</h2>
Availability 中文叫做”可用性”,意思是只要收到用户的请求,服务器就必须给出回应。
用户可以选择向 G1 或 G2 发起读操作。不管是哪台服务器,只要收到请求,就必须告诉用户,到底是 v0 还是 v1,否则就不满足可用性。
<h2 id="五consistency-和-availability-的矛盾">五、Consistency 和 Availability 的矛盾</h2>
一致性和可用性,为什么不可能同时成立?答案很简单,因为可能通信失败(即出现分区容错)。
如果保证 G2 的一致性,那么 G1 必须在写操作时,锁定 G2 的读操作和写操作。只有数据同步后,才能重新开放读写。锁定期间,G2 不能读写,没有可用性不。
如果保证 G2 的可用性,那么势必不能锁定 G2,所以一致性不成立。
<strong>综上所述,G2 无法同时做到一致性和可用性。系统设计时只能选择一个目标。如果追求一致性,那么无法保证所有节点的可用性;如果追求所有节点的可用性,那就没法做到一致性。</strong>
[更新 2018.7.17]
读者问,在什么场合,可用性高于一致性?
举例来说,发布一张网页到 CDN,多个服务器有这张网页的副本。后来发现一个错误,需要更新网页,这时只能每个服务器都更新一遍。
一般来说,网页的更新不是特别强调一致性。短时期内,一些用户拿到老版本,另一些用户拿到新版本,问题不会特别大。当然,所有人最终都会看到新版本。所以,这个场合就是可用性高于一致性。
(完)
</description>
<pubDate>Sat, 20 Oct 2018 00:00:00 +0800</pubDate>
<link>https://Chankin026.github.io/2018/10/20/CAP/</link>
<guid isPermaLink="true">https://Chankin026.github.io/2018/10/20/CAP/</guid>
<category>CAP</category>
<category>分布式</category>
<category>Distributed</category>
</item>
<item>
<title>继承HibernateDaoSupport实现CRUD</title>
<description><ul id="markdown-toc">
<li><a href="#一获取hibernatetemplate" id="markdown-toc-一获取hibernatetemplate">一、获取HibernateTemplate()</a></li>
<li><a href="#二hibernate的三种查询方式" id="markdown-toc-二hibernate的三种查询方式">二、Hibernate的三种查询方式</a> <ul>
<li><a href="#11-hqlhibernate-query-language" id="markdown-toc-11-hqlhibernate-query-language">1.1、 HQL(Hibernate Query Language)</a></li>
<li><a href="#12-sqlstructured-query-language" id="markdown-toc-12-sqlstructured-query-language">1.2、 SQL(Structured Query Language)</a></li>
<li><a href="#13-qbcquery-by-criteria" id="markdown-toc-13-qbcquery-by-criteria">1.3、 QBC(Query By Criteria)</a> <ul>
<li><a href="#131qbc查询的基本步骤" id="markdown-toc-131qbc查询的基本步骤">1.3.1、QBC查询的基本步骤</a></li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="一获取hibernatetemplate">一、获取HibernateTemplate()</h2>
Spring有三种方式访问db的方式: <strong>HibernateDaoSupport,HibernateTemplate,jdbcTemplate</strong>
Spring与Hibernate整合的过程中,Spring的工具类:HibernateDaoSupport, 让Dao层实现类继承HibernateDaoSupport去获取HibernateTemplate模板
其中主要提供了两个方法
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="kd">public</span> <span class="kd">final</span> <span class="kt">void</span> <span class="nf">setSessionFactory</span><span class="o">(</span><span class="n">SessionFactory</span> <span class="n">sessionFactory</span><span class="o">)</span>
<span class="kd">public</span> <span class="kd">final</span> <span class="n">HibernateTemplate</span> <span class="nf">getHibernateTemplate</span><span class="o">()</span>
</code></pre></div></div>
其中setSessionFactory方法用来接收Spring的ApplicationContext的依赖注入,可接收配置在Spring的SessionFactory实例,<strong>getHibernateTemplate方法则用来更具获得SessionFactory产生Session</strong>,最后生成<code class="highlighter-rouge">HibernateTeplate</code>来完成数据库访问。
Spring配置文件:
<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="c">&lt;!-- 引入外部属性sql相关信息=============================== --&gt;</span>
<span class="nt">&lt;context:property-placeholder</span> <span class="na">location=</span><span class="s">"classpath:jdbc.properties"</span><span class="nt">/&gt;</span>
<span class="c">&lt;!--配置c3p0连接池--&gt;</span>
<span class="nt">&lt;bean</span> <span class="na">id=</span><span class="s">"dataSource"</span> <span class="na">class=</span><span class="s">"com.mchange.v2.c3p0.ComboPooledDataSource"</span><span class="nt">&gt;</span>
<span class="nt">&lt;property</span> <span class="na">name=</span><span class="s">"driverClass"</span> <span class="na">value=</span><span class="s">"${jdbc.driverClass}"</span><span class="nt">/&gt;</span>
<span class="nt">&lt;property</span> <span class="na">name=</span><span class="s">"jdbcUrl"</span> <span class="na">value=</span><span class="s">"${jdbc.url}"</span><span class="nt">/&gt;</span>
<span class="nt">&lt;property</span> <span class="na">name=</span><span class="s">"user"</span> <span class="na">value=</span><span class="s">"${jdbc.username}"</span><span class="nt">/&gt;</span>
<span class="nt">&lt;property</span> <span class="na">name=</span><span class="s">"password"</span> <span class="na">value=</span><span class="s">"${jdbc.password}"</span><span class="nt">/&gt;</span>
<span class="nt">&lt;/bean&gt;</span>
<span class="c">&lt;!-- 引入hibernate的配置信息 --&gt;</span>
<span class="nt">&lt;bean</span> <span class="na">id=</span><span class="s">"sessionFactory"</span> <span class="na">class=</span><span class="s">"org.springframework.orm.hibernate5.LocalSessionFactoryBean"</span><span class="nt">&gt;</span>
<span class="c">&lt;!-- 注入连接池 --&gt;</span>
<span class="nt">&lt;property</span> <span class="na">name=</span><span class="s">"dataSource"</span> <span class="na">ref=</span><span class="s">"dataSource"</span><span class="nt">/&gt;</span>
<span class="c">&lt;!-- 配置Hibernate的相关属性 --&gt;</span>
<span class="nt">&lt;property</span> <span class="na">name=</span><span class="s">"hibernateProperties"</span><span class="nt">&gt;</span>
<span class="nt">&lt;props&gt;</span>
<span class="nt">&lt;prop</span> <span class="na">key=</span><span class="s">"hibernate.dialect"</span><span class="nt">&gt;</span>org.hibernate.dialect.MySQLDialect<span class="nt">&lt;/prop&gt;</span>
<span class="nt">&lt;prop</span> <span class="na">key=</span><span class="s">"hinernate.show_sql"</span><span class="nt">&gt;</span>true<span class="nt">&lt;/prop&gt;</span>
<span class="nt">&lt;prop</span> <span class="na">key=</span><span class="s">"hinernate.format_sql"</span><span class="nt">&gt;</span>true<span class="nt">&lt;/prop&gt;</span>
<span class="nt">&lt;prop</span> <span class="na">key=</span><span class="s">"hinernate.hbm2ddl.auto"</span><span class="nt">&gt;</span>update<span class="nt">&lt;/prop&gt;</span>
<span class="nt">&lt;/props&gt;</span>
<span class="nt">&lt;/property&gt;</span>
<span class="c">&lt;!-- 设置映射文件 --&gt;</span>
<span class="nt">&lt;property</span> <span class="na">name=</span><span class="s">"mappingResources"</span><span class="nt">&gt;</span>
<span class="nt">&lt;list&gt;&lt;value&gt;</span>com/spring/domain/Customer.hbm.xml<span class="nt">&lt;/value&gt;&lt;/list&gt;</span>
<span class="nt">&lt;/property&gt;</span>
<span class="nt">&lt;/bean&gt;</span>
<span class="c">&lt;!-- 配置DAO --&gt;</span>
<span class="nt">&lt;bean</span> <span class="na">id=</span><span class="s">"customerDao"</span> <span class="na">class=</span><span class="s">"com.spring.dao.impl.CustomerDaoImpl"</span><span class="nt">&gt;</span>
<span class="c">&lt;!--注入SessionFactory创建Hibernate模板--&gt;</span>
<span class="nt">&lt;property</span> <span class="na">name=</span><span class="s">"sessionFactory"</span> <span class="na">ref=</span><span class="s">"sessionFactory"</span><span class="nt">/&gt;</span>
<span class="nt">&lt;/bean&gt;</span>
</code></pre></div></div>
Customer类:
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">Customer</span> <span class="o">{</span>
<span class="kd">private</span> <span class="n">Long</span> <span class="n">cust_id</span><span class="o">;</span>
<span class="kd">private</span> <span class="n">String</span> <span class="n">cust_name</span><span class="o">;</span>
<span class="kd">private</span> <span class="n">String</span> <span class="n">cust_source</span><span class="o">;</span>
<span class="kd">private</span> <span class="n">String</span> <span class="n">cust_industry</span><span class="o">;</span>
<span class="kd">private</span> <span class="n">String</span> <span class="n">cust_level</span><span class="o">;</span>
<span class="kd">private</span> <span class="n">String</span> <span class="n">cust_phone</span><span class="o">;</span>
<span class="kd">private</span> <span class="n">String</span> <span class="n">cust_mobile</span><span class="o">;</span>
<span class="o">..........</span>
<span class="c1">//getter() and setter() </span>
<span class="o">}</span>
</code></pre></div></div>
<h2 id="二hibernate的三种查询方式">二、Hibernate的三种查询方式</h2>
Hibernate总的来说共有三种查询方式:HQL、QBC和SQL三种
<h3 id="11-hqlhibernate-query-language">1.1、 HQL(Hibernate Query Language)</h3>
<ul>
<li>HQL(Hibernate Query Language) 是面向对象的查询语言, 它和 SQL 查询语言有些相似</li>
<li>在 Hibernate 提供的各种检索方式中, HQL 是使用最广的一种检索方式
与所熟悉的SQL的语法差不太多,不同的就是把表名换成了类或者对象,列换成对象属性
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="c1">//Dao层实现类中获取session</span>
<span class="n">Session</span> <span class="n">session</span> <span class="o">=</span> <span class="k">this</span><span class="o">.</span><span class="na">currentSession</span><span class="o">();</span>
<span class="c1">//简单属性查询</span>
<span class="n">SQLQuery</span> <span class="n">query</span> <span class="o">=</span> <span class="n">session</span><span class="o">.</span><span class="na">createSQLQuery</span><span class="o">(</span><span class="s">"from Customer"</span><span class="o">).</span><span class="na">addEntity</span><span class="o">(</span><span class="n">Customer</span><span class="o">.</span><span class="na">class</span><span class="o">);</span><span class="c1">//addEntity()自动封装成对象的类型</span>
<span class="n">List</span><span class="o">&lt;</span><span class="n">Customer</span><span class="o">&gt;</span> <span class="n">rs</span> <span class="o">=</span> <span class="n">query</span><span class="o">.</span><span class="na">list</span><span class="o">();</span>
<span class="c1">//条件查询</span>
<span class="n">Query</span> <span class="n">query</span> <span class="o">=</span> <span class="n">session</span><span class="o">.</span><span class="na">createQuery</span><span class="o">(</span><span class="s">"from Customer s where s.cust_name = ?"</span><span class="o">);</span>
<span class="n">query</span><span class="o">.</span><span class="na">setParameter</span><span class="o">(</span><span class="mi">0</span><span class="o">,</span> <span class="s">"%1%"</span><span class="o">);</span>
<span class="n">List</span><span class="o">&lt;</span><span class="n">Customer</span><span class="o">&gt;</span> <span class="n">Customer</span> <span class="o">=</span> <span class="n">query</span><span class="o">.</span><span class="na">list</span><span class="o">();</span>
</code></pre></div> </div>
具体参考:<a href="https://blog.csdn.net/opnmzxcvb/article/details/3966030">https://blog.csdn.net/opnmzxcvb/article/details/3966030</a>
</li>
</ul>
<h3 id="12-sqlstructured-query-language">1.2、 SQL(Structured Query Language)</h3>
<ul>
<li>面向数据库表查询</li>
<li>sql就是在dao层直接写sql语句</li>
</ul>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="err"> </span> <span class="n">Session</span> <span class="n">session</span> <span class="o">=</span> <span class="k">this</span><span class="o">.</span><span class="na">currentSession</span><span class="o">();</span>
<span class="n">SQLQuery</span> <span class="n">query</span> <span class="o">=</span> <span class="n">session</span><span class="o">.</span><span class="na">createSQLQuery</span><span class="o">(</span><span class="s">"select * from Customer"</span><span class="o">).</span><span class="na">addEntity</span><span class="o">(</span><span class="n">Customer</span><span class="o">.</span><span class="na">class</span><span class="o">);</span>
<span class="n">List</span><span class="o">&lt;</span><span class="n">Customer</span><span class="o">&gt;</span> <span class="n">rs</span> <span class="o">=</span> <span class="n">query</span><span class="o">.</span><span class="na">list</span><span class="o">();</span>
</code></pre></div></div>
缺点:违背了hibernate的跨平台优点,不易维护,不面向对象。不推荐使用。
<h3 id="13-qbcquery-by-criteria">1.3、 QBC(Query By Criteria)</h3>
<h4 id="131qbc查询的基本步骤">1.3.1、QBC查询的基本步骤</h4>
这种方式比较面向对象方式,重点是有三个描述条件的对象:Restrictions,Order,Projections。
使用QBC查询,一般需要以下三个步骤:
<ul>
<li>
<font size="3" color="red">使用Session对象的createCriteria()方法创建Criteria对象,要注意的一点事是Criteria和DetachedCriteria主要区别是创建形式不同:</font>
1、<strong>Criteria是在线的</strong>,是由Hibernate Session进行创建;<br />
2、<strong>DetachedCriteria是离线的</strong>,创建无需session,而是由DetachedCriteria提供了2个静态方法: <code class="highlighter-rouge">forClass(Class)</code>或者<code class="highlighter-rouge">forEntityName(Name)</code>进行DetachedCriteria实例的创建。
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">Criteria</span> <span class="n">c</span> <span class="o">=</span> <span class="k">this</span><span class="o">.</span><span class="na">currentSession</span><span class="o">().</span><span class="na">createCriteria</span><span class="o">(</span><span class="n">Customer</span><span class="o">.</span><span class="na">class</span><span class="o">);</span>
<span class="c1">//它是和在线对应的。Criteria对象是一个在线对象,它是由一个可用的(活动的)Session对象获取的出来的。当Session失效后就无法获取该对象,有一个对象,它也可以用于设置条件,但是获取的时候并不需要Session对象。</span>
<span class="n">DetachedCriteria</span> <span class="n">criteria</span> <span class="o">=</span> <span class="n">DetachedCriteria</span><span class="o">.</span><span class="na">forClass</span><span class="o">(</span><span class="n">Customer</span><span class="o">.</span><span class="na">class</span><span class="o">);</span>
</code></pre></div> </div>
</li>
<li>
<font size="3" color="red">使用工具类Restrictions的方法为Criteria对象设置查询条件,Order工具类的方法设置排序方式,Projections工具类的方法进行统计和分组;</font>
</li>
<li>
<font size="3" color="red">使用Criteria对象的list()方法进行查询并返回结果。</font>
</li>
</ul>
</description>
<pubDate>Sun, 07 Oct 2018 00:00:00 +0800</pubDate>
<link>https://Chankin026.github.io/2018/10/07/Hibernate-DetacheCriteria/</link>
<guid isPermaLink="true">https://Chankin026.github.io/2018/10/07/Hibernate-DetacheCriteria/</guid>
<category>CRUD</category>
<category>Hibernate</category>
</item>
<item>
<title>Java NIO:浅析I/O模型(转载)</title>
<description>
<strong>原博地址:<a href="https://www.cnblogs.com/dolphin0520/p/3916526.html">https://www.cnblogs.com/dolphin0520/p/3916526.html</a></strong>
也许很多朋友在学习NIO的时候都会感觉有点吃力,对里面的很多概念都感觉不是那么明朗。在进入Java NIO编程之前,我们今天先来讨论一些比较基础的知识:I/O模型。下面本文先从同步和异步的概念 说起,然后接着阐述了阻塞和非阻塞的区别,接着介绍了阻塞IO和非阻塞IO的区别,然后介绍了同步IO和异步IO的区别,接下来介绍了5种IO模型,最后介绍了两种和高性能IO设计相关的设计模式(Reactor和Proactor)。
以下是本文的目录大纲:
一.什么是同步?什么是异步?
二.什么是阻塞?什么是非阻塞?
三.什么是阻塞IO?什么是非阻塞IO?
四.什么是同步IO?什么是异步IO?
五.五种IO模型
六.两种高性能IO设计模式
若有不正之处,请多多谅解并欢迎批评指正。
</description>
<pubDate>Sat, 06 Oct 2018 00:00:00 +0800</pubDate>
<link>https://Chankin026.github.io/2018/10/06/Java-NIO/</link>
<guid isPermaLink="true">https://Chankin026.github.io/2018/10/06/Java-NIO/</guid>
<category>并发</category>
<category>io</category>
<category>IO</category>
</item>
<item>
<title>mybatis中mapper的namespace的作用</title>
<description>在mybatis中,映射文件中的namespace是用于绑定Dao接口的,即面向接口编程。当你的namespace绑定接口后,你<strong>可以不用写接口实现类</strong>,mybatis会通过该绑定自动帮你找到对应要执行的SQL语句,如下:
假设定义了IArticleDAO接口
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">public</span> <span class="kd">interface</span> <span class="nc">IArticleDAO</span><span class="o">{</span>
<span class="n">List</span><span class="o">&lt;</span><span class="n">Article</span><span class="o">&gt;</span> <span class="nf">selectAllArticle</span><span class="o">();</span>
<span class="o">}</span>
</code></pre></div></div>
对于映射文件如下:
<div class="language-xml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;mapper</span> <span class="na">namespace=</span><span class="s">"com.xxx.dao.IArticleDAO"</span><span class="nt">&gt;</span> <span class="err">&lt;</span>
<span class="nt">&lt;select</span> <span class="na">id=</span><span class="s">"selectAllArticle"</span> <span class="na">resultType=</span><span class="s">"article"</span><span class="nt">&gt;</span>
SELECT t.* FROM T_article t WHERE t.flag = '1' ORDER BY t.createtime DESC
<span class="nt">&lt;/select&gt;</span>
<span class="nt">&lt;/mapper&gt;</span>
</code></pre></div></div>
接口中的方法与映射文件中的SQL语句的ID一一对应 。
则在代码中可以直接使用IArticeDAO面向接口编程而不需要再编写实现类,
<hr />
<ul>
<li>重点:namaespace绑定接口,需要获取接口的映射对象(sqlSession.getMapper(xxx.class)),通过映射对象调用方法<code class="highlighter-rouge">selectAllArticle()</code>,方法名对应xml中的id</li>
<li><strong>命名空间绑定绑定pojo类</strong><code class="highlighter-rouge">&lt;mapper namespace="article"&gt; </code> ,并且没有articleDao接口和实现类,需要pojo类和xml在同一包下,才能实现query。例如<code class="highlighter-rouge">sqlSession.selectById("article.xxx",id)</code></li>
</ul>
</description>
<pubDate>Wed, 03 Oct 2018 00:00:00 +0800</pubDate>
<link>https://Chankin026.github.io/2018/10/03/Mybatis1/</link>
<guid isPermaLink="true">https://Chankin026.github.io/2018/10/03/Mybatis1/</guid>
<category>Mybatis</category>
<category>Mybatis</category>
</item>
<item>
<title>B树、B+树、B*树结构的理解</title>
<description><ul id="markdown-toc">
<li><a href="#前言" id="markdown-toc-前言">前言:</a></li>
</ul>
原文地址(搬运修改):<br />
<a href="https://blog.csdn.net/v_JULY_v/article/details/6530142">从 B 树、B+ 树、B* 树谈到 R 树</a><br />
<a href="https://www.cnblogs.com/vincently/p/4526560.html">【经典数据结构】B树与B+树</a><br />
<a href="https://www.cnblogs.com/George1994/p/7008732.html">B树和B+树的总结</a><br />
<a href="https://blog.csdn.net/zhangbo_0323/article/details/50156357">对于B树,B+树的理解</a><br />
<a href="https://www.cnblogs.com/xqzt/archive/2012/12/28/5637129.html">B+树、B*树</a><br />
<h2 id="前言">前言:</h2>
</description>
<pubDate>Tue, 02 Oct 2018 00:00:00 +0800</pubDate>
<link>https://Chankin026.github.io/2018/10/02/B-Tree/</link>
<guid isPermaLink="true">https://Chankin026.github.io/2018/10/02/B-Tree/</guid>
<category>Tree</category>
<category>DataStructure</category>
</item>
<item>
<title>整理一些学习过的数据结构和算法blog</title>
<description><ul id="markdown-toc">
<li><a href="#树形结构" id="markdown-toc-树形结构">树形结构:</a></li>
<li><a href="#算法系列" id="markdown-toc-算法系列">算法系列:</a> <ul>
<li><a href="#8大排序" id="markdown-toc-8大排序">8大排序:</a></li>
<li><a href="#其他基础算法" id="markdown-toc-其他基础算法">其他基础算法:</a></li>
</ul>
</li>
<li><a href="#并发编程" id="markdown-toc-并发编程">并发编程:</a> <ul>
<li><a href="#海子大神系列" id="markdown-toc-海子大神系列">海子大神系列:</a></li>
<li><a href="#skywang大神系列" id="markdown-toc-skywang大神系列">skywang大神系列:</a> <ul>
<li><a href="#一-基础篇" id="markdown-toc-一-基础篇">(一) 基础篇</a></li>
<li><a href="#二-juc原子类" id="markdown-toc-二-juc原子类">(二) JUC原子类</a></li>
<li><a href="#三-juc锁" id="markdown-toc-三-juc锁">(三) JUC锁</a></li>
<li><a href="#四-juc集合" id="markdown-toc-四-juc集合">(四) JUC集合</a></li>
<li><a href="#五-juc线程池" id="markdown-toc-五-juc线程池">(五) JUC线程池</a> <ul>
<li><a href="#附加内容" id="markdown-toc-附加内容">附加内容</a></li>
</ul>
</li>
<li><a href="#面试集合" id="markdown-toc-面试集合">面试集合:</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#ioip-http-tcp" id="markdown-toc-ioip-http-tcp">IO/IP HTTP TCP:</a></li>
<li><a href="#书籍" id="markdown-toc-书籍">书籍:</a></li>
</ul>
<h2 id="树形结构">树形结构:</h2>
<a href="http://www.cnblogs.com/skywang12345/p/3576452.html">二叉查找树</a>
<a href="https://www.cnblogs.com/skywang12345/p/3576452.html">二叉查找树之 Java的实现</a>
<a href="https://www.cnblogs.com/Michaelwjw/p/6384428.html">二叉搜索树Java实现(查找、插入、删除、遍历) - Michaelwjw - 博客园</a>
<br />
<a href="https://blog.csdn.net/javazejian/article/details/53892797">AVL树的设计与实现 - CSDN博客</a>
<a href="https://www.jianshu.com/p/65c90aa1236d">彻底搞懂AVL树 - 简书</a>
<a href="https://www.cnblogs.com/skywang12345/p/3577479.html#a1">AVL树(三)之 Java的实现 - 如果天空不死 - 博客园</a>
<br />
<a href="https://www.cnblogs.com/skywang12345/p/3245399.html">红黑树(一)之 原理和算法详细介绍</a>
<a href="https://www.cnblogs.com/skywang12345/p/3624343.html">红黑树(五)之 Java的实现</a>
<a href="https://blog.csdn.net/yang_yulei/article/details/26066409">查找(一)史上最简单清晰的红黑树讲解 - CSDN博客</a>
<a href="https://blog.csdn.net/Sun_TTTT/article/details/65445754">!最容易懂得红黑树 - CSDN博客</a>
<a href="https://blog.csdn.net/yang_yulei/article/details/26066409">查找(一)史上最简单清晰的红黑树讲解 - CSDN博客</a>
<br />
<a href="http://www.cnblogs.com/gaochundong/p/balanced_search_tree.htm">查找树(2-3-4 树) - 匠心十年- 博客园</a>
<a href="https://www.cnblogs.com/skywang12345/p/3711483.html">图的遍历之 深度优先搜索和广度优先搜索</a>
<a href="https://www.cnblogs.com/skywang12345/p/3706833.html">哈夫曼树(三)之 Java详解</a>
<a href="https://blog.csdn.net/v_JULY_v/article/details/6530142">从B树、B+树、B*树谈到R 树</a>
<a href="http://blog.csdn.net/hackbuteer1/article/details/7964147">Trie树详解及其应用</a>
<br />
<a href="https://www.zhihu.com/question/20176446">数据结构与算法中,树一般会应用在哪些方面?为什么? - 知乎</a>
<br />
<h2 id="算法系列">算法系列:</h2>
<h4 id="8大排序">8大排序:</h4>
<a href="http://www.cnblogs.com/skywang12345/p/3596232.html">冒泡排序</a> <a href="http://www.cnblogs.com/skywang12345/p/3596746.html">快速排序</a> <a href="http://www.cnblogs.com/skywang12345/p/3596881.html">直接插入排序</a> <a href="http://www.cnblogs.com/skywang12345/p/3597597.html">希尔排序</a> <a href="http://www.cnblogs.com/skywang12345/p/3597641.html">选择排序</a> <a href="http://www.cnblogs.com/skywang12345/p/3602162.html">堆排序</a> <a href="http://www.cnblogs.com/skywang12345/p/3602737.html">桶排序</a> <a href="http://www.cnblogs.com/skywang12345/p/3603669.html">基数排序</a>
<h4 id="其他基础算法">其他基础算法:</h4>
<a href="https://blog.csdn.net/bruce_suxin/article/details/52937720">递归之斐波那契数列java的三种写法- CSDN博客</a>
<a href="https://www.cnblogs.com/newflydd/p/5091646.html">8皇后以及N皇后算法探究,回溯算法的JAVA实现,递归方案</a>
<a href="https://blog.csdn.net/m53931422/article/details/41788535">分治归并排序算法——Java实现- CSDN博客</a>
<a href="https://www.cnblogs.com/xiaozhang2014/p/7783795.html">java-贪心算法</a>
<a href="https://www.cnblogs.com/yanlingyin/archive/2011/11/16/greedy.html">【贪心法求解最小生成树之Kruskal算法详细分析】—Greedy Algorithm for MST</a>
<a href="https://www.cnblogs.com/skywang12345/p/3711510.html">Prim算法(三)之 Java详解</a>
<a href="https://www.cnblogs.com/skywang12345/p/3711516.html">Dijkstra算法(三)之Java详解- 如果天空不死- 博客园</a>
<br />
<h2 id="并发编程">并发编程:</h2>
<h3 id="海子大神系列"><a href="https://www.cnblogs.com/dolphin0520">海子大神系列</a>:</h3>
<ol>
<li>
<a href="https://www.cnblogs.com/dolphin0520/p/3910667.html">Java并发编程:进程和线程之由来</a>
</li>
<li>
<a href="https://www.cnblogs.com/dolphin0520/p/3913517.html">Java并发编程:如何创建线程?</a>
</li>
<li>
<a href="https://www.cnblogs.com/dolphin0520/p/3920357.html">Java并发编程:Thread类的使用</a>
</li>
<li>
<a href="https://www.cnblogs.com/dolphin0520/p/3920385.html">Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition</a>
</li>
<li>
<a href="https://www.cnblogs.com/dolphin0520/p/3923737.html">Java并发编程:synchronized</a>
</li>
<li>
<a href="https://www.cnblogs.com/dolphin0520/p/3923167.html">Java并发编程:Lock</a>
</li>
<li>
<a href="https://www.cnblogs.com/dolphin0520/p/3920373.html">Java并发编程:volatile关键字解析</a>
</li>
<li>
<a href="https://www.cnblogs.com/dolphin0520/p/3920407.html">Java并发编程:深入剖析ThreadLocal</a>
</li>
<li>
<a href="https://www.cnblogs.com/dolphin0520/p/3933404.html">Java并发编程:同步容器</a>
</li>
<li>
<a href="https://www.cnblogs.com/dolphin0520/p/3933551.html">Java ConcurrentModificationException异常原因和解决方法</a>
</li>
<li>
<a href="https://www.cnblogs.com/dolphin0520/p/3932905.html">Java并发编程:并发容器之ConcurrentHashMap(转载)</a>
</li>
<li>
<a href="https://www.cnblogs.com/dolphin0520/p/3938914.html">Java并发编程:并发容器之CopyOnWriteArrayList(转载)</a>
</li>
<li>
<a href="https://www.cnblogs.com/dolphin0520/p/3932906.html">Java并发编程:阻塞队列</a>
</li>
<li>
<a href="https://www.cnblogs.com/dolphin0520/p/3932921.html">Java并发编程:线程池的使用</a>
</li>
<li>
<a href="https://www.cnblogs.com/dolphin0520/p/3920397.html">Java并发编程:CountDownLatch、CyclicBarrier和Semaphore</a>
</li>
<li>
<a href="https://www.cnblogs.com/dolphin0520/p/3949310.html">Java并发编程:Callable、Future和FutureTask</a>
</li>
<li>
<a href="https://www.cnblogs.com/dolphin0520/p/3938991.html">Java并发编程:Timer和TimerTask(转载)</a>
<br />
</li>
</ol>
<h3 id="skywang大神系列"><a href="https://www.cnblogs.com/skywang12345">skywang大神系列</a>:</h3>
<h4 id="一-基础篇">(一) 基础篇</h4>
<ol>
<li>
<a href="http://www.cnblogs.com/skywang12345/p/3479024.html">Java多线程系列–“基础篇”01之 基本概念</a>
</li>
<li>
<a href="http://www.cnblogs.com/skywang12345/p/3479063.html">Java多线程系列–“基础篇”02之 常用的实现多线程的两种方式</a>
</li>
<li>
<a href="http://www.cnblogs.com/skywang12345/p/3479083.html">Java多线程系列–“基础篇”03之 Thread中start()和run()的区别</a>
</li>
<li>
<a href="http://www.cnblogs.com/skywang12345/p/3479202.html">Java多线程系列–“基础篇”04之 synchronized关键字</a>
</li>
<li>
<a href="http://www.cnblogs.com/skywang12345/p/3479224.html">Java多线程系列–“基础篇”05之 线程等待与唤醒</a>
</li>
<li>
<a href="http://www.cnblogs.com/skywang12345/p/3479243.html">Java多线程系列–“基础篇”06之 线程让步</a>
</li>
<li>
<a href="http://www.cnblogs.com/skywang12345/p/3479256.html">Java多线程系列–“基础篇”07之 线程休眠</a>
</li>
<li>
<a href="http://www.cnblogs.com/skywang12345/p/3479275.html">Java多线程系列–“基础篇”08之 join()</a>
</li>
<li>
<a href="http://www.cnblogs.com/skywang12345/p/3479949.html">Java多线程系列–“基础篇”09之 interrupt()和线程终止方式</a>
</li>
<li>
<a href="http://www.cnblogs.com/skywang12345/p/3479982.html">Java多线程系列–“基础篇”10之 线程优先级和守护线程</a>
</li>
<li>
<a href="http://www.cnblogs.com/skywang12345/p/3480016.html">Java多线程系列–“基础篇”11之 生产消费者问题</a>
</li>
</ol>
<h4 id="二-juc原子类">(二) JUC原子类</h4>
<ol>
<li>
<a href="http://www.cnblogs.com/skywang12345/p/3514589.html">Java多线程系列–“JUC原子类”01之 框架</a>
</li>
<li>
<a href="http://www.cnblogs.com/skywang12345/p/3514593.html">Java多线程系列–“JUC原子类”02之 AtomicLong原子类</a>
</li>
<li>
<a href="http://www.cnblogs.com/skywang12345/p/3514604.html">Java多线程系列–“JUC原子类”03之 AtomicLongArray原子类</a>
</li>
<li>
<a href="http://www.cnblogs.com/skywang12345/p/3514623.html">Java多线程系列–“JUC原子类”04之 AtomicReference原子类</a>
</li>
<li>
<a href="http://www.cnblogs.com/skywang12345/p/3514635.html">Java多线程系列–“JUC原子类”05之 AtomicLongFieldUpdater原子类</a>
</li>
</ol>
<h4 id="三-juc锁">(三) JUC锁</h4>
<ol>
<li>
<a href="http://www.cnblogs.com/skywang12345/p/3496098.html">Java多线程系列–“JUC锁”01之 框架</a>
</li>
<li>
<a href="http://www.cnblogs.com/skywang12345/p/3496101.html">Java多线程系列–“JUC锁”02之 互斥锁ReentrantLock</a>
</li>
<li>
<a href="http://www.cnblogs.com/skywang12345/p/3496147.html">Java多线程系列–“JUC锁”03之 公平锁(一)</a>
</li>