-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
874 lines (655 loc) · 43.2 KB
/
Copy pathindex.html
File metadata and controls
874 lines (655 loc) · 43.2 KB
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
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Hexo</title>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta property="og:type" content="website">
<meta property="og:title" content="Hexo">
<meta property="og:url" content="http://yoursite.com/index.html">
<meta property="og:site_name" content="Hexo">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Hexo">
<link rel="alternate" href="/atom.xml" title="Hexo" type="application/atom+xml">
<link rel="icon" href="/favicon.png">
<link href="//fonts.googleapis.com/css?family=Source+Code+Pro" rel="stylesheet" type="text/css">
<link rel="stylesheet" href="/css/style.css">
</head>
<body>
<div id="container">
<div id="wrap">
<header id="header">
<div id="banner"></div>
<div id="header-outer" class="outer">
<div id="header-title" class="inner">
<h1 id="logo-wrap">
<a href="/" id="logo">Hexo</a>
</h1>
</div>
<div id="header-inner" class="inner">
<nav id="main-nav">
<a id="main-nav-toggle" class="nav-icon"></a>
<a class="main-nav-link" href="/">Home</a>
<a class="main-nav-link" href="/archives">Archives</a>
</nav>
<nav id="sub-nav">
<a id="nav-rss-link" class="nav-icon" href="/atom.xml" title="RSS Feed"></a>
<a id="nav-search-btn" class="nav-icon" title="Search"></a>
</nav>
<div id="search-form-wrap">
<form action="//google.com/search" method="get" accept-charset="UTF-8" class="search-form"><input type="search" name="q" class="search-form-input" placeholder="Search"><button type="submit" class="search-form-submit"></button><input type="hidden" name="sitesearch" value="http://yoursite.com"></form>
</div>
</div>
</div>
</header>
<div class="outer">
<section id="main">
<article id="post-economic" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2019/03/18/economic/" class="article-date">
<time datetime="2019-03-18T15:18:26.780Z" itemprop="datePublished">2019-03-18</time>
</a>
</div>
<div class="article-inner">
<div class="article-entry" itemprop="articleBody">
<hr>
<h2 id="1-经济学原理-宏观经济"><a href="#1-经济学原理-宏观经济" class="headerlink" title=" 1 经济学原理(宏观经济)"></a> 1 经济学原理(宏观经济)</h2><h1 id="WHY"><a href="#WHY" class="headerlink" title="WHY"></a>WHY</h1><ul>
<li>有助于理解生活中的世界</li>
<li>更好的参与经济事务中</li>
<li>理解经济政策的潜力与局限性</li>
</ul>
<h1 id="WHAT"><a href="#WHAT" class="headerlink" title="WHAT"></a>WHAT</h1><p> <code>一门研究人类一般生活事务的学问 --- Alfred Marshell</code><br> <code>由于社会资源的稀缺性,经济学是研究社会如何管理稀缺资源</code></p>
<h1 id="十大原理"><a href="#十大原理" class="headerlink" title="十大原理"></a>十大原理</h1><ul>
<li>人们面临权衡取舍<ul>
<li>效率: 从稀缺资源中获取最大利益</li>
<li>平等: 社会资源平均分配到社会成员</li>
</ul>
</li>
<li>某种东西的成本是为了得到它所放弃的东西</li>
<li>理性人考虑边际量(边际成本,边际收益)eg:航空公司愿意低价出售要起飞的机票</li>
<li>人们会对激励作出反应</li>
<li>贸易可以是每个人的状况更好</li>
<li>市场通常是组织经济活动的一种好方法<ul>
<li>计划经济:政府配置社会资源</li>
<li>市场经济:成千上万企业和家庭决定社会资源,引论:价格就是看不见的手指引经济活动</li>
</ul>
</li>
<li>政府有时可以改善市场结果<ul>
<li>市场经济需要“产权”制度,政府可以维持和实施</li>
<li>市场经济存在“失灵”场景,政府可以促进公平和效率<ul>
<li>外部性,比如环境污染</li>
<li>市场势力,主要是垄断</li>
</ul>
</li>
</ul>
</li>
<li>一国的生活水平取决于它生产物品和服务的能力</li>
<li>当政府发行过多货币,就会引起通货膨胀</li>
<li>社会面临通货膨胀和失业之间的短期权衡取舍</li>
</ul>
</div>
<footer class="article-footer">
<a data-url="http://yoursite.com/2019/03/18/economic/" data-id="cjtzh0o75000aink25p8ocfrq" class="article-share-link">Share</a>
</footer>
</div>
</article>
<article id="post-dpark" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2018/10/20/dpark/" class="article-date">
<time datetime="2018-10-20T15:56:37.350Z" itemprop="datePublished">2018-10-20</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2018/10/20/dpark/">dpark代码分析</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<h2 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h2><p> 豆瓣出品,<a href="https://github.com/douban/dpark" target="_blank" rel="external">github地址</a></p>
<h2 id="简要介绍"><a href="#简要介绍" class="headerlink" title="简要介绍"></a>简要介绍</h2><h3 id="技术点"><a href="#技术点" class="headerlink" title="技术点"></a>技术点</h3><ul>
<li>闭包函数</li>
<li>注解 @singleton ,@proprety ,@classmethod,@cached @safe</li>
</ul>
<h3 id="schedule"><a href="#schedule" class="headerlink" title="schedule"></a>schedule</h3><ul>
<li>local</li>
<li>多进程</li>
<li>mesos </li>
</ul>
<h2 id="主要类图"><a href="#主要类图" class="headerlink" title="主要类图"></a>主要类图</h2><p><img src="https://raw.githubusercontent.com/testzlx/pictures/master/dpark.jpg" alt="tupian"></p>
</div>
<footer class="article-footer">
<a data-url="http://yoursite.com/2018/10/20/dpark/" data-id="cjtzh0o6o0004ink2yx3crch2" class="article-share-link">Share</a>
</footer>
</div>
</article>
<article id="post-markdown" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2018/03/17/markdown/" class="article-date">
<time datetime="2018-03-17T13:51:43.037Z" itemprop="datePublished">2018-03-17</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2018/03/17/markdown/">md语法说明</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<hr>
<h2 id="标题"><a href="#标题" class="headerlink" title="标题"></a>标题</h2><h1 id="这是一级标题"><a href="#这是一级标题" class="headerlink" title="这是一级标题"></a>这是一级标题</h1><h2 id="这是二级标题"><a href="#这是二级标题" class="headerlink" title="这是二级标题"></a>这是二级标题</h2><h3 id="这是三级标题"><a href="#这是三级标题" class="headerlink" title="这是三级标题"></a>这是三级标题</h3><h4 id="这是四级标题"><a href="#这是四级标题" class="headerlink" title="这是四级标题"></a>这是四级标题</h4><h5 id="这是五级标题"><a href="#这是五级标题" class="headerlink" title="这是五级标题"></a>这是五级标题</h5><h6 id="这是六级标题"><a href="#这是六级标题" class="headerlink" title="这是六级标题"></a>这是六级标题</h6><blockquote>
<p>块注释</p>
</blockquote>
<p><em>斜体</em></p>
<p><strong>粗体</strong></p>
<p><strong><em>粗斜体</em></strong></p>
<h2 id="gt-这是引用的内容"><a href="#gt-这是引用的内容" class="headerlink" title=">这是引用的内容"></a>>这是引用的内容</h2><ul>
<li>无序<ul>
<li>小无序1</li>
<li>小无序2</li>
<li>小无序3</li>
</ul>
</li>
<li></li>
<li>无序</li>
<li>无序</li>
</ul>
<ol>
<li>有序</li>
<li>有序</li>
<li>有序</li>
</ol>
<p>This is an <a href="http://example.com/" target="_blank" rel="external">example link</a>.</p>
<p>I get 10 times more traffic from <a href="http://google.com/" title="Google" target="_blank" rel="external">Google</a> than from <a href="http://search.yahoo.com/" title="Yahoo Search" target="_blank" rel="external">Yahoo</a> or <a href="http://search.msn.com/" title="MSN Search" target="_blank" rel="external">MSN</a>. </p>
<p><img src="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1552932799250&di=a4a25eb0fd38d752e4f6e049e50410c7&imgtype=0&src=http%3A%2F%2F00.minipic.eastday.com%2Fphoto%2F20180911%2F20180911_c9e6bb270e2f7de29e69ff0691b134f9_wmk.png" alt="456" title="美女"></p>
<p><code>hello world
123 //少量代码</code></p>
<pre><code> def __init__(self): //一个tab加4个空格 大量代码
self.id = self.newJobId()
self.start = time.time()
</code></pre><table>
<thead>
<tr>
<th>name</th>
<th style="text-align:center">age</th>
<th style="text-align:right">birth</th>
</tr>
</thead>
<tbody>
<tr>
<td> zhang</td>
<td style="text-align:center">12</td>
<td style="text-align:right">1991-09-09</td>
</tr>
<tr>
<td> lin</td>
<td style="text-align:center">13</td>
<td style="text-align:right">2002-03-04</td>
</tr>
<tr>
<td> xing</td>
<td style="text-align:center">334</td>
<td style="text-align:right">2222-09-09</td>
</tr>
</tbody>
</table>
<p>flow<br>st=>start: Start:><a href="https://www.zybuluo.com" target="_blank" rel="external">https://www.zybuluo.com</a><br>io=>inputoutput: verification<br>op=>operation: Your Operation<br>cond=>condition: Yes or No?<br>sub=>subroutine: Your Subroutine<br>e=>end<br>st->io->op->cond<br>cond(yes)->e<br>cond(no)->sub->io </p>
<h1 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h1><ul>
<li><a href="https://www.jianshu.com/p/191d1e21f7ed" target="_blank" rel="external">简书</a> </li>
</ul>
</div>
<footer class="article-footer">
<a data-url="http://yoursite.com/2018/03/17/markdown/" data-id="cjtzh0o6u0006ink2hhrl4cml" class="article-share-link">Share</a>
</footer>
</div>
</article>
<article id="post-personBlog" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2018/03/17/personBlog/" class="article-date">
<time datetime="2018-03-17T13:38:19.737Z" itemprop="datePublished">2018-03-17</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2018/03/17/personBlog/">搭建个人博客</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<p>##简介 </p>
<ul>
<li>使用github pages和hexo和markdown</li>
<li>github pages有300M免费空间</li>
</ul>
<p>##步骤</p>
<ol>
<li>在github上创建repository,名称为githubUsername.github.io</li>
<li>本地安装node及npm</li>
<li>本地安装命令如下</li>
</ol>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line">npm install hexo-cli -g</div><div class="line">hexo init blog</div><div class="line">cd blog</div><div class="line">npm install</div><div class="line">hexo server</div><div class="line">npm install hexo-deployer-git --save</div></pre></td></tr></table></figure>
<ol>
<li>检验方法:本地访问<a href="http://localhost:4000/" target="_blank" rel="external">http://localhost:4000/</a></li>
<li>修改以上命令创建的blog目录下_config.yml文件,内容如下</li>
</ol>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line">deploy:</div><div class="line"> type: git</div><div class="line"> repo: https://github.com/testzlx/testzlx.github.io.git</div><div class="line"> branch: master</div><div class="line">``` </div><div class="line"></div><div class="line">6. 在blog/source/_posts下添加md文件</div><div class="line">7. 执行如下命令即可完成部署</div></pre></td></tr></table></figure>
<p> hexo generate<br> hexo deploy</p>
<p>```</p>
<h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><ul>
<li><a href="https://hexo.io" target="_blank" rel="external">hexo官网</a></li>
<li><a href="http://crazymilk.github.io/2015/12/28/GitHub-Pages-Hexo搭建博客/" target="_blank" rel="external">hexo搭建</a></li>
<li><a href="http://blog.csdn.net/poem_of_sunshine/article/details/29369785" target="_blank" rel="external">hexo搭建2</a></li>
</ul>
</div>
<footer class="article-footer">
<a data-url="http://yoursite.com/2018/03/17/personBlog/" data-id="cjtzh0o6m0003ink2ak5tokx6" class="article-share-link">Share</a>
</footer>
</div>
</article>
<article id="post-zookeeper" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2017/06/28/zookeeper/" class="article-date">
<time datetime="2017-06-28T07:23:31.000Z" itemprop="datePublished">2017-06-28</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2017/06/28/zookeeper/">zookeeper源码分析</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<h2 id="单机模式"><a href="#单机模式" class="headerlink" title="单机模式"></a>单机模式</h2><ul>
<li>类图<img src="file:////Users/zhanglinxing/github/self-maintain/zookeeper/单机版.png" alt="tupian"></li>
<li>启动过程:<ul>
<li>启动一定时任务,清除dataDir,snapDir目录文件</li>
<li><font color="#DC143C" size="3">使用反射,注册log对象到jmx中”</font></li>
<li>启动JettyAdminServer对象,用途作为用户admin时的后台相应服务</li>
<li>启动cnxnFactory对象<ul>
<li>expireThread: 移除超时连接</li>
<li>selectorThread: 客户端网络io事件监听线程</li>
<li>numWorkerThread: workerPool,线程池模型,处理io请求</li>
<li>acceptThread:处理客户端连接请求 </li>
<li>zookeeperServer:分几种;操作内存zkDb和具体处理io请求,记录状态,会话管理等等<ul>
<li>启动containerManager:使用zookeeperServer中的requestProcess定时处理内存中dataNode </li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="网络模块"><a href="#网络模块" class="headerlink" title="网络模块"></a>网络模块</h3><ul>
<li>NIO </li>
</ul>
<h3 id="多线程"><a href="#多线程" class="headerlink" title="多线程"></a>多线程</h3><h4 id="java线程池(符合生产者-消费者模型)"><a href="#java线程池(符合生产者-消费者模型)" class="headerlink" title="java线程池(符合生产者-消费者模型)"></a>java线程池(符合生产者-消费者模型)</h4><ul>
<li><p>应用场景</p>
<ul>
<li>大量任务</li>
<li>每个任务执行周期不长 </li>
</ul>
</li>
<li><p>优点</p>
<ul>
<li>降低资源消耗,利用已有线程减少线程创建或销毁的消耗</li>
<li>提高响应速度,工作线程提前准备好了 </li>
</ul>
</li>
<li><p>参数说明:corePoolSize,maxmumPoolSize,blockinqueue,keepAliveTime,RejectedExecutionHandler</p>
</li>
<li><p>工作过程</p>
<ul>
<li><img src="https://raw.githubusercontent.com/testzlx/pictures/master/threadpool.jpg" alt="tupian"></li>
</ul>
</li>
<li>疑问<ul>
<li>为何是阻塞队列(小米面试)? 如果是非阻塞队列,线程个数的增减与任务提交需要额外的同步策略,而使用阻塞队列,编程简单些</li>
</ul>
</li>
</ul>
<h3 id="zkDatabase,zookeeperServer-dataTree"><a href="#zkDatabase,zookeeperServer-dataTree" class="headerlink" title="zkDatabase,zookeeperServer,dataTree"></a>zkDatabase,zookeeperServer,dataTree</h3><h2 id="分布式集群"><a href="#分布式集群" class="headerlink" title="分布式集群"></a>分布式集群</h2><ul>
<li>选主paoxs算法</li>
</ul>
<h2 id="应用场景"><a href="#应用场景" class="headerlink" title="应用场景"></a>应用场景</h2><ul>
<li>选主</li>
<li>动态读取配置文件</li>
<li>分布式锁</li>
</ul>
<h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><ul>
<li><a href="http://blog.csdn.net/testcs_dn/article/details/45719357" target="_blank" rel="external">markdown字体颜色</a></li>
<li><a href="http://www.infoq.com/cn/articles/java-threadPool" target="_blank" rel="external">阿里工程师对线程池思考</a></li>
</ul>
</div>
<footer class="article-footer">
<a data-url="http://yoursite.com/2017/06/28/zookeeper/" data-id="cjtzh0o720008ink2a7jyc107" class="article-share-link">Share</a>
</footer>
</div>
</article>
<article id="post-restfulGateway" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2017/06/05/restfulGateway/" class="article-date">
<time datetime="2017-06-04T16:33:02.000Z" itemprop="datePublished">2017-06-05</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2017/06/05/restfulGateway/">restful服务网关架构设计</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><ul>
<li>gateway:tyk框架,开源,golang编写 <a href="https://github.com/TykTechnologies/tyk" target="_blank" rel="external">github地址</a></li>
</ul>
<h2 id="架构图"><a href="#架构图" class="headerlink" title="架构图"></a>架构图</h2><p><img src="https://raw.githubusercontent.com/testzlx/pictures/master/frame.jpg" alt="tupian"></p>
</div>
<footer class="article-footer">
<a data-url="http://yoursite.com/2017/06/05/restfulGateway/" data-id="cjtzh0o6x0007ink21vkx3rg8" class="article-share-link">Share</a>
</footer>
</div>
</article>
<article id="post-failtureTree" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2017/06/04/failtureTree/" class="article-date">
<time datetime="2017-06-04T09:20:37.000Z" itemprop="datePublished">2017-06-04</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2017/06/04/failtureTree/">败者树应用详解</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<h2 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h2><ul>
<li>完全二叉树</li>
<li>一般用作外部排序的归并排序阶段</li>
</ul>
<h2 id="优势"><a href="#优势" class="headerlink" title="优势"></a>优势</h2><ul>
<li>场景:m个初始归并段,k路平衡的归并排序</li>
<li>分析:时间主要消耗在磁盘的读写,以上场景每个元素从磁盘读取次数为log(k)m,可见增大k值可以减少磁盘读写次数,但是每次从k个数组中选择一个最值,则需要比较k-1次,n个数时间复杂度为O(n*(k-1));如果使用败者树,则每次选择最值花费时间为log(2)k,不过空间复杂度为O(k)(存储中间结果)</li>
</ul>
<h2 id="伪代码"><a href="#伪代码" class="headerlink" title="伪代码"></a>伪代码</h2><p><pre><code><br>int[] ls = new int[k]<br>void createLoserTree(int[] arr,int k){<br> int i;<br> for(i = 0;i < k;i++){<br> ls[i] = -1;<br> }<br> for(i = k-1;i >= 0;i– ){<br> adjust(arr,k,i);<br> }<br>}<br>void adjust(int[] arr,int length,int index){<br> int t = (length+index)/2<br> while(t > 0 ){<br> if(ls[t] ==-1 || arr[index] > arr[ls[t]}){<br> swap(index,ls[t])<br> }<br> t = t >> 2<br> }<br> ls[0] = s<br>}<br>void kMerge(int k){<br> int i,arr[] = new int[k]<br> for(i = 0;i < k;i++){<br> input(i,arr) //从第i个归并段pop数到arr中<br> }<br> createLoserTree(arr,k)<br> while(arr[ls[0]] != MAXVALUE){<br> int tmp = ls[0];<br> outPut(arr[ls[0]])<br> input(tmp,arr) //如果第i个归并段没数据了,则进入arr中的值为MAXVALUE<br> adjust(tmp)<br> }<br>}<br></code></pre></p>
</div>
<footer class="article-footer">
<a data-url="http://yoursite.com/2017/06/04/failtureTree/" data-id="cjtzh0o6a0000ink2mps207d3" class="article-share-link">Share</a>
</footer>
</div>
</article>
<article id="post-trie" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2017/06/01/trie/" class="article-date">
<time datetime="2017-06-01T10:02:15.000Z" itemprop="datePublished">2017-06-01</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2017/06/01/trie/">Trie树应用详解</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<h2 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h2><ul>
<li>又名字典树或者前缀树,特点是利用字符串的公共前缀来节约存储空间</li>
</ul>
<h2 id="性质"><a href="#性质" class="headerlink" title="性质"></a>性质</h2><ul>
<li>根节点不包含字符,除根节点外每一个节点都只包含一个字符</li>
<li>从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串</li>
<li>每个节点的所有子节点包含的字符都不相同。</li>
</ul>
<h2 id="应用场景"><a href="#应用场景" class="headerlink" title="应用场景"></a>应用场景</h2><ul>
<li>web服务的请求路由模块 <a href="https://github.com/beego/mux" target="_blank" rel="external">mux</a> </li>
<li>搜索引擎的分词模块 <a href="https://github.com/yangyining/IKAnalyzer" target="_blank" rel="external">IKAnalyzer</a> </li>
<li>搜索推荐:<a href="https://github.com/testzlx/xinglinzhang/blob/master/SugTest.java" target="_blank" rel="external">Suggest</a></li>
</ul>
<h2 id="分析"><a href="#分析" class="headerlink" title="分析"></a>分析</h2><h3 id="mux"><a href="#mux" class="headerlink" title="mux"></a>mux</h3><ul>
<li>主要数据结构 <pre><code>type Node struct {<br> name, allow []string //allow储存的是HTTP Method(Get,Post,Head等等)。name存储的是restful Uri路径中的正则表达式,在Match时从中获取正则式对应的值<br> pattern, segment string //segment:值为strings.Split(Uri, “/“)中的元素。pattern值:当前node的endpoint为True值,值为整个Uri<br> endpoint, wildcard, optional bool //endpoint:当前node的pattern是完整的Uri时,值为True;wildcard:当strings.Split(Uri, “/“)中的元素值为 <em> 或</em>.<em>时为True,<br> parent </em>Node //父节点<br> segChildren []<em>Node //此节点存储Uri中包含segment(:id)的子节点<br> optionChildren []</em>Node //此节点存储Uri中包含?的子节点<br> varyChildren []<em>Node //此节点存储Uri中包含</em>或?:的子节点<br> children map[string]<em>Node //此节点存储Uri中不包含正则的子节点<br> handlers // 储存此节点Http Method所对应的驱动事件 map[string]interface{}<br> regex </em>regexp.Regexp //Uri中包含<em>或者复杂正则(article<em>:id:int),则所对应的值为article</em>([\w]+)<br> namedRoutes map[string]</em>Node //暂时未使用<br>}<br></code></pre></li>
<li><p>插入过程:</p>
<ul>
<li>先把整个Uri按/分割成数组,选择第一个segment元素,查找所对应的节点A,有就返回,没有就创建,再选择余下的元素和节点A,递归调用,直至余下数组个数为0 </li>
<li>根据当前segment查找对应的节点逻辑如下:先看parent的children哈希中是否存在,有就返回,没有就创建,再根据当前segment正则特征关联上parent节点,代码如下<pre><code><br>if segment == “” {<br> parent.children[segment] = node<br>} else if strings.Contains(segment, “::”) {<br> parent.children[strings.Replace(segment, “::”, “:”, -1)] = node<br>} else if segment == “<em>“ {<br> node.wildcard = true<br> node.regex = wildRegexp<br> node.name = []string{“:splat”}<br> parent.varyChildren = append(parent.varyChildren, node)<br>} else if segment == “</em>.*” {<br> node.wildcard = true<br> node.regex = extWildRegexp<br> node.name = []string{“:path”, “:ext”}<br> parent.varyChildren = append(parent.varyChildren, node)<br>} else if optionalParamRegexp.MatchString(segment) {<br> node.optional = true<br> node.name = []string{segment[1:]}<br> parent.optionChildren = append(parent.optionChildren, node)<br> parent.segChildren = append(parent.segChildren, node)<br>} else if paramRegexp.MatchString(segment) {<br> node.name = []string{segment}<br> parent.segChildren = append(parent.segChildren, node)<br>} else if strings.ContainsAny(segment, “:”) {<br> node.name, node.regex, node.optional = regexpSegment(segment)<br> if node.optional { parent.optionChildren=append(parent.optionChildren, node)<br> }<br> parent.varyChildren = append(parent.varyChildren, node)<br>} else {<br> parent.children[segment] = node<br>}</code></pre> </li>
</ul>
</li>
<li><p>match过程: 逐字节遍历Uri,直到分隔符/,在trie树中获取所对应的字节点,如果当前字节点没有正则信息,则继续遍历,否则抽取其中信息(键值对)放入match的Param中,关键代码如下<pre><code><br>for i := 1; i <= end; i++ {</code></pre></p>
<pre><code>if i < end && path[i] != '/' {
continue
}
segment := path[start:i]
node := matchNode(parent, segment, path[i:])
if node == nil {
// TrailingSlashRedirect: /abc/efg/ -> /abc/efg
if parent.endpoint && i == end && segment == "" {
matched.Path = path[:end-1]
}
// match suffixext match
if i == end {
for _, ext := range allowSuffixExt {
if strings.HasSuffix(segment, ext) {
node = matchNode(parent, strings.TrimSuffix(segment, ext), path[i:])
if node != nil {
if matched.Params == nil {
matched.Params = make(map[string]string)
}
matched.Params[":ext"] = ext[1:]
goto ParentNode
}
}
}
}
return matched, nil
}
ParentNode:
parent = node
if len(parent.name) > 0 {
if matched.Params == nil {
matched.Params = make(map[string]string)
}
if parent.wildcard {
// match *
if len(parent.name) == 1 {
segs := strings.Split(path[start:end], "/")
starValue := []string{}
for {
if len(segs) > 0 {
starValue = append(starValue, segs[0])
}
if len(segs) == 1 {
break
} else {
segs = segs[1:]
}
n := matchNode(parent, segs[0], strings.Join(segs, "/"))
if n != nil {
matched.Params[parent.name[0]] = strings.Join(starValue, "/")
parent = n
i = i + 1 + len(segs[0])
start = start + len(strings.Join(starValue, "/"))
goto END
} else {
i = i + 1 + len(segs[0])
}
}
matched.Params[parent.name[0]] = strings.Join(starValue, "/")
} else {
// match *.*
values := parent.regex.FindStringSubmatch(path[start:end])
if len(values) != len(parent.name)+1 {
return nil, fmt.Errorf("%s: Find wrong match %v, need names %v", path, values, parent.name)
}
for i, name := range parent.name {
matched.Params[name] = values[i+1]
}
}
break
} else if parent.regex == nil { // :name
matched.Params[parent.name[0]] = segment
} else {
values := parent.regex.FindStringSubmatch(segment)
for i, name := range parent.name {
matched.Params[name] = values[i+1]
}
}
}
start = i + 1
END:
</code></pre><p></p>
<ul>
<li><p>注意点:获取子节点信息的优先级顺序为: 完全匹配–>精准匹配—> 模糊匹配–>是否存在匹配(按先后顺序)</p>
<h3 id="IKAnalyzer"><a href="#IKAnalyzer" class="headerlink" title="IKAnalyzer"></a>IKAnalyzer</h3><h3 id="Suggest"><a href="#Suggest" class="headerlink" title="Suggest"></a>Suggest</h3></li>
</ul>
</li>
</ul>
</div>
<footer class="article-footer">
<a data-url="http://yoursite.com/2017/06/01/trie/" data-id="cjtzh0o730009ink20mbrp4es" class="article-share-link">Share</a>
</footer>
</div>
</article>
<article id="post-marathon" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2017/05/22/marathon/" class="article-date">
<time datetime="2017-05-22T08:40:59.000Z" itemprop="datePublished">2017-05-22</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2017/05/22/marathon/">marathon部署系统</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<h2 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h2><ul>
<li>使用组件: docker ,mesos,marathon,服务发现,分布式日志收集,docker registry,gitlab,jenkins</li>
</ul>
<h2 id="优势"><a href="#优势" class="headerlink" title="优势"></a>优势</h2><ul>
<li>简单易用,真正做到一键部署,提升服务部署效率</li>
<li>灵活扩展,服务实现自动扩缩容,故障自动拉起,保证服务稳定运行</li>
<li>对应用业务侵入几乎为0,用户只需提供日志目录,开放端口,所需cpu,mem,对外使用域名即可</li>
<li>安全可靠,资源高度隔离,用户独享计算资源,容器运行负载实时监控、快速迁移</li>
<li>高效,镜像极速上传下载海量容器秒级启动,使用容器服务进行构建、打包集成</li>
<li>集群管理:对用户透明,不影响线上服务。简单快速,集群规模大小控制随心所欲</li>
</ul>
<h2 id="架构图"><a href="#架构图" class="headerlink" title="架构图"></a>架构图</h2><p><img src="https://raw.githubusercontent.com/testzlx/pictures/master/20170522.jpg" alt="tupian"></p>
</div>
<footer class="article-footer">
<a data-url="http://yoursite.com/2017/05/22/marathon/" data-id="cjtzh0o6q0005ink238j46x66" class="article-share-link">Share</a>
</footer>
</div>
</article>
<article id="post-docker-storage" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2017/05/16/docker-storage/" class="article-date">
<time datetime="2017-05-16T03:52:44.000Z" itemprop="datePublished">2017-05-16</time>
</a>
</div>
<div class="article-inner">
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2017/05/16/docker-storage/">docker storage</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<h1 id="docker存储方式比较"><a href="#docker存储方式比较" class="headerlink" title="docker存储方式比较"></a>docker存储方式比较</h1><h2 id="预热"><a href="#预热" class="headerlink" title="预热"></a>预热</h2><ul>
<li><p>写时复制(CoW),所有的容器共享image的文件系统,所有数据都从image中读取,只有当要对文件进行写操作时,才从image里把要写的文件复制到自己的文件系统进行修改 每个容器修改的都是自己的复本,相互隔离,相互不影响。使用CoW可以有效的提高磁盘的利用率。</p>
</li>
<li><p>写时分配(allocate-on-demand) 只有在要新写入一个文件时才分配空间,这样可以提高存储资源的利用率</p>
</li>
</ul>
<h2 id="aufs"><a href="#aufs" class="headerlink" title="aufs"></a>aufs</h2><p>支持将不同目录挂载到同一个虚拟文件系统下的文件系统。这种文件系统可以一层一层地叠加修改文件。无论底下有多少层都是只读的,只有最上层的文件系统是可写的<br> 文件级存储</p>
<p>##btrfs<br>下一代写时复制文件系统,并入Linux内核,也是文件级级存储。把文件系统的一部分配置为一个完整的子文件系统,一个大的文件系统可以被划分为多个子文件系统,这些子文件系统共享底层的设备空间,在需要磁盘空间时便从底层设备中分配,Btrfs 将磁盘空间划分为多个chunk 。每个chunk 可以使用不同的磁盘空间分配策略。比如某些 chunk 只存放 metadata,某些 chunk 只存放数据,</p>
<h2 id="device-mapper"><a href="#device-mapper" class="headerlink" title="device mapper"></a>device mapper</h2><ul>
<li>loop lvm 扩大data大小 sudo truncate -s 214748364800 /var/lib/docker/devicemapper/devicemapper/data <a href="https://docs.docker.com/engine/userguide/storagedriver/device-mapper-driver/" target="_blank" rel="external">docker loop-lvm 默认100G不够 解决方案</a>(试验成功)</li>
<li><p>简单解决方案:增加文件大小再重启docker dd if=/dev/zero of=/var/lib/docker/devicemapper/devicemapper/data bs=1G count=0 seek=600 (也可行,不是官方建议)<br>逻辑设备到物理设备的映射框架机制 块级存储</p>
</li>
<li><p>除了前面说到的问题外,devicemapper + loop-lvm 还有一个缺陷,因为它是稀疏文件,所以它会不断增长。用户在使用过程中会注意到 /var/lib/docker/devicemapper/devicemapper/data 不断增长,而且无法控制。很多人会希望删除镜像或者可以解决这个问题,结果发现效果并不明显。原因就是这个稀疏文件的空间释放后基本不进行垃圾回收的问题。因此往往会出现即使删除了文件内容,空间却无法回收,随着使用这个稀疏文件一直在不断增长。</p>
</li>
<li><p>解决方案</p>
<ul>
<li><a href="http://www.tuicool.com/articles/IvAvyu" target="_blank" rel="external">http://www.tuicool.com/articles/IvAvyu</a></li>
<li><a href="http://www.projectatomic.io/blog/2016/03/daemon_option_basedevicesize/" target="_blank" rel="external">http://www.projectatomic.io/blog/2016/03/daemon_option_basedevicesize/</a></li>
<li><a href="http://jpetazzo.github.io/2014/01/29/docker-device-mapper-resize/" target="_blank" rel="external">http://jpetazzo.github.io/2014/01/29/docker-device-mapper-resize/</a></li>
</ul>
</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div></pre></td><td class="code"><pre><div class="line">pvcreate /dev/xvdf</div><div class="line">vgcreate docker /dev/xvdf</div><div class="line"> lvcreate --wipesignatures y -n thinpool docker -l 95%VG</div><div class="line"> lvcreate --wipesignatures y -n thinpoolmeta docker -l 1%VG </div><div class="line">lvconvert -y --zero n -c 512K --thinpool docker/thinpool --poolmetadata docker/thinpoolmeta</div><div class="line"></div><div class="line">vi /etc/lvm/profile/docker-thinpool.profile,内容为activation {</div><div class="line"> thin_pool_autoextend_threshold=80</div><div class="line"> thin_pool_autoextend_percent=20</div><div class="line">}</div><div class="line">lvchange --metadataprofile docker-thinpool docker/thinpool</div><div class="line">lvs -o+seg_monitor</div><div class="line">--storage-driver=devicemapper --storage-opt=dm.thinpooldev=/dev/mapper/docker-thinpool --storage-opt=dm.use_deferred_removal=true --storage-opt=dm.use_deferred_deletion=true</div></pre></td></tr></table></figure>
<h2 id="overlayfs"><a href="#overlayfs" class="headerlink" title="overlayfs"></a>overlayfs</h2><p> 一个 upper 文件系统和一个 lower 文件系统,分别代表Docker的镜像层和容器层<br> 文件级存储</p>
<h2 id="zfs"><a href="#zfs" class="headerlink" title="zfs"></a>zfs</h2><p>把所有设备集中到一个存储池中来进行管理,用“存储池”的概念来管理物理存储空间</p>
<h2 id="各种对比"><a href="#各种对比" class="headerlink" title="各种对比"></a>各种对比</h2><p><img src="http://w4.sanwen8.cn/mmbiz/g42Pp5Zyy05VLt2G7dfribUJU1U7SHlnXqdrpuGMDCwczzJ9UbxPEbicwnVcqBnjcia8iaJNls6ZGyDmnrAv7JNVSg/640?wx_fmt=png" alt="tupian"></p>
<h1 id="关于容器持久化存储的3个方案"><a href="#关于容器持久化存储的3个方案" class="headerlink" title="关于容器持久化存储的3个方案"></a>关于容器持久化存储的3个方案</h1><ol>
<li>持久化数据并不是存储在容器中,而是作为后端服务,例如对象存储和数据库即服务。这个方案可以确保容器和它们的数据持久化支持服务松耦合,同时也不需要那些会限制扩展的依赖</li>
<li>挂载共享网络存储卷到容器中作为数据存储使用</li>
</ol>
<h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><p><a href="http://sanwen8.cn/p/2114I8Z.html" target="_blank" rel="external">存储对比</a></p>
<p><a href="http://www.open-open.com/lib/view/open1476173250691.html" target="_blank" rel="external">存储对比2</a></p>
<h1 id="devicemapper-direct-lvm-store"><a href="#devicemapper-direct-lvm-store" class="headerlink" title="devicemapper direct-lvm store"></a>devicemapper direct-lvm store</h1><p><a href="http://coolshell.cn/articles/17200.html" target="_blank" rel="external">docker loop-lvm原理解析</a></p>
<p><a href="http://blog.csdn.net/qq_26923057/article/details/52351731" target="_blank" rel="external">docker direct-lvm存储</a></p>
<h1 id="loop-lvm-amp-direct-lvm"><a href="#loop-lvm-amp-direct-lvm" class="headerlink" title="loop-lvm & direct-lvm"></a>loop-lvm & direct-lvm</h1><p>1.loop-lvm不适合io重的</p>
<ol>
<li>direct-lvm The performance advantages are measurable at moderate load and high density.</li>
</ol>
<h2 id="容器磁盘大小及扩容"><a href="#容器磁盘大小及扩容" class="headerlink" title="容器磁盘大小及扩容"></a>容器磁盘大小及扩容</h2><ul>
<li>df -hT 可以查看容器内根目录挂在磁盘的总大小及已使用大小</li>
<li>动态扩容<br><pre><code><br>#!/bin/bash<br>#This script is dynamic modify docker container disk<br>#Author Deng Lei<br>if [ -z $1 ] || [ -z $2 ]; then<br> echo “Usage: container_name increase_capacity”<br> echo “Example: I want increase 11G to test”<br> echo “The command is: sh <code>basename $0</code> test 11”<br> exit 1 <pre><code>fi
</code></pre>if [ <code>docker inspect $1 &>>/dev/null && echo 0 || echo 1</code> -eq 1 ];then<br> echo “The container $1 is no exist!”<br> exit 1<br>fi<br>container_id=<code>docker inspect -f '{{ .Id }}' $1</code><br>now_disk=<code>dmsetup table /dev/mapper/docker-*-$container_id|awk '{print $2}'</code><br>disk=$(($2<em>1024</em>1024<em>1024/512))<br>if [ $disk -lt $now_disk ];then<br> echo “I can’t shink container $1 from $(($now_disk</em>512/1024/1024/1024))G to ${2}G!I only modify contanier increase disk!”<br> exit 1<br>fi<br>dmsetup table /dev/mapper/docker-<em>-$container_id|sed “s/0 [0-9]</em> thin/0 $disk thin/“|dmsetup load /dev/mapper/docker-<em>-$container_id<br>dmsetup resume /dev/mapper/docker-</em>-$container_id<br>resize2fs /dev/mapper/docker-*-$container_id<br>if [ $? -eq 0 ];then<br> echo “dynamic container $1 disk to ${2}G is success!”<br>else<br> echo “dynamic container $1 disk to ${2}G is fail!”<br>fi<br></code></pre></li>
</ul>
</div>
<footer class="article-footer">
<a data-url="http://yoursite.com/2017/05/16/docker-storage/" data-id="cjtzh0o77000bink27w7fsbgi" class="article-share-link">Share</a>
</footer>
</div>
</article>
<nav id="page-nav">
<span class="page-number current">1</span><a class="page-number" href="/page/2/">2</a><a class="extend next" rel="next" href="/page/2/">__('next') »</a>
</nav>
</section>
<aside id="sidebar">
<div class="widget-wrap">
<h3 class="widget-title">Archives</h3>
<div class="widget">
<ul class="archive-list"><li class="archive-list-item"><a class="archive-list-link" href="/archives/2019/03/">March 2019</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2018/10/">October 2018</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2018/03/">March 2018</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2017/06/">June 2017</a></li><li class="archive-list-item"><a class="archive-list-link" href="/archives/2017/05/">May 2017</a></li></ul>
</div>
</div>
<div class="widget-wrap">
<h3 class="widget-title">Recent Posts</h3>
<div class="widget">
<ul>
<li>
<a href="/2019/03/18/economic/">(no title)</a>
</li>
<li>
<a href="/2018/10/20/dpark/">dpark代码分析</a>
</li>
<li>
<a href="/2018/03/17/markdown/">md语法说明</a>
</li>
<li>
<a href="/2018/03/17/personBlog/">搭建个人博客</a>
</li>
<li>
<a href="/2017/06/28/zookeeper/">zookeeper源码分析</a>
</li>
</ul>
</div>
</div>
</aside>
</div>
<footer id="footer">
<div class="outer">
<div id="footer-info" class="inner">
© 2019 John Doe<br>
Powered by <a href="http://hexo.io/" target="_blank">Hexo</a>
</div>
</div>
</footer>
</div>
<nav id="mobile-nav">
<a href="/" class="mobile-nav-link">Home</a>
<a href="/archives" class="mobile-nav-link">Archives</a>
</nav>
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>
<link rel="stylesheet" href="/fancybox/jquery.fancybox.css">
<script src="/fancybox/jquery.fancybox.pack.js"></script>
<script src="/js/script.js"></script>
</div>
</body>
</html>