-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathatom.xml
More file actions
1158 lines (1087 loc) · 37.5 KB
/
atom.xml
File metadata and controls
1158 lines (1087 loc) · 37.5 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
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"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<id>https://meetabug.github.io</id>
<title>Meetabug</title>
<updated>2020-08-02T13:56:23.217Z</updated>
<generator>https://github.com/jpmonette/feed</generator>
<link rel="alternate" href="https://meetabug.github.io"/>
<link rel="self" href="https://meetabug.github.io/atom.xml"/>
<logo>https://meetabug.github.io/images/avatar.png</logo>
<icon>https://meetabug.github.io/favicon.ico</icon>
<rights>All rights reserved 2020, Meetabug</rights>
<entry>
<title type="html"><![CDATA[Docker 常用命令]]></title>
<id>https://meetabug.github.io/post/docker-chang-yong-ming-ling/</id>
<link href="https://meetabug.github.io/post/docker-chang-yong-ming-ling/">
</link>
<updated>2020-08-02T13:44:52.000Z</updated>
<content type="html"><![CDATA[<h2 id="容器生命周期管理">容器生命周期管理</h2>
<ul>
<li>run</li>
<li>start/stop/restart</li>
<li>kill</li>
<li>rm</li>
<li>pause/unpause</li>
<li>create</li>
<li>exec</li>
</ul>
<h2 id="容器操作">容器操作</h2>
<ul>
<li>ps</li>
<li>inspect</li>
<li>top</li>
<li>attach</li>
<li>events</li>
<li>logs</li>
<li>wait</li>
<li>export</li>
<li>port</li>
</ul>
<h2 id="容器rootfs命令">容器rootfs命令</h2>
<ul>
<li>commit 从容器创建一个新的镜像</li>
<li>cp 用于容器与主机之间的数据拷贝</li>
<li>diff 检查容器里文件结构的更改</li>
</ul>
<h2 id="镜像仓库">镜像仓库</h2>
<ul>
<li>login</li>
<li>pull</li>
<li>push</li>
<li>search</li>
</ul>
<h2 id="本地镜像管理">本地镜像管理</h2>
<ul>
<li>images</li>
<li>rmi</li>
<li>tag</li>
<li>build</li>
<li>history</li>
<li>save</li>
<li>load</li>
<li>import</li>
</ul>
<h2 id="infoversion">info|version</h2>
<ul>
<li>info</li>
<li>version</li>
</ul>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[Mysql 常用命令]]></title>
<id>https://meetabug.github.io/post/mysql-chang-yong-ming-ling/</id>
<link href="https://meetabug.github.io/post/mysql-chang-yong-ming-ling/">
</link>
<updated>2020-08-02T13:11:48.000Z</updated>
<content type="html"><![CDATA[<h2 id="连接">连接</h2>
<pre><code> mysql -u root -p
</code></pre>
<h2 id="数据库">数据库</h2>
<ul>
<li>列出数据库: show databases;</li>
<li>使用数据库; use name;</li>
<li>创建数据库: create database name;</li>
<li>删除数据库: drop database name;</li>
<li>修改数据库: alter database name DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_chinese_ci;
<ul>
<li>查看数据库: show create database name;</li>
</ul>
</li>
</ul>
<h2 id="表">表</h2>
<ul>
<li>列出表: show tables;</li>
<li>创建表:</li>
</ul>
<pre><code> CREATE TABLE IF NOT EXISTS `name`(
`id` INT UNSIGNED AUTO_INCREMENT,
`title` VARCHAR(100) NOT NULL,
`author` VARCHAR(40) NOT NULL,
`data` DATE,
PRIMARY KEY ( `id` )
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
</code></pre>
<ul>
<li>
<p>删除表: drop table name;</p>
</li>
<li>
<p>修改表:</p>
<ul>
<li>
<p>修改表的默认 CHARSET<br>
ALTER TABLE name DEFAULT CHARACTER SET utf8mb4</p>
</li>
<li>
<p>修改表及所以列的字符<br>
ALTER TABLE name CONVERT TO CHARACTER SET utf8mb4</p>
</li>
<li>
<p>修改列的字符集<br>
ALTER TABLE name CHANGE filed1 CHARACTER SET utf8mb4</p>
</li>
<li>
<p>添加列<br>
ALTER TABLE name ADD <code>filed1</code> type</p>
</li>
<li>
<p>删除列<br>
ALTER TABLE name DROP filed1</p>
</li>
<li>
<p>修改列类型<br>
ALTER TABLE name MODIFY filed1 <ype
ALTER TABLE name>CHANGE <code>filed1</code> <code>filed1</code> <type> 可以修改列名</p>
</li>
</ul>
</li>
<li>
<p>插入<br>
INSERT INTO name (filed1, filed2,...) VALUES (value1, value2,...),(value3,value4,...),...;</p>
</li>
<li>
<p>查询<br>
SELECT filed1,filed2,... FROM name WHERE condition</p>
</li>
<li>
<p>显示表</p>
<ul>
<li>
<p>显示表字段<br>
desc name</p>
</li>
<li>
<p>显示表创建字段<br>
show create table name</p>
</li>
</ul>
</li>
</ul>
<h2 id="备份恢复">备份/恢复</h2>
<ul>
<li>备份<br>
mysqldump -h address --port port -u username -p password datebase_name table_name... > bak.sql</li>
</ul>
<p>其中 table name 可选</p>
<ul>
<li>恢复<br>
mysql -h address --port port -u username -p password datebase_name < bak.sql</li>
</ul>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[Mysql 面试]]></title>
<id>https://meetabug.github.io/post/mysql-mian-shi/</id>
<link href="https://meetabug.github.io/post/mysql-mian-shi/">
</link>
<updated>2020-08-02T10:07:09.000Z</updated>
<content type="html"><![CDATA[<h2 id="索引相关">索引相关</h2>
<ol>
<li>
<p>什么是索引?<br>
索引是一种数据结构,可以帮助我们快速的进行数据的查找.</p>
</li>
<li>
<p>在建立索引的时候,都有哪些需要考虑的因素呢?<br>
建立索引的时候一般要考虑到字段的使用频率,经常作为条件进行查询的字段比较适合.如果需要建立联合索引的话,还需要考虑联合索引中的顺序.此外也要考虑其他方面,比如防止过多的所有对表造成太大的压力.这些都和实际的表结构以及查询方式有关.</p>
</li>
<li>
<p>常见索引类型有那些?<br>
主键索引、唯一索引、复合索引、全文索引</p>
</li>
<li>
<p>Mysql 建立索引的原则?<br>
最左前缀原理<br>
尽量的去扩展索引,而不是重复的新建新索引</p>
</li>
</ol>
<h2 id="事务相关">事务相关</h2>
<ol>
<li>
<p>什么是事务?<br>
事务是一个序列操作,其中的操作要么都执行,要么都不执行,它是一个不可分割的工作单位,ACID 四大特性是事务的基础。</p>
</li>
<li>
<p>ACID是什么?可以详细说一下吗?<br>
A=Atomicity<br>
原子性,就是上面说的,要么全部成功,要么全部失败.不可能只执行一部分操作.<br>
C=Consistency<br>
一致性,系统(数据库)总是从一个一致性的状态转移到另一个一致性的状态,不会存在中间状态.<br>
I=Isolation<br>
隔离性: 通常来说:一个事务在完全提交之前,对其他事务是不可见的.注意前面的通常来说加了红色,意味着有例外情况.<br>
D=Durability<br>
持久性,一旦事务提交,那么就永远是这样子了,哪怕系统崩溃也不会影响到这个事务的结果.</p>
</li>
<li>
<p>怎么解决这些问题呢?MySQL的事务隔离级别了解吗?<br>
MySQL的四种隔离级别如下:</p>
</li>
</ol>
<ul>
<li>
<p>未提交读(READ UNCOMMITTED)<br>
这就是上面所说的例外情况了,这个隔离级别下,其他事务可以看到本事务没有提交的部分修改.因此会造成脏读的问题(读取到了其他事务未提交的部分,而之后该事务进行了回滚).<br>
这个级别的性能没有足够大的优势,但是又有很多的问题,因此很少使用.</p>
</li>
<li>
<p>已提交读(READ COMMITTED)<br>
其他事务只能读取到本事务已经提交的部分.这个隔离级别有 不可重复读的问题,在同一个事务内的两次读取,拿到的结果竟然不一样,因为另外一个事务对数据进行了修改.</p>
</li>
<li>
<p>REPEATABLE READ(可重复读)<br>
可重复读隔离级别解决了上面不可重复读的问题(看名字也知道),但是仍然有一个新问题,就是 幻读,当你读取id> 10 的数据行时,对涉及到的所有行加上了读锁,此时例外一个事务新插入了一条id=11的数据,因为是新插入的,所以不会触发上面的锁的排斥,那么进行本事务进行下一次的查询时会发现有一条id=11的数据,而上次的查询操作并没有获取到,再进行插入就会有主键冲突的问题.</p>
</li>
<li>
<p>SERIALIZABLE(可串行化)<br>
这是最高的隔离级别,可以解决上面提到的所有问题,因为他强制将所以的操作串行执行,这会导致并发性能极速下降,因此也不是很常用.</p>
</li>
</ul>
<ol start="5">
<li>
<p>Innodb使用的是哪种隔离级别呢?<br>
InnoDB默认使用的是可重复读隔离级别.</p>
</li>
<li>
<p>对MySQL的锁了解吗?<br>
当数据库有并发事务的时候,可能会产生数据的不一致,这时候需要一些机制来保证访问的次序,锁机制就是这样的一个机制.<br>
就像酒店的房间,如果大家随意进出,就会出现多人抢夺同一个房间的情况,而在房间上装上锁,申请到钥匙的人才可以入住并且将房间锁起来,其他人只有等他使用完毕才可以再次使用.</p>
</li>
<li>
<p>MySQL都有哪些锁呢?像上面那样子进行锁定岂不是有点阻碍并发效率了?<br>
从锁的类别上来讲,有共享锁和排他锁.<br>
共享锁: 又叫做读锁. 当用户要进行数据的读取时,对数据加上共享锁.共享锁可以同时加上多个.<br>
排他锁: 又叫做写锁. 当用户要进行数据的写入时,对数据加上排他锁.排他锁只可以加一个,他和其他的排他锁,共享锁都相斥.<br>
用上面的例子来说就是用户的行为有两种,一种是来看房,多个用户一起看房是可以接受的. 一种是真正的入住一晚,在这期间,无论是想入住的还是想看房的都不可以.<br>
锁的粒度取决于具体的存储引擎,InnoDB实现了行级锁,页级锁,表级锁.<br>
他们的加锁开销从大大小,并发能力也是从大到小.</p>
</li>
</ol>
<h2 id="表结构设计">表结构设计</h2>
<ol>
<li>
<p>为什么要尽量设定一个主键?<br>
主键是数据库确保数据行在整张表唯一性的保障,即使业务上本张表没有主键,也建议添加一个自增长的ID列作为主键.设定了主键之后,在后续的删改查的时候可能更加快速以及确保操作数据范围安全.</p>
</li>
<li>
<p>主键使用自增ID还是UUID?<br>
推荐使用自增ID,不要使用UUID.<br>
因为在InnoDB存储引擎中,主键索引是作为聚簇索引存在的,也就是说,主键索引的B+树叶子节点上存储了主键索引以及全部的数据(按照顺序),如果主键索引是自增ID,那么只需要不断向后排列即可,如果是UUID,由于到来的ID与原来的大小不确定,会造成非常多的数据插入,数据移动,然后导致产生很多的内存碎片,进而造成插入性能的下降.<br>
总之,在数据量大一些的情况下,用自增主键性能会好一些.</p>
</li>
<li>
<p>字段为什么要求定义为not null?<br>
null值会占用更多的字节,且会在程序中造成很多与预期不符的情况.</p>
</li>
<li>
<p>如果要存储用户的密码散列,应该使用什么字段进行存储?<br>
密码散列,盐,用户身份证号等固定长度的字符串应该使用char而不是varchar来存储,这样可以节省空间且提高检索效率.</p>
</li>
</ol>
<h2 id="存储引擎相关">存储引擎相关</h2>
<ol>
<li>
<p>MySQL支持哪些存储引擎?<br>
MySQL支持多种存储引擎,比如InnoDB,MyISAM,Memory,Archive等等.在大多数的情况下,直接选择使用InnoDB引擎都是最合适的,InnoDB也是MySQL的默认存储引擎.</p>
</li>
<li>
<p>MyISAM 和 InnoDB 的区别<br>
MyISAM 查询效率更高,但是不支持事物<br>
InnoDB 插入、更新较高,支持事物处理<br>
MyISAM 支持表锁, InnoDb 支持行锁<br>
MyISAM 是默认引擎,InnoDB 需要指定,MySQL 5.5 起 InnoDB是默认的数据库引擎<br>
InnoDB 不支持 全文索引 类型的索引</p>
</li>
</ol>
<h2 id="零散问题">零散问题</h2>
<ol>
<li>
<p>MySQL中的varchar和char有什么区别.<br>
char是一个定长字段,假如申请了char(10)的空间,那么无论实际存储多少内容.该字段都占用10个字符,而varchar是变长的,也就是说申请的只是最大长度,占用的空间为实际字符长度+1,最后一个字符存储使用了多长的空间.<br>
在检索效率上来讲,char > varchar,因此在使用中,如果确定某个字段的值的长度,可以使用char,否则应该尽量使用varchar.例如存储用户MD5加密后的密码,则应该使用char.</p>
</li>
<li>
<p>varchar(10)和int(10)代表什么含义?<br>
varchar的10代表了申请的空间长度,也是可以存储的数据的最大长度,而int的10只是代表了展示的长度,不足10位以0填充.也就是说,int(1)和int(10)所能存储的数字大小以及占用的空间都是相同的,只是在展示时按照长度展示.</p>
</li>
<li>
<p>MySQL的binlog有有几种录入格式?分别有什么区别?<br>
有三种格式,statement,row和mixed.</p>
</li>
</ol>
<ul>
<li>statement模式下,记录单元为语句.即每一个sql造成的影响会记录.由于sql的执行是有上下文的,因此在保存的时候需要保存相关的信息,同时还有一些使用了函数之类的语句无法被记录复制.</li>
<li>row级别下,记录单元为每一行的改动,基本是可以全部记下来但是由于很多操作,会导致大量行的改动(比如alter table),因此这种模式的文件保存的信息太多,日志量太大</li>
<li>mixed. 一种折中的方案,普通操作使用statement记录,当无法使用statement的时候使用row.<br>
此外,新版的MySQL中对row级别也做了一些优化,当表结构发生变化的时候,会记录语句而不是逐行记录</li>
</ul>
<h2 id="sql-语句的优化方式">SQL 语句的优化方式?</h2>
<ol>
<li>避免使用 Like 模糊查询</li>
<li>只列出需要查询的字段,而不是所有</li>
<li>不在 MySQL 中进行运算,减轻 MySQL 的压力</li>
<li>经常查询的字段,创建合适的索引,提高查询效率</li>
</ol>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[Gitflow 工作流程]]></title>
<id>https://meetabug.github.io/post/gitflow-gong-zuo-liu-cheng/</id>
<link href="https://meetabug.github.io/post/gitflow-gong-zuo-liu-cheng/">
</link>
<updated>2020-08-02T07:39:45.000Z</updated>
<content type="html"><![CDATA[<figure data-type="image" tabindex="1"><img src="https://meetabug.github.io/post-images/1596354507196.png" alt="" loading="lazy"></figure>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[Git常用命令]]></title>
<id>https://meetabug.github.io/post/git-chang-yong-ming-ling/</id>
<link href="https://meetabug.github.io/post/git-chang-yong-ming-ling/">
</link>
<updated>2020-08-02T07:14:14.000Z</updated>
<content type="html"><![CDATA[<h2 id="流程图">流程图</h2>
<figure data-type="image" tabindex="1"><img src="https://meetabug.github.io/post-images/1596352514127.png" alt="" loading="lazy"></figure>
<h2 id="名词">名词</h2>
<ul>
<li>Workspace:工作区</li>
<li>Index / Stage:暂存区</li>
<li>Repository:仓库区(或本地仓库)</li>
<li>Remote:远程仓库</li>
</ul>
<h2 id="新建代码库">新建代码库</h2>
<pre><code>
# 在当前目录新建一个Git代码库
$ git init
# 新建一个目录,将其初始化为Git代码库
$ git init [project-name]
# 下载一个项目和它的整个代码历史
$ git clone [url]
</code></pre>
<h2 id="配置">配置</h2>
<blockquote>
<p>Git的设置文件为.gitconfig,它可以在用户主目录下(全局配置),也可以在项目目录下(项目配置)。</p>
</blockquote>
<pre><code># 显示当前的Git配置
$ git config --list
# 编辑Git配置文件
$ git config -e [--global]
# 设置提交代码时的用户信息
$ git config [--global] user.name "[name]"
$ git config [--global] user.email "[email address]"
</code></pre>
<h2 id="增加删除文件">增加/删除文件</h2>
<pre><code># 添加指定文件到暂存区
$ git add [file1] [file2] ...
# 添加指定目录到暂存区,包括子目录
$ git add [dir]
# 添加当前目录的所有文件到暂存区
$ git add .
# 添加每个变化前,都会要求确认
# 对于同一个文件的多处变化,可以实现分次提交
$ git add -p
# 删除工作区文件,并且将这次删除放入暂存区
$ git rm [file1] [file2] ...
# 停止追踪指定文件,但该文件会保留在工作区
$ git rm --cached [file]
# 改名文件,并且将这个改名放入暂存区
$ git mv [file-original] [file-renamed
</code></pre>
<h2 id="代码提交">代码提交</h2>
<pre><code># 提交暂存区到仓库区
$ git commit -m [message]
# 提交暂存区的指定文件到仓库区
$ git commit [file1] [file2] ... -m [message]
# 提交工作区自上次commit之后的变化,直接到仓库区
$ git commit -a
# 提交时显示所有diff信息
$ git commit -v
# 使用一次新的commit,替代上一次提交
# 如果代码没有任何新变化,则用来改写上一次commit的提交信息
$ git commit --amend -m [message]
# 重做上一次commit,并包括指定文件的新变化
$ git commit --amend [file1] [file2] ...
</code></pre>
<h2 id="分支">分支</h2>
<pre><code># 列出所有本地分支
$ git branch
# 列出所有远程分支
$ git branch -r
# 列出所有本地分支和远程分支
$ git branch -a
# 新建一个分支,但依然停留在当前分支
$ git branch [branch-name]
# 新建一个分支,并切换到该分支
$ git checkout -b [branch]
# 新建一个分支,指向指定commit
$ git branch [branch] [commit]
# 新建一个分支,与指定的远程分支建立追踪关系
$ git branch --track [branch] [remote-branch]
# 切换到指定分支,并更新工作区
$ git checkout [branch-name]
# 切换到上一个分支
$ git checkout -
# 建立追踪关系,在现有分支与指定的远程分支之间
$ git branch --set-upstream [branch] [remote-branch]
# 合并指定分支到当前分支
$ git merge [branch]
# 选择一个commit,合并进当前分支
$ git cherry-pick [commit]
# 删除分支
$ git branch -d [branch-name]
# 删除远程分支
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]
</code></pre>
<h2 id="标签">标签</h2>
<pre><code># 列出所有tag
$ git tag
# 新建一个tag在当前commit
$ git tag [tag]
# 新建一个tag在指定commit
$ git tag [tag] [commit]
# 删除本地tag
$ git tag -d [tag]
# 删除远程tag
$ git push origin :refs/tags/[tagName]
# 查看tag信息
$ git show [tag]
# 提交指定tag
$ git push [remote] [tag]
# 提交所有tag
$ git push [remote] --tags
# 新建一个分支,指向某个tag
$ git checkout -b [branch] [tag]
</code></pre>
<h2 id="查看信息">查看信息</h2>
<pre><code>
# 显示有变更的文件
$ git status
# 显示当前分支的版本历史
$ git log
# 显示commit历史,以及每次commit发生变更的文件
$ git log --stat
# 搜索提交历史,根据关键词
$ git log -S [keyword]
# 显示某个commit之后的所有变动,每个commit占据一行
$ git log [tag] HEAD --pretty=format:%s
# 显示某个commit之后的所有变动,其"提交说明"必须符合搜索条件
$ git log [tag] HEAD --grep feature
# 显示某个文件的版本历史,包括文件改名
$ git log --follow [file]
$ git whatchanged [file]
# 显示指定文件相关的每一次diff
$ git log -p [file]
# 显示过去5次提交
$ git log -5 --pretty --oneline
# 显示所有提交过的用户,按提交次数排序
$ git shortlog -sn
# 显示指定文件是什么人在什么时间修改过
$ git blame [file]
# 显示暂存区和工作区的差异
$ git diff
# 显示暂存区和上一个commit的差异
$ git diff --cached [file]
# 显示工作区与当前分支最新commit之间的差异
$ git diff HEAD
# 显示两次提交之间的差异
$ git diff [first-branch]...[second-branch]
# 显示今天你写了多少行代码
$ git diff --shortstat "@{0 day ago}"
# 显示某次提交的元数据和内容变化
$ git show [commit]
# 显示某次提交发生变化的文件
$ git show --name-only [commit]
# 显示某次提交时,某个文件的内容
$ git show [commit]:[filename]
# 显示当前分支的最近几次提交
$ git reflog
</code></pre>
<h2 id="远程同步">远程同步</h2>
<pre><code># 下载远程仓库的所有变动
$ git fetch [remote]
# 显示所有远程仓库
$ git remote -v
# 显示某个远程仓库的信息
$ git remote show [remote]
# 增加一个新的远程仓库,并命名
$ git remote add [shortname] [url]
# 取回远程仓库的变化,并与本地分支合并
$ git pull [remote] [branch]
# 上传本地指定分支到远程仓库
$ git push [remote] [branch]
# 强行推送当前分支到远程仓库,即使有冲突
$ git push [remote] --force
# 推送所有分支到远程仓库
$ git push [remote] --all
</code></pre>
<h2 id="撤销">撤销</h2>
<pre><code># 恢复暂存区的指定文件到工作区
$ git checkout [file]
# 恢复某个commit的指定文件到暂存区和工作区
$ git checkout [commit] [file]
# 恢复暂存区的所有文件到工作区
$ git checkout .
# 重置暂存区的指定文件,与上一次commit保持一致,但工作区不变
$ git reset [file]
# 重置暂存区与工作区,与上一次commit保持一致
$ git reset --hard
# 重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变
$ git reset [commit]
# 重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致
$ git reset --hard [commit]
# 重置当前HEAD为指定commit,但保持暂存区和工作区不变
$ git reset --keep [commit]
# 新建一个commit,用来撤销指定commit
# 后者的所有变化都将被前者抵消,并且应用到当前分支
$ git revert [commit]
# 暂时将未提交的变化移除,稍后再移入
$ git stash
$ git stash pop
</code></pre>
<h2 id="其他">其他</h2>
<pre><code># 生成一个可供发布的压缩包
$ git archive
</code></pre>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[MySQL查询结果按where in数组排序]]></title>
<id>https://meetabug.github.io/post/mysql-cha-xun-jie-guo-an-where-in-shu-zu-pai-xu/</id>
<link href="https://meetabug.github.io/post/mysql-cha-xun-jie-guo-an-where-in-shu-zu-pai-xu/">
</link>
<updated>2020-08-02T07:07:43.000Z</updated>
<content type="html"><![CDATA[<blockquote>
<p>在查询中,MySQL默认是order by id asc排序的,但有时候需要按照where in 的数组顺序排序,比如where in的id查询数组为[922,106,104,103],正常情况查询出来的结果顺序为[103,104,106,922],这可能不是我们想要的结果,我们期望查出来的结果顺序与where in的顺序一致,这里介绍两个方式:</p>
</blockquote>
<ul>
<li>使用find_in_set函数:</li>
</ul>
<pre><code>select * from table where id in (922,106,104,103) order by find_in_set(id,'922,106,104,103');
</code></pre>
<ul>
<li>使用order by field</li>
</ul>
<pre><code>select * from table where id in (922,106,104,103) order by field(id,922,106,104,103);
</code></pre>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[Mysql 规范设计]]></title>
<id>https://meetabug.github.io/post/mysql-gui-fan-she-ji/</id>
<link href="https://meetabug.github.io/post/mysql-gui-fan-she-ji/">
</link>
<updated>2020-08-01T15:41:30.000Z</updated>
<content type="html"><![CDATA[<h2 id="配置规范">配置规范</h2>
<ul>
<li>
<p>MySQL数据库默认使用InnoDB存储引擎。</p>
</li>
<li>
<p>保证字符集设置统一,MySQL数据库相关系统、数据库、表的字符集使都用UTF8,应用程序连接、展示等可以设置字符集的地方也都统一设置为UTF8字符集。</p>
</li>
</ul>
<blockquote>
<p>注:UTF8格式是存储不了表情类数据,需要使用UTF8MB4,可在MySQL字符集里面设置。在8.0中已经默认为UTF8MB4,可以根据公司的业务情况进行统一或者定制化设置。</p>
</blockquote>
<ul>
<li>
<p>MySQL数据库的事务隔离级别默认为RR(Repeatable-Read),建议初始化时统一设置为RC(Read-Committed)。</p>
</li>
<li>
<p>数据库中的表要合理规划,控制单表数据量,对于MySQL数据库来说,建议单表记录数控制在2000W以内。</p>
</li>
<li>
<p>MySQL实例下,数据库、表数量尽可能少;数据库一般不超过50个,每个数据库下,数据表数量一般不超过500个(包括分区表)。</p>
</li>
</ul>
<h2 id="建表规范">建表规范</h2>
<ul>
<li>
<p>InnoDB禁止使用外键约束,可以通过程序层面保证。</p>
</li>
<li>
<p>存储精确浮点数必须使用DECIMAL替代FLOAT和DOUBLE。</p>
</li>
<li>
<p>整型定义中无需定义显示宽度,比如:使用INT,而不是INT(4)。</p>
</li>
<li>
<p>不建议使用ENUM类型,可使用TINYINT来代替。</p>
</li>
<li>
<p>尽可能不使用TEXT、BLOB类型,如果必须使用,建议将过大字段或是不常用的描述型较大字段拆分到其他表中;另外,禁止用数据库存储图片或文件。</p>
</li>
<li>
<p>存储年时使用YEAR(4),不使用YEAR(2)。</p>
</li>
<li>
<p>建议字段定义为NOT NULL。</p>
</li>
</ul>
<h2 id="命名规范">命名规范</h2>
<ul>
<li>
<p>库、表、字段全部采用小写。</p>
</li>
<li>
<p>库名、表名、字段名、索引名称均使用小写字母,并以“_”分割。</p>
</li>
<li>
<p>库名、表名、字段名建议不超过12个字符。(库名、表名、字段名支持最多64个字符,但为了统一规范、易于辨识以及减少传输量,统一不超过12字符)</p>
</li>
<li>
<p>库名、表名、字段名见名知意,不需要添加注释。</p>
</li>
</ul>
<table>
<thead>
<tr>
<th>对象中文名称</th>
<th>对象英文全称</th>
<th>MySQL对象简写</th>
</tr>
</thead>
<tbody>
<tr>
<td>视图</td>
<td>view</td>
<td>view_</td>
</tr>
<tr>
<td>函数</td>
<td>function</td>
<td>func_</td>
</tr>
<tr>
<td>存储过程</td>
<td>procedure</td>
<td>proc_</td>
</tr>
<tr>
<td>触发器</td>
<td>trigger</td>
<td>trig_</td>
</tr>
<tr>
<td>普通索引</td>
<td>index</td>
<td>idx_</td>
</tr>
<tr>
<td>唯一索引</td>
<td>unique index</td>
<td>uniq_</td>
</tr>
<tr>
<td>主键索引</td>
<td>primary key</td>
<td>pk_</td>
</tr>
</tbody>
</table>
<h2 id="索引规范">索引规范</h2>
<ul>
<li>
<p>索引建议命名规则:idx_col1_col2[_colN]、uniq_col1_col2[_colN](如果字段过长建议采用缩写)。</p>
</li>
<li>
<p>索引中的字段数建议不超过5个。</p>
</li>
<li>
<p>单张表的索引个数控制在5个以内。</p>
</li>
<li>
<p>InnoDB表一般都建议有主键列,尤其在高可用集群方案中是作为必须项的。</p>
</li>
<li>
<p>建立复合索引时,优先将选择性高的字段放在前面。</p>
</li>
<li>
<p>UPDATE、DELETE语句需要根据WHERE条件添加索引。</p>
</li>
<li>
<p>不建议使用%前缀模糊查询,例如LIKE “%weibo”,无法用到索引,会导致全表扫描。</p>
</li>
<li>
<p>合理利用组合索引,例如:SELECT email,uid FROM user_email WHERE uid=xx,如果uid不是主键,可以创建组合索引idx_uid_email(uid,email)来提高查询效率。</p>
</li>
<li>
<p>避免在索引字段上使用函数,否则会导致查询时索引失效。</p>
</li>
</ul>
<h2 id="应用规范">应用规范</h2>
<ul>
<li>
<p>避免使用存储过程、触发器、自定义函数等,容易将业务逻辑和DB耦合在一起,后期做分布式方案时会成为瓶颈。</p>
</li>
<li>
<p>考虑使用UNION ALL,减少使用UNION,因为UNION ALL不去重,而少了排序操作,速度相对比UNION要快,如果没有去重的需求,优先使用UNION ALL。</p>
</li>
<li>
<p>考虑使用limit N,少用limit M,N,特别是大表或M比较大的时候。</p>
</li>
<li>
<p>减少或避免排序,如:group by语句中如果不需要排序,可以增加order by null。</p>
</li>
<li>
<p>统计表中记录数时使用COUNT(<em>),而不是COUNT(primary_key)和COUNT(1);InnoDB表避免使用COUNT(</em>)操作,计数统计实时要求较强可以使用Memcache或者Redis,非实时统计可以使用单独统计表,定时更新。</p>
</li>
<li>
<p>做字段变更操作(modify column/change column)的时候必须加上原有的注释属性,否则修改后,注释会丢失。</p>
</li>
<li>
<p>使用prepared statement可以提高性能并且避免SQL注入。</p>
</li>
<li>
<p>SQL语句中IN包含的值不应过多。</p>
</li>
<li>
<p>UPDATE、DELETE语句一定要有明确的WHERE条件。</p>
</li>
<li>
<p>WHERE条件中的字段值需要符合该字段的数据类型,避免MySQL进行隐式类型转化。</p>
</li>
<li>
<p>SELECT、INSERT语句必须显式的指明字段名称,禁止使用SELECT * 或是INSERT INTO table_name values()。</p>
</li>
<li>
<p>INSERT语句使用batch提交(INSERT INTO table_name VALUES(),(),()……),values的个数不应过多</p>
</li>
</ul>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[SQL Cheat Sheet - SQL 速查手册]]></title>
<id>https://meetabug.github.io/post/sql-cheat-sheet-sql-su-cha-shou-ce/</id>
<link href="https://meetabug.github.io/post/sql-cheat-sheet-sql-su-cha-shou-ce/">
</link>
<updated>2020-08-01T15:34:43.000Z</updated>
<content type="html"><![CDATA[<figure data-type="image" tabindex="1"><img src="https://meetabug.github.io/post-images/1596296166698.png" alt="" loading="lazy"></figure>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[HTTP 状态码]]></title>
<id>https://meetabug.github.io/post/http-zhuang-tai-ma/</id>
<link href="https://meetabug.github.io/post/http-zhuang-tai-ma/">
</link>
<updated>2020-08-01T14:30:18.000Z</updated>
<content type="html"><![CDATA[<table>
<thead>
<tr>
<th>Type</th>
<th>Reson-phrase(原因短语)</th>
<th>Note</th>
</tr>
</thead>
<tbody>
<tr>
<td>1XX</td>
<td>Informational</td>
<td>信息性状态码,表示接受的请求正在处理</td>
</tr>
<tr>
<td>2XX</td>
<td>Success</td>
<td>成功状态码,表示请求正常处理完毕</td>
</tr>
<tr>
<td>3XX</td>
<td>Redirection</td>
<td>重定向状态码,表示需要客户端需要进行附加操作</td>
</tr>
<tr>
<td>4XX</td>
<td>Client Error</td>
<td>客户端错误状态码,表示服务器无法处理请求</td>
</tr>
<tr>
<td>5XX</td>
<td>Server Error</td>
<td>服务器错误状态码,表示服务器处理请求出错</td>
</tr>
</tbody>
</table>
<table>
<thead>
<tr>
<th>状态码</th>
<th>状态码英文名称</th>
<th>中文描述</th>
</tr>
</thead>
<tbody>
<tr>
<td>100</td>
<td>Continue</td>
<td>继续。客户端应继续其请求</td>
</tr>
<tr>
<td>101</td>
<td>Switching Protocols</td>
<td>切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议</td>
</tr>
<tr>
<td>200</td>
<td>OK</td>
<td>请求成功。一般用于GET与POST请求</td>
</tr>
<tr>
<td>201</td>
<td>Created</td>
<td>已创建。成功请求并创建了新的资源</td>
</tr>
<tr>
<td>202</td>
<td>Accepted</td>
<td>已接受。已经接受请求,但未处理完成</td>
</tr>
<tr>
<td>203</td>
<td>Non-Authoritative Information</td>
<td>非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本</td>
</tr>
<tr>
<td>204</td>
<td>No Content</td>
<td>无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档</td>
</tr>
<tr>
<td>205</td>
<td>Reset Content</td>
<td>重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域</td>
</tr>
<tr>
<td>206</td>
<td>Partial Content</td>
<td>部分内容。服务器成功处理了部分GET请求</td>
</tr>
<tr>
<td>300</td>
<td>Multiple Choices</td>
<td>多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择</td>
</tr>
<tr>
<td>301</td>
<td>Moved Permanently</td>
<td>永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替</td>
</tr>
<tr>
<td>302</td>
<td>Found</td>
<td>临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI</td>
</tr>
<tr>
<td>303</td>
<td>See Other</td>
<td>查看其它地址。与301类似。使用GET和POST请求查看</td>
</tr>
<tr>
<td>304</td>
<td>Not Modified</td>
<td>未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源</td>
</tr>
<tr>
<td>305</td>
<td>Use Proxy</td>
<td>使用代理。所请求的资源必须通过代理访问</td>
</tr>
<tr>
<td>306</td>
<td>Unused</td>
<td>已经被废弃的HTTP状态码</td>
</tr>
<tr>
<td>307</td>
<td>Temporary Redirect</td>
<td>临时重定向。与302类似。使用GET请求重定向</td>
</tr>
<tr>
<td>400</td>
<td>Bad Request</td>
<td>客户端请求的语法错误,服务器无法理解</td>
</tr>
<tr>
<td>401</td>
<td>Unauthorized</td>
<td>请求要求用户的身份认证</td>
</tr>
<tr>
<td>402</td>
<td>Payment Required</td>
<td>保留,将来使用</td>
</tr>
<tr>
<td>403</td>
<td>Forbidden</td>
<td>服务器理解请求客户端的请求,但是拒绝执行此请求</td>
</tr>
<tr>
<td>404</td>
<td>Not Found</td>
<td>服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面</td>
</tr>
<tr>
<td>405</td>
<td>Method Not Allowed</td>
<td>客户端请求中的方法被禁止</td>
</tr>
<tr>
<td>406</td>