-
Notifications
You must be signed in to change notification settings - Fork 0
/
atom.xml
2111 lines (1900 loc) · 144 KB
/
atom.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"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>Ceylog Blog</title>
<subtitle>Whatever is worth doing is worth doing well.</subtitle>
<link href="/atom.xml" rel="self"/>
<link href="http://blog.wglgg.cn/"/>
<updated>2017-12-07T10:49:50.599Z</updated>
<id>http://blog.wglgg.cn/</id>
<author>
<name>ceylog</name>
</author>
<generator uri="http://hexo.io/">Hexo</generator>
<entry>
<title>JSON-SCHEMA</title>
<link href="http://blog.wglgg.cn/2017/12/07/JSON-SCHEMA/"/>
<id>http://blog.wglgg.cn/2017/12/07/JSON-SCHEMA/</id>
<published>2017-12-07T09:01:12.000Z</published>
<updated>2017-12-07T10:49:50.599Z</updated>
<content type="html"><![CDATA[<h3 id="JSON-Schema-简单使用"><a href="#JSON-Schema-简单使用" class="headerlink" title="JSON Schema 简单使用"></a>JSON Schema 简单使用</h3><p>在webservice时代开发基于SOAP协议的webservice应用经常会使用到xml,xml schema、DTD的作用非常大,可以用来约束协议中报文格式合法性;相应的在REST服务盛行的时代也JSON也扮演着重要角色,也出现了json schema这样的神器,可以定义json内容的格式类型,废话少说上代码</p>
<p>json schema<br><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><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div><div class="line">53</div><div class="line">54</div><div class="line">55</div><div class="line">56</div><div class="line">57</div><div class="line">58</div><div class="line">59</div><div class="line">60</div><div class="line">61</div><div class="line">62</div><div class="line">63</div><div class="line">64</div><div class="line">65</div><div class="line">66</div><div class="line">67</div><div class="line">68</div><div class="line">69</div><div class="line">70</div><div class="line">71</div></pre></td><td class="code"><pre><div class="line">{</div><div class="line"> "$schema": "http://json-schema.org/draft-04/schema#",</div><div class="line"> "title": "User",</div><div class="line"> "type": "object",</div><div class="line"> "properties": {</div><div class="line"> "firstName": {</div><div class="line"> "type": "string"</div><div class="line"> },</div><div class="line"> "lastName": {</div><div class="line"> "type": "string"</div><div class="line"> },</div><div class="line"> "email": {</div><div class="line"> "type": "string",</div><div class="line"> "pattern": "^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$"</div><div class="line"> },</div><div class="line"> "age": {</div><div class="line"> "type": "integer",</div><div class="line"> "minimum": 0</div><div class="line"> },</div><div class="line"> "sex": {</div><div class="line"> "type": "string",</div><div class="line"> "enum": [</div><div class="line"> "男",</div><div class="line"> "女"</div><div class="line"> ]</div><div class="line"> },</div><div class="line"> "roles": {</div><div class="line"> "type": "object",</div><div class="line"> "properties": {</div><div class="line"> "name": {</div><div class="line"> "type": "string"</div><div class="line"> },</div><div class="line"> "code": {</div><div class="line"> "type": [</div><div class="line"> "string",</div><div class="line"> "integer"</div><div class="line"> ]</div><div class="line"> }</div><div class="line"> },</div><div class="line"> "required": [</div><div class="line"> "code"</div><div class="line"> ]</div><div class="line"> },</div><div class="line"> "permissions": {</div><div class="line"> "type": "array",</div><div class="line"> "minItems": 1,</div><div class="line"> "items": {</div><div class="line"> "type": "object",</div><div class="line"> "properties": {</div><div class="line"> "name": {</div><div class="line"> "type": "string"</div><div class="line"> },</div><div class="line"> "code": {</div><div class="line"> "type": [</div><div class="line"> "integer",</div><div class="line"> "string"</div><div class="line"> ]</div><div class="line"> }</div><div class="line"> },</div><div class="line"> "required": [</div><div class="line"> "code"</div><div class="line"> ]</div><div class="line"> }</div><div class="line"> }</div><div class="line"> },</div><div class="line"> "required": [</div><div class="line"> "firstName",</div><div class="line"> "age",</div><div class="line"> "permissions"</div><div class="line"> ]</div><div class="line">}</div></pre></td></tr></table></figure></p>
<p>json </p>
<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><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div></pre></td><td class="code"><pre><div class="line">{</div><div class="line"> "firstName": "abcd",</div><div class="line"> "lastName": "adfads",</div><div class="line"> "sex": "男",</div><div class="line"> "email": "[email protected]",</div><div class="line"> "roles": {</div><div class="line"> "name": "ddd"</div><div class="line"> },</div><div class="line"> "permissions": [</div><div class="line"> {</div><div class="line"> "name": "dddd"</div><div class="line"> },</div><div class="line"> {</div><div class="line"> "name": "aaaa",</div><div class="line"> "code": "dddf"</div><div class="line"> }</div><div class="line"> ]</div><div class="line">}</div></pre></td></tr></table></figure>
<p>pom.xml</p>
<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></pre></td><td class="code"><pre><div class="line"><dependency></div><div class="line"> <groupId>com.github.java-json-tools</groupId></div><div class="line"> <artifactId>json-schema-validator</artifactId></div><div class="line"> <version>2.2.8</version></div><div class="line"></dependency></div></pre></td></tr></table></figure>
<p>java 代码<br><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><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div></pre></td><td class="code"><pre><div class="line">import com.fasterxml.jackson.databind.JsonNode;</div><div class="line">import com.github.fge.jackson.JsonNodeReader;</div><div class="line">import com.github.fge.jsonschema.core.report.ProcessingMessage;</div><div class="line">import com.github.fge.jsonschema.core.report.ProcessingReport;</div><div class="line">import com.github.fge.jsonschema.main.JsonSchema;</div><div class="line">import com.github.fge.jsonschema.main.JsonSchemaFactory;</div><div class="line">import org.junit.Assert;</div><div class="line">import org.junit.Test;</div><div class="line"></div><div class="line">import java.io.InputStream;</div><div class="line">import java.util.Iterator;</div><div class="line"></div><div class="line"></div><div class="line">public class JsonSchemaTest {</div><div class="line"></div><div class="line"> @Test</div><div class="line"> public void test() throws Exception{</div><div class="line"> InputStream resourceAsStream = this.getClass().getResourceAsStream("/JsonSchema.json");</div><div class="line"> JsonNode schema = new JsonNodeReader().fromInputStream(resourceAsStream);</div><div class="line"> JsonNode json = new JsonNodeReader().fromInputStream(this.getClass().getResourceAsStream("/User.json"));</div><div class="line"> JsonSchemaFactory jsonSchemaFactory = JsonSchemaFactory.byDefault();</div><div class="line"> JsonSchema jsonSchema = jsonSchemaFactory.getJsonSchema(schema);</div><div class="line"> ProcessingReport report = jsonSchema.validate(json, true);</div><div class="line"></div><div class="line"> Iterator<ProcessingMessage> iterator = report.iterator();</div><div class="line"> while (iterator.hasNext()){</div><div class="line"> ProcessingMessage pm = iterator.next();</div><div class="line"> JsonNode jsonNode = pm.asJson();</div><div class="line"> System.out.println(jsonNode);</div><div class="line"> }</div><div class="line"> Assert.assertTrue(report.isSuccess());</div><div class="line"> }</div><div class="line">}</div></pre></td></tr></table></figure></p>
<p>输出结果<br><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></pre></td><td class="code"><pre><div class="line">{"level":"error","schema":{"loadingURI":"#","pointer":""},"instance":{"pointer":""},"domain":"validation","keyword":"required","message":"object has missing required properties ([\"age\"])","required":["age","firstName","permissions"],"missing":["age"]}</div><div class="line">{"level":"error","schema":{"loadingURI":"#","pointer":"/properties/permissions/items"},"instance":{"pointer":"/permissions/0"},"domain":"validation","keyword":"required","message":"object has missing required properties ([\"code\"])","required":["code"],"missing":["code"]}</div><div class="line">{"level":"error","schema":{"loadingURI":"#","pointer":"/properties/roles"},"instance":{"pointer":"/roles"},"domain":"validation","keyword":"required","message":"object has missing required properties ([\"code\"])","required":["code"],"missing":["code"]}</div></pre></td></tr></table></figure></p>
<p>就这样,so easy</p>
<p>###参考<br><a href="https://github.com/networknt/json-schema-validator" target="_blank" rel="external">json-schema-validator实现</a><br><a href="http://json-schema.org/" target="_blank" rel="external">json schema</a></p>
]]></content>
<summary type="html">
json schema 使用
</summary>
<category term="blog" scheme="http://blog.wglgg.cn/categories/blog/"/>
<category term="json schema" scheme="http://blog.wglgg.cn/tags/json-schema/"/>
</entry>
<entry>
<title>idea-spring-boot-devtools-not-work</title>
<link href="http://blog.wglgg.cn/2017/03/02/idea-spring-boot-devtools-not-work/"/>
<id>http://blog.wglgg.cn/2017/03/02/idea-spring-boot-devtools-not-work/</id>
<published>2017-03-02T05:25:37.000Z</published>
<updated>2017-04-07T06:51:33.601Z</updated>
<content type="html"><![CDATA[<p>java开发中总是会频繁重启应用,非常麻烦,<code>Spring Boot</code>可以利用<code>devtools</code>配置当修改代码时自动重启应用,也可以使用热部署工具<code>jrebel</code>,但是在idea下默认不生效,google后得到答案,idea不会自动编译程序,开启自动编译后发现,在应用运行中也不会自动编译,找到问题原因了,下面来解决它</p>
<h2 id="设置idea-自动编译"><a href="#设置idea-自动编译" class="headerlink" title="设置idea 自动编译"></a>设置idea 自动编译</h2><p>Settings..<br><img src="/images/intellij_idea/idea_auto_compile.png" alt="开启自动编译"></p>
<h2 id="设置idea-在程序运行中自动编译"><a href="#设置idea-在程序运行中自动编译" class="headerlink" title="设置idea 在程序运行中自动编译"></a>设置idea 在程序运行中自动编译</h2><p>快捷键 ctrl + alt + shift + / 选择Registry<br><img src="/images/intellij_idea/ctrl_shift_xie_registry.png" alt="打开设置"><br>勾选compiler.automake.allow.when.app.running<br><img src="/images/intellij_idea/enable_compile_when_app_running.png" alt="勾选compile_when_app_running"></p>
<h2 id="Spring-Boot-配置"><a href="#Spring-Boot-配置" class="headerlink" title="Spring Boot 配置"></a>Spring Boot 配置</h2><p>pom.xml<br><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><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div></pre></td><td class="code"><pre><div class="line"><dependencies></div><div class="line"> ...</div><div class="line"> <dependency></div><div class="line"> <groupId>org.springframework.boot</groupId></div><div class="line"> <artifactId>spring-boot-devtools</artifactId></div><div class="line"> <optional>true</optional></div><div class="line"> </dependency></div><div class="line"></dependencies></div><div class="line"><build></div><div class="line"> <plugins></div><div class="line"> ...</div><div class="line"> <plugin></div><div class="line"> <groupId>org.springframework.boot</groupId></div><div class="line"> <artifactId>spring-boot-maven-plugin</artifactId></div><div class="line"> <configuration></div><div class="line"> <fork>true</fork></div><div class="line"> </configuration></div><div class="line"> </plugin></div><div class="line"> </plugins></div><div class="line"></build></div></pre></td></tr></table></figure></p>
<p>重启应用,就可以了</p>
]]></content>
<summary type="html">
<p>java开发中总是会频繁重启应用,非常麻烦,<code>Spring Boot</code>可以利用<code>devtools</code>配置当修改代码时自动重启应用,也可以使用热部署工具<code>jrebel</code>,但是在idea下默认不生效,google后
</summary>
<category term="devtools" scheme="http://blog.wglgg.cn/categories/devtools/"/>
<category term="spring-boot" scheme="http://blog.wglgg.cn/tags/spring-boot/"/>
<category term="idea" scheme="http://blog.wglgg.cn/tags/idea/"/>
<category term="devtools" scheme="http://blog.wglgg.cn/tags/devtools/"/>
</entry>
<entry>
<title>msys2-here-context-menu-items</title>
<link href="http://blog.wglgg.cn/2017/02/28/msys2-here-context-menu-items/"/>
<id>http://blog.wglgg.cn/2017/02/28/msys2-here-context-menu-items/</id>
<published>2017-02-28T04:03:13.000Z</published>
<updated>2017-04-07T06:51:33.613Z</updated>
<content type="html"><![CDATA[<h2 id="register-reg"><a href="#register-reg" class="headerlink" title="register.reg"></a>register.reg</h2><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></pre></td><td class="code"><pre><div class="line">Windows Registry Editor Version 5.00</div><div class="line"></div><div class="line">[HKEY_CURRENT_USER\Software\Classes\Directory\Background\shell\MSYS here\command]</div><div class="line">@="C:\\msys64\\msys2.exe bash"</div><div class="line"></div><div class="line">[HKEY_CURRENT_USER\Software\Classes\Directory\Background\shell\MINGW64 here\command]</div><div class="line">@="C:\\msys64\\mingw64.exe bash"</div><div class="line"></div><div class="line">[HKEY_CURRENT_USER\Software\Classes\Directory\Background\shell\MINGW32 here\command]</div><div class="line">@="C:\\msys64\\mingw32.exe bash"</div></pre></td></tr></table></figure>
<h2 id="unregister-reg"><a href="#unregister-reg" class="headerlink" title="unregister.reg"></a>unregister.reg</h2><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></pre></td><td class="code"><pre><div class="line">Windows Registry Editor Version 5.00</div><div class="line"></div><div class="line">[-HKEY_CURRENT_USER\Software\Classes\Directory\Background\shell\MSYS here]</div><div class="line">[-HKEY_CURRENT_USER\Software\Classes\Directory\Background\shell\MINGW64 here]</div><div class="line">[-HKEY_CURRENT_USER\Software\Classes\Directory\Background\shell\MINGW32 here]</div></pre></td></tr></table></figure>]]></content>
<summary type="html">
<h2 id="register-reg"><a href="#register-reg" class="headerlink" title="register.reg"></a>register.reg</h2><figure class="highlight plain"><
</summary>
<category term="msys2" scheme="http://blog.wglgg.cn/tags/msys2/"/>
<category term="mingw" scheme="http://blog.wglgg.cn/tags/mingw/"/>
</entry>
<entry>
<title>nginx upgrade & add module</title>
<link href="http://blog.wglgg.cn/2016/12/22/nginx-upgrade/"/>
<id>http://blog.wglgg.cn/2016/12/22/nginx-upgrade/</id>
<published>2016-12-21T16:00:00.000Z</published>
<updated>2017-04-07T06:51:33.617Z</updated>
<content type="html"><![CDATA[<h1 id="nginx-upgrade-amp-add-module"><a href="#nginx-upgrade-amp-add-module" class="headerlink" title="nginx upgrade & add module"></a>nginx upgrade & add module</h1><h2 id="目标"><a href="#目标" class="headerlink" title="目标"></a>目标</h2><ul>
<li>升级nginx版本 1.10.1 –> 1.10.2</li>
<li>添加缓存模块</li>
<li>添加文件上传模块和上传进度模块</li>
</ul>
<h2 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h2><h3 id="查看-nginx-已安装模块"><a href="#查看-nginx-已安装模块" class="headerlink" title="查看 nginx 已安装模块"></a>查看 nginx 已安装模块</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">$nginx -V</div><div class="line">--prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-file-aio --with-threads --with-ipv6 --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_ssl_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic'</div></pre></td></tr></table></figure>
<h3 id="备份原nginx"><a href="#备份原nginx" class="headerlink" title="备份原nginx"></a>备份原nginx</h3><h3 id="下载新版本的nginx和需要添加的模块并解压"><a href="#下载新版本的nginx和需要添加的模块并解压" class="headerlink" title="下载新版本的nginx和需要添加的模块并解压"></a>下载新版本的nginx和需要添加的模块并解压</h3><h4 id="下载nginx-1-10-2"><a href="#下载nginx-1-10-2" class="headerlink" title="下载nginx 1.10.2"></a>下载nginx 1.10.2</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">$wget http://nginx.org/download/nginx-1.10.2.tar.gz</div></pre></td></tr></table></figure>
<h4 id="下载-nginx-upload-module"><a href="#下载-nginx-upload-module" class="headerlink" title="下载 nginx-upload-module"></a>下载 nginx-upload-module</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">$wget https://codeload.github.com/vkholodkov/nginx-upload-module/tar.gz/2.2.0</div></pre></td></tr></table></figure>
<h4 id="下载-nginx-upload-progress-module"><a href="#下载-nginx-upload-progress-module" class="headerlink" title="下载 nginx-upload-progress-module"></a>下载 nginx-upload-progress-module</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">$wget https://github.com/masterzen/nginx-upload-progress-module/archive/v0.9.2.tar.gz</div></pre></td></tr></table></figure>
<h4 id="下载-ngx-cache-purge"><a href="#下载-ngx-cache-purge" class="headerlink" title="下载 ngx_cache_purge"></a>下载 ngx_cache_purge</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">$wget https://codeload.github.com/FRiCKLE/ngx_cache_purge/tar.gz/2.3</div></pre></td></tr></table></figure>
<h4 id="解压"><a href="#解压" class="headerlink" title="解压"></a>解压</h4><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></pre></td><td class="code"><pre><div class="line">$ tar zxf nginx-1.10.2.tar.gz</div><div class="line">$ tar zxf nginx-upload-module-2.2.0.tar.gz</div><div class="line">$ tar zxf nginx-upload-progress-module.tar.gz</div><div class="line">$ tar zxf ngx_cache_purge-2.3.tar.gz</div></pre></td></tr></table></figure>
<h2 id="升级并添加新模块"><a href="#升级并添加新模块" class="headerlink" title="升级并添加新模块"></a>升级并添加新模块</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-file-aio --with-threads --with-ipv6 --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_ssl_module --add-module=/root/nginxinstall/nginx-upload-module-2.0.12 --add-module=/root/nginxinstall/nginx-upload-progress-module-82b35fc --add-module=/root/nginxinstall/ngx_cache_purge-2.3 --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic'</div></pre></td></tr></table></figure>
]]></content>
<summary type="html">
<h1 id="nginx-upgrade-amp-add-module"><a href="#nginx-upgrade-amp-add-module" class="headerlink" title="nginx upgrade &amp; add module"></a>
</summary>
<category term="nginx" scheme="http://blog.wglgg.cn/categories/nginx/"/>
<category term="nginx" scheme="http://blog.wglgg.cn/tags/nginx/"/>
</entry>
<entry>
<title>osx 常用开发工具</title>
<link href="http://blog.wglgg.cn/2016/09/10/osx-dev-tools/"/>
<id>http://blog.wglgg.cn/2016/09/10/osx-dev-tools/</id>
<published>2016-09-09T16:00:00.000Z</published>
<updated>2017-04-07T06:51:33.621Z</updated>
<content type="html"><![CDATA[<h2 id="ZSH"><a href="#ZSH" class="headerlink" title="ZSH"></a>ZSH</h2><h3 id="install"><a href="#install" class="headerlink" title="install"></a>install</h3><pre><code>sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
</code></pre><h2 id="homebrew"><a href="#homebrew" class="headerlink" title="homebrew"></a>homebrew</h2><h3 id="install-1"><a href="#install-1" class="headerlink" title="install"></a>install</h3><pre><code>/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
</code></pre><h2 id="iterm2"><a href="#iterm2" class="headerlink" title="iterm2"></a>iterm2</h2><h3 id="install-2"><a href="#install-2" class="headerlink" title="install"></a>install</h3><pre><code>brew cask install iterm2
</code></pre><h2 id="dev-tool"><a href="#dev-tool" class="headerlink" title="dev tool"></a>dev tool</h2><h3 id="mysql"><a href="#mysql" class="headerlink" title="mysql"></a>mysql</h3><h4 id="install-3"><a href="#install-3" class="headerlink" title="install"></a>install</h4><pre><code>brew install mysql
</code></pre><h4 id="start"><a href="#start" class="headerlink" title="start"></a>start</h4><pre><code>mysql.server start
</code></pre><h3 id="redis"><a href="#redis" class="headerlink" title="redis"></a>redis</h3><h4 id="install-4"><a href="#install-4" class="headerlink" title="install"></a>install</h4><pre><code>brew install redis
==> Downloading https://homebrew.bintray.com/bottles/redis-3.2.3.el_capitan.bottle.tar.gz
curl: (7) Failed to connect to akamai.bintray.com port 443: Operation timed out
Error: Failed to download resource "redis"
Download failed: https://homebrew.bintray.com/bottles/redis-3.2.3.el_capitan.bottle.tar.gz
Warning: Bottle installation failed: building from source.
==> Using the sandbox
==> Downloading http://download.redis.io/releases/redis-3.2.3.tar.gz
==> Downloading from http://101.44.1.117/files/B22400000598F419/download.redis.io/releases/redis-3.2.3.tar.gz
######################################################################## 100.0%
==> make install PREFIX=/usr/local/Cellar/redis/3.2.3 CC=clang
==> Caveats
To have launchd start redis now and restart at login:
brew services start redis
Or, if you don't want/need a background service you can just run:
redis-server /usr/local/etc/redis.conf
==> Summary
🍺 /usr/local/Cellar/redis/3.2.3: 10 files, 1.7M, built in 13 seconds
</code></pre><h4 id="start-1"><a href="#start-1" class="headerlink" title="start"></a>start</h4><pre><code>brew services start redis
</code></pre><h3 id="JDK"><a href="#JDK" class="headerlink" title="JDK"></a>JDK</h3><h4 id="install-5"><a href="#install-5" class="headerlink" title="install"></a>install</h4><pre><code>brew cask install java
java -version
java version "1.8.0_102"
Java(TM) SE Runtime Environment (build 1.8.0_102-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.102-b14, mixed mode)
</code></pre><h3 id="maven"><a href="#maven" class="headerlink" title="maven"></a>maven</h3><h4 id="install-6"><a href="#install-6" class="headerlink" title="install"></a>install</h4><pre><code>brew cask install maven
mvn -v
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T00:41:47+08:00)
Maven home: /usr/local/Cellar/maven/3.3.9/libexec
Java version: 1.8.0_102, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk1.8.0_102.jdk/Contents/Home/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "mac os x", version: "10.11.6", arch: "x86_64", family: "mac"
</code></pre><h3 id="gradle"><a href="#gradle" class="headerlink" title="gradle"></a>gradle</h3><h4 id="install-7"><a href="#install-7" class="headerlink" title="install"></a>install</h4><pre><code>brew cask install gradle
gradle -v
------------------------------------------------------------
Gradle 3.0
------------------------------------------------------------
Build time: 2016-08-15 13:15:01 UTC
Revision: ad76ba00f59ecb287bd3c037bd25fc3df13ca558
Groovy: 2.4.7
Ant: Apache Ant(TM) version 1.9.6 compiled on June 29 2015
JVM: 1.8.0_102 (Oracle Corporation 25.102-b14)
OS: Mac OS X 10.11.6 x86_64
</code></pre><h3 id="groovy"><a href="#groovy" class="headerlink" title="groovy"></a>groovy</h3><h4 id="install-8"><a href="#install-8" class="headerlink" title="install"></a>install</h4><pre><code>brew cask install groovy
</code></pre><h3 id="cask"><a href="#cask" class="headerlink" title="cask"></a>cask</h3><p>cask 可以安装很多软件、例如<code>jdk</code>,<code>maven</code>, <code>groovy</code>, <code>macDown</code>, <code>idea</code> 等等一系列软件都可以通过<code>cask</code>安装</p>
]]></content>
<summary type="html">
osx 常用开发工具 技巧 整理
</summary>
<category term="blog" scheme="http://blog.wglgg.cn/categories/blog/"/>
<category term="osx" scheme="http://blog.wglgg.cn/tags/osx/"/>
<category term="tool" scheme="http://blog.wglgg.cn/tags/tool/"/>
<category term="zsh" scheme="http://blog.wglgg.cn/tags/zsh/"/>
<category term="homebrew" scheme="http://blog.wglgg.cn/tags/homebrew/"/>
<category term="brew" scheme="http://blog.wglgg.cn/tags/brew/"/>
<category term="iterm2" scheme="http://blog.wglgg.cn/tags/iterm2/"/>
</entry>
<entry>
<title>服务器小脚本尝试</title>
<link href="http://blog.wglgg.cn/2016/03/30/server-bash/"/>
<id>http://blog.wglgg.cn/2016/03/30/server-bash/</id>
<published>2016-03-29T16:00:00.000Z</published>
<updated>2017-04-07T06:51:33.644Z</updated>
<content type="html"><![CDATA[<p>###备份MySQL数据库</p>
<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></pre></td><td class="code"><pre><div class="line">#!/bin/bash</div><div class="line"></div><div class="line">mysqldump -uroot -proot cswebsite > /root/cswebsite_`date +%Y%m%d%H%M%S`.sql</div></pre></td></tr></table></figure>
<p>###备份tomcat 应用</p>
<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><div class="line">14</div><div class="line">15</div><div class="line">16</div></pre></td><td class="code"><pre><div class="line">#!/bin/bash</div><div class="line"></div><div class="line">echo "shutdown tomcat.."</div><div class="line"></div><div class="line">/root/tomcat8/bin/shutdown.sh</div><div class="line"></div><div class="line">echo "begin backup stillone..."</div><div class="line"></div><div class="line">tar -zcvf /root/backup/stillone_`date +%Y%m%d%H%M%S`.tar.gz /root/tomcat8/webapps/ROOT --exclude=Files --exclude=uploadFiles</div><div class="line"></div><div class="line">echo ""</div><div class="line">echo ""</div><div class="line">echo ""</div><div class="line">echo -e "\033[32;49;1m backup stillone done! have fun!! \033[39;49;0m"</div><div class="line">echo ""</div><div class="line">echo ""</div></pre></td></tr></table></figure>
<h3 id="筛选nginx日志访问量IP排名top1000-http-状态码403-请求路径-v2-sms-send"><a href="#筛选nginx日志访问量IP排名top1000-http-状态码403-请求路径-v2-sms-send" class="headerlink" title="筛选nginx日志访问量IP排名top1000(http 状态码403 请求路径/v2/sms/send)"></a>筛选nginx日志访问量IP排名top1000(http 状态码403 请求路径/v2/sms/send)</h3><pre><code>awk '{if($9=="403" && $7=="/v2/sms/send") print $1}' /usr/local/tomcat/nginx-log/api.credan.com.log | sort | uniq -c | sort -nr -k1|head -n 1000
</code></pre>]]></content>
<summary type="html">
服务器维护脚本 tomcat 应用备份操作 数据库备份操作
</summary>
<category term="blog" scheme="http://blog.wglgg.cn/categories/blog/"/>
</entry>
<entry>
<title>redis 整理(六)ZSet 类型</title>
<link href="http://blog.wglgg.cn/2015/03/04/redis-datatype-zset/"/>
<id>http://blog.wglgg.cn/2015/03/04/redis-datatype-zset/</id>
<published>2015-03-03T16:00:00.000Z</published>
<updated>2017-04-07T06:51:33.634Z</updated>
<content type="html"><![CDATA[<h2 id="zset-类型简介"><a href="#zset-类型简介" class="headerlink" title="zset 类型简介"></a>zset 类型简介</h2><p>zset全称为sorted-sets类型,和set数据类型有极为相似,都是字符串的集合,都不允许重复的成员<br>出现在一个set中.两者的主要区别是zset的每一个成员都会有一个分数(score)与之关联.redis正是通过分数来为集合中的成员进行从小到大的排序.zset的成员是唯一的,但分数(score)却可以重复.<br>在zset中添加、删除或更新一个成员都是非常快速的操作,其时间复杂度为集合中成员数量的对数.</p>
<p>Sorted-Sets中的成员在集合中的位置是有序的.</p>
<h2 id="zset-操作"><a href="#zset-操作" class="headerlink" title="zset 操作"></a>zset 操作</h2><h3 id="1-zadd"><a href="#1-zadd" class="headerlink" title="1. zadd"></a>1. zadd</h3><p>命令格式: zadd key score member [[score] [member] …]</p>
<p>描述:将一个或多个 member 元素及其 score 值加入到有序集 key 当中.如果某个 member 已经是有序集的成员,那么更新这个 member 的 score 值,并通过重新插入这个 member 元素,来保证该 member 在正确的位置上。score 值可以是整数值或双精度浮点数。如果 key 不存在,则创建一个空的有序集并执行 ZADD 操作。当 key 存在但不是有序集类型时,返回一个错误。</p>
<p>时间复杂度: O(M*log(N)), N 是有序集的基数, M 为成功添加的新成员的数量</p>
<p>返回值:被成功添加的新成员的数量,不包括那些被更新的、已经存在的成员。</p>
<p>添加一个元素</p>
<pre><code>127.0.0.1:6379[1]> zadd zset_list 11 test1
(integer) 1
</code></pre><p>添加多个元素</p>
<pre><code>127.0.0.1:6379[1]> zadd zset_list 1 test2 2 test3
(integer) 2
</code></pre><p>查看元素</p>
<pre><code>127.0.0.1:6379[1]> zrange zset_list 0 -1
1) "test2"
2) "test3"
3) "test1"
</code></pre><p>查看元素带score值</p>
<pre><code>127.0.0.1:6379[1]> zrange zset_list 0 -1 withscores
1) "test2"
2) "1"
3) "test3"
4) "2"
5) "test1"
6) "11"
</code></pre><p>添加已存在元素,且 score 值不变 操作不成功返回0</p>
<pre><code>127.0.0.1:6379[1]> zadd zset_list 11 test1
(integer) 0
127.0.0.1:6379[1]> zrange zset_list 0 -1 withscores
1) "test2"
2) "1"
3) "test3"
4) "2"
5) "test1"
6) "11"
</code></pre><p>添加已存在元素,但是改变 score 值</p>
<pre><code>127.0.0.1:6379[1]> zrange zset_list 0 -1 withscores
1) "test2"
2) "1"
3) "test3"
4) "2"
5) "test1"
6) "3"
</code></pre><h3 id="zrem"><a href="#zrem" class="headerlink" title="zrem"></a>zrem</h3><p>命令格式: ZREM key member [member …]</p>
<p>描述:移除有序集 key 中的一个或多个成员,不存在的成员将被忽略。当 key 存在但不是有序集类型时,返回一个错误。</p>
<p>时间复杂度:O(M*log(N)), N 为有序集的基数, M 为被成功移除的成员的数量。</p>
<p>返回值:被成功移除的成员的数量,不包括被忽略的成员。</p>
<p>移除单个元素</p>
<pre><code>127.0.0.1:6379[1]> zrange zset_list 0 -1 withscores
1) "test2"
2) "1"
3) "test3"
4) "2"
5) "test1"
6) "3"
127.0.0.1:6379[1]> zrem zset_list test1
(integer) 1
127.0.0.1:6379[1]> zrange zset_list 0 -1 withscores
1) "test2"
2) "1"
3) "test3"
4) "2"
</code></pre><p>移除多个</p>
<pre><code>127.0.0.1:6379[1]> zrange zset_list 0 -1 withscores
1) "test2"
2) "1"
3) "test3"
4) "2"
127.0.0.1:6379[1]> zrem zset_list test2 test3
(integer) 2
127.0.0.1:6379[1]> zrange zset_list 0 -1 withscores
(empty list or set)
</code></pre><p>移除不存在元素</p>
<pre><code>127.0.0.1:6379[1]> zrange zset_list 0 -1 withscores
(empty list or set)
127.0.0.1:6379[1]> zrem zset_list test2
(integer) 0
127.0.0.1:6379[1]> zrange zset_list 0 -1 withscores
(empty list or set)
</code></pre><h3 id="zcard"><a href="#zcard" class="headerlink" title="zcard"></a>zcard</h3><p>描述:返回zset集合的成员数</p>
<p>时间复杂度:O(1)</p>
<p>返回值:当 key 存在且是有序集(zset)类型时,返回集合内的成员数。不存在返回0。</p>
<pre><code>127.0.0.1:6379[1]> zcard zset_list
(integer) 0
127.0.0.1:6379[1]> zadd zset_list 0 test1
(integer) 1
127.0.0.1:6379[1]> zcard zset_list
(integer) 1
127.0.0.1:6379[1]> zadd zset_list 1 test2 2 test3
(integer) 2
127.0.0.1:6379[1]> zcard zset_list
(integer) 3
</code></pre><h3 id="zcount"><a href="#zcount" class="headerlink" title="zcount"></a>zcount</h3><p>命令格式:ZCOUNT key min max</p>
<p>描述:返回有序集 key 中, score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的成员的数量。</p>
<p>时间复杂度: O(log(N)+M), N 为有序集的基数, M 为值在 min 和 max 之间的元素的数量。</p>
<p>返回值:score 值在 min 和 max 之间的成员的数量。</p>
<pre><code>127.0.0.1:6379[1]> zrange zset_list 0 -1 withscores
1) "test1"
2) "0"
3) "test2"
4) "1"
5) "test3"
6) "2"
127.0.0.1:6379[1]> zcount zset_list 1 2
(integer) 2
127.0.0.1:6379[1]> zcount zset_list 0 2
(integer) 3
127.0.0.1:6379[1]> zcount zset_list 2 2
(integer) 1
</code></pre><h3 id="zscore"><a href="#zscore" class="headerlink" title="zscore"></a>zscore</h3><p>命令格式:ZSCORE key member</p>
<p>描述:返回有序集 key 中,成员 member 的 score 值。如果 member 元素不是有序集 key 的成员,或 key 不存在,返回 nil 。</p>
<p>时间复杂度:O(1)</p>
<pre><code>127.0.0.1:6379[1]> zrange zset_list 0 -1 withscores
1) "test1"
2) "0"
3) "test2"
4) "1"
5) "test3"
6) "2"
127.0.0.1:6379[1]> zscore zset_list test2
"1"
127.0.0.1:6379[1]> zscore zset_list test5
(nil)
</code></pre><h3 id="zincrby"><a href="#zincrby" class="headerlink" title="zincrby"></a>zincrby</h3><p>命令格式:ZINCRBY key increment member</p>
<p>描述:为有序集 key 的成员 member 的 score 值加上增量 increment 。</p>
<p>时间复杂度:O(log(N))</p>
<p>返回值: 返回member 成员的新 score 值,以字符串形式表示。</p>
<pre><code>127.0.0.1:6379[1]> zscore zset_list test2
"1"
127.0.0.1:6379[1]> zincrby zset_list 2 test2
"3"
127.0.0.1:6379[1]> zincrby zset_list -2 test2
"1"
</code></pre><h3 id="zrange"><a href="#zrange" class="headerlink" title="zrange"></a>zrange</h3><p>命令格式: ZRANGE key start stop [WITHSCORES]</p>
<p>描述:返回指定区间的成员。其中成员位置按 score 值递增(从小到大)来排序。 WITHSCORES选项是用来让成员和它的score值一并返回.(在前面我们已经用到过)</p>
<p>时间复杂度:O(log(N)+M), N 为有序集的基数,而 M 为结果集的基数。</p>
<p>返回值:返回指定区间的成员列表.</p>
<pre><code>127.0.0.1:6379[1]> zrange zset_list 1 2
1) "test2"
2) "test3"
127.0.0.1:6379[1]> zrange zset_list 0 2
1) "test1"
2) "test2"
3) "test3"
127.0.0.1:6379[1]> zrange zset_list 0 -1
1) "test1"
2) "test2"
3) "test3"
127.0.0.1:6379[1]> zrange zset_list 0 -1 withscores
1) "test1"
2) "0"
3) "test2"
4) "1"
5) "test3"
6) "2"
</code></pre><p>当给定区间不存在于有序集时的情况</p>
<pre><code>127.0.0.1:6379[1]> zrange zset_list 10 20
(empty list or set)
</code></pre><h3 id="zrevrange"><a href="#zrevrange" class="headerlink" title="zrevrange"></a>zrevrange</h3><p>命令格式:ZREVRANGE key start stop [WITHSCORES]</p>
<p>描述:和zrange一样使用,唯一不同是其成员位置按 score 值递减(从大到小)来排列。</p>
<pre><code>127.0.0.1:6379[1]> zrange zset_list 0 -1 withscores
1) "test1"
2) "0"
3) "test2"
4) "1"
5) "test3"
6) "2"
127.0.0.1:6379[1]> zrevrange zset_list 0 -1 withscores
1) "test3"
2) "2"
3) "test2"
4) "1"
5) "test1"
6) "0"
</code></pre><h3 id="zrangebyscore"><a href="#zrangebyscore" class="headerlink" title="zrangebyscore"></a>zrangebyscore</h3><p>命令格式:ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]</p>
<p>描述:返回有序集key中所有score值介于min与max之间(包括等于)的成员.成员按score值递增(从小到大)排列 。min 和 max 可以是 -inf 和 +inf可选limit参数指定返回结果的数量及区间。</p>
<p>时间复杂度:O(log(N)+M), N 为有序集的基数, M 为被结果集的基数。</p>
<p>返回值:指定区间内,带有 score 值(可选)的有序集成员的列表。</p>
<pre><code>127.0.0.1:6379[1]> zrangebyscore zset_list -inf +inf
1) "test1"
2) "test2"
3) "test3"
127.0.0.1:6379[1]> zrangebyscore zset_list -inf +inf withscores
1) "test1"
2) "0"
3) "test2"
4) "1"
5) "test3"
6) "2"
127.0.0.1:6379[1]> zrangebyscore zset_list 1 +inf withscores
1) "test2"
2) "1"
3) "test3"
4) "2"
</code></pre><p>显示大于2 小于等于10的成员</p>
<pre><code>127.0.0.1:6379[1]> zrangebyscore zset_list -inf +inf withscores
1) "test1"
2) "0"
3) "test2"
4) "1"
5) "test3"
6) "2"
127.0.0.1:6379[1]> zrangebyscore zset_list (1 10
1) "test3
</code></pre><p>显示条件 1 < score < 10 的成员</p>
<pre><code>127.0.0.1:6379[1]> zrangebyscore zset_list (1 (10
1) "test3"
</code></pre><h3 id="zrevrangebyscore"><a href="#zrevrangebyscore" class="headerlink" title="zrevrangebyscore"></a>zrevrangebyscore</h3><p>命令格式: zrevrangebyscore key max min [WITHSCORES] [LIMIT offset count]</p>
<p>描述:和zrangebyscore一样,唯一不同的是成员按 score 值递减(从大到小)的次序排列。</p>
<pre><code>127.0.0.1:6379[1]> zrangebyscore zset_list -inf +inf withscores
1) "test1"
2) "0"
3) "test2"
4) "1"
5) "test3"
6) "2"
127.0.0.1:6379[1]> zrevrangebyscore zset_list +inf -inf withscores
1) "test3"
2) "2"
3) "test2"
4) "1"
5) "test1"
6) "0"
</code></pre><h3 id="zrank"><a href="#zrank" class="headerlink" title="zrank"></a>zrank</h3><p>命令格式: zrank key member</p>
<p>描述:返回有序集key中成员member的排名。成员按 score 值递增(从小到大)顺序排列。排名以0开始,也就是说score 值最小的为0.</p>
<p>时间复杂度:O(log(N))</p>
<p>返回值:返回成员排名,member不存在返回nil.</p>
<pre><code>127.0.0.1:6379[1]> zrank zset_list test1
(integer) 0
</code></pre><h3 id="zrevrank"><a href="#zrevrank" class="headerlink" title="zrevrank"></a>zrevrank</h3><p>命令格式: zrevrank key member</p>
<p>描述:返回有序集key中成员member的排名。成员按 score 值递增(从大到小)顺序排列。排名以0开始,也就是说score 值最大的为0.</p>
<p>时间复杂度:O(log(N))</p>
<p>返回值:返回成员排名,member不存在返回nil.</p>
<pre><code>127.0.0.1:6379[1]> zrevrank zset_list test3
(integer) 0
</code></pre><h3 id="zremrangebyrank"><a href="#zremrangebyrank" class="headerlink" title="zremrangebyrank"></a>zremrangebyrank</h3><p>命令格式: ZREMRANGEBYRANK key start stop</p>
<p>描述:移除有序集 key 中,指定排名(rank)区间内的所有成员。区间分别以下标参数 start 和 stop 指出,包含 start 和 stop 在内。下标参数 start 和 stop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。你也可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。</p>
<p>时间复杂度:O(log(N)+M), N 为有序集的基数,而 M 为被移除成员的数量。</p>
<p>返回值:被移除成员的数量。</p>
<pre><code>127.0.0.1:6379[1]> zrange zset_list 0 -1 withscores
1) "test1"
2) "0"
3) "test2"
4) "1"
5) "test3"
6) "2"
127.0.0.1:6379[1]> zremrangebyrank zset_list 1 2
(integer) 2
127.0.0.1:6379[1]> zrange zset_list 0 -1 withscores
1) "test1"
2) "0"
</code></pre><h3 id="zremrangebyscore"><a href="#zremrangebyscore" class="headerlink" title="zremrangebyscore"></a>zremrangebyscore</h3><p>命令格式:zremrangebyscore key min max</p>
<p>描述:移除score值介于min和max之间(等于)的成员</p>
<p>时间复杂度:O(log(N)+M), N 为有序集的基数,而 M 为被移除成员的数量。</p>
<p>返回值:被移除成员的数量。</p>
<p>移除所有score在 100 到 110 内的数据</p>
<pre><code>127.0.0.1:6379[1]> zrange zset_list 0 -1 withscores
1) "test1"
2) "0"
3) "test11"
4) "100"
5) "test22"
6) "101"
127.0.0.1:6379[1]> zremrangebyscore zset_list 100 110
(integer) 2
127.0.0.1:6379[1]> zrange zset_list 0 -1 withscores
1) "test1"
2) "0"
</code></pre><h3 id="zunionstore"><a href="#zunionstore" class="headerlink" title="zunionstore"></a>zunionstore</h3><p>命令格式:ZUNIONSTORE destination numkeys key [key …] [WEIGHTS weight [weight …]] [AGGREGATE SUM|MIN|MAX]</p>
<p>描述:计算给定的一个或多个有序集的并集,其中给定 key 的数量必须以 numkeys 参数指定,并将该并集(结果集)储存到 destination 。默认情况下,结果集中某个成员的 score 值是所有给定集下该成员 score 值之 和 。</p>
<pre><code>127.0.0.1:6379[1]> zadd zset1 1 test1 2 test2
(integer) 2
127.0.0.1:6379[1]> zrange zset_list 0 -1 withscores
1) "test1"
2) "0"
127.0.0.1:6379[1]> zadd zset_list 1 test2
(integer) 1
127.0.0.1:6379[1]> zunionstore dis_set 2 zset_list zset1
(integer) 2
127.0.0.1:6379[1]> zrange dis_set 0 -1 withscores
1) "test1"
2) "1"
3) "test2"
4) "3"
127.0.0.1:6379[1]> zrange zset1 0 -1 withscores
1) "test1"
2) "1"
3) "test2"
4) "2"
127.0.0.1:6379[1]> zrange zset_list 0 -1 withscores
1) "test1"
2) "0"
3) "test2"
4) "1"
127.0.0.1:6379[1]> zadd zset_list 3 test3
(integer) 1
127.0.0.1:6379[1]> zunionstore dis_set1 2 zset_list zset1
(integer) 3
127.0.0.1:6379[1]> zrange dis_set1 0 -1 withscores
1) "test1"
2) "1"
3) "test2"
4) "3"
5) "test3"
6) "3"
</code></pre><h3 id="zinterstore"><a href="#zinterstore" class="headerlink" title="zinterstore"></a>zinterstore</h3><p>命令格式:ZINTERSTORE destination numkeys key [key …] [WEIGHTS weight [weight …]] [AGGREGATE SUM|MIN|MAX]</p>
<p>描述:计算给定的一个或多个有序集的交集。其中给定 key 的数量必须以 numkeys 参数指定,并将该交集(结果集)储存到 destination 。默认情况下,结果集中某个成员的 score 值是所有给定集下该成员 score 值之 和 。</p>
<p>时间复杂度:O(N<em>K)+O(M</em>log(M)), N 为给定 key 中基数最小的有序集, K 为给定有序集的数量, M 为结果集的基数。</p>
<p>返回值:保存到 destination 的结果集成员数。</p>
<pre><code>127.0.0.1:6379[1]> zrange zset1 0 -1 withscores
1) "test1"
2) "1"
3) "test2"
4) "2"
127.0.0.1:6379[1]> zrange zset_list 0 -1 withscores
1) "test1"
2) "0"
3) "test2"
4) "1"
5) "test3"
6) "3"
127.0.0.1:6379[1]> zinterstore dis_set2 2 zset1 zset_list
(integer) 2
127.0.0.1:6379[1]> zrange dis_set2 0 -1 withscores
1) "test1"
2) "1"
3) "test2"
4) "3"
</code></pre>]]></content>
<summary type="html">
redis 相关整理(六)ZSet 类型
</summary>
<category term="blog" scheme="http://blog.wglgg.cn/categories/blog/"/>
</entry>
<entry>
<title>redis 整理(七)key(键)的相关操作</title>
<link href="http://blog.wglgg.cn/2015/03/04/redis-key-operation/"/>
<id>http://blog.wglgg.cn/2015/03/04/redis-key-operation/</id>
<published>2015-03-03T16:00:00.000Z</published>
<updated>2017-04-07T06:51:33.642Z</updated>
<content type="html"><![CDATA[<h3 id="del"><a href="#del" class="headerlink" title="del"></a>del</h3><p>时间复杂度: String类型其时间复杂度为O(1)。 其余O(N) N表删除key数量.</p>
<p>描述:删除</p>
<p>返回值: 实际被删除的KEY数量</p>
<p>操作命令如下:</p>
<pre><code>redis 127.0.0.1:6379> del my_set_diff my_set
(integer) 2
</code></pre><h3 id="keys"><a href="#keys" class="headerlink" title="keys"></a>keys</h3><p>命令格式: keys pattern</p>
<p>描述: 获取所有匹配PATTERN参数的keys.</p>
<p>时间复杂度: O(N) 表KEY的数量.</p>
<p>返回值:匹配模式的键列表。</p>
<p>操作命令如下:</p>
<pre><code>redis 127.0.0.1:6379> keys my*
1) “my_set_2″
2) “myset2″
3) “myset5″
4) “myset”
</code></pre><h3 id="exists"><a href="#exists" class="headerlink" title="exists"></a>exists</h3><p>描述: 判断指定键是否存在。1存在,0不存在.</p>
<p>时间复杂度:O(1)</p>
<p>操作命令如下:</p>
<pre><code>redis 127.0.0.1:6379> exists myset
(integer) 1
redis 127.0.0.1:6379> exists myset9
(integer) 0
</code></pre><h3 id="move"><a href="#move" class="headerlink" title="move"></a>move</h3><p>命令格式: move key db</p>
<p>时间复杂度:O(1)</p>
<p>描述: 将当前数据库中指定的键Key移动到参数中指定的数据库中。如果该Key在目标数据库中已经存在,或者在当前数据库中并不存在,该命令将不做任何操作并返回0。redis中默认有16个数据库,默认从0开始到15。</p>
<p>返回值:成功1 否则0</p>
<h3 id="rename"><a href="#rename" class="headerlink" title="rename"></a>rename</h3><p>命令格式: rename key newkey</p>
<p>时间复杂度:O(1)</p>
<p>描述: 重命名key,key不存在将报错,如果newKey存在则直接覆盖</p>
<h3 id="renamenx"><a href="#renamenx" class="headerlink" title="renamenx"></a>renamenx</h3><p>命令格式: renamenx key newkey</p>
<p>时间复杂度:O(1)</p>
<p>描述:当newkey不存在时才重命名.</p>
<p>返回值: 成功返回1,如里newkey已经存在,返回0.</p>
<h3 id="persist"><a href="#persist" class="headerlink" title="persist"></a>persist</h3><p>命令格式:persist key</p>
<p>时间复杂度: O(1)</p>
<p>描述:移除给定key的生存时间。</p>
<p>返回值:1表示Key的过期时间被移出,0表示该Key不存在或没有过期时间。</p>
<h3 id="expire"><a href="#expire" class="headerlink" title="expire"></a>expire</h3><p>命令格式:EXPIRE key seconds</p>
<p>时间复杂度: O(1)</p>
<p>描述:为给定key设置生存时间。当key过期时,它会被自动删除</p>
<p>返回值:设置成功返回1。当key不存在或者不能为key设置生存时间,返回0。</p>
<h3 id="expireat"><a href="#expireat" class="headerlink" title="expireat"></a>expireat</h3><p>命令格式:expireat key timetamp</p>
<p>时间复杂度: O(1)</p>
<p>描述:EXPIREAT的作用和EXPIRE一样,都用于为key设置生存时间。不同在于EXPIREAT命令接受的时间参数是UNIX时间戳(unix timestamp)。</p>
<p>返回值:设置成功返回1。当key不存在或者不能为key设置生存时间,返回0。</p>
<h3 id="ttl"><a href="#ttl" class="headerlink" title="ttl"></a>ttl</h3><p>命令格式:ttl key</p>
<p>时间复杂度: O(1)</p>
<p>描述:返回给定key的剩余生存时间(time to live)(以秒为单位)。</p>
<p>返回值:key的剩余生存时间(以秒为单位)。当key不存在或没有设置生存时间时,返回-1 。</p>
<h3 id="randomkey"><a href="#randomkey" class="headerlink" title="randomkey"></a>randomkey</h3><p>时间复杂度: O(1)</p>
<p>描述:随机的返回一个Key。</p>
<p>返回值:返回的随机键,如果该数据库是空的则返回nil。</p>
<h3 id="type"><a href="#type" class="headerlink" title="type"></a>type</h3><p>命令格式:type key</p>
<p>时间复杂度: O(1)</p>
<p>描述:获取key的类型</p>
<p>返回值: 返回的字符串为string、list、set、hash和zset,如果key不存在返回none。</p>
<h3 id="dump"><a href="#dump" class="headerlink" title="dump"></a>dump</h3><p>命令格式:dump key</p>
<p>可用版本:reidis>=2.6.0</p>
<p>时间复杂度: O(1)</p>
<p>描述:序列化给定key,并返回被序列化的值,使用 RESTORE 命令可以将这个值反序列化为 Redis 键。</p>
<p>返回值: 如key不存在返回nli,否则返回被序列化的值.</p>
]]></content>
<summary type="html">
redis 相关整理(七)key(键)的相关操作
</summary>
<category term="blog" scheme="http://blog.wglgg.cn/categories/blog/"/>
</entry>
<entry>
<title>Java 重载与重写的区别</title>
<link href="http://blog.wglgg.cn/2014/08/15/java-overloading-Overriding/"/>
<id>http://blog.wglgg.cn/2014/08/15/java-overloading-Overriding/</id>
<published>2014-08-14T16:00:00.000Z</published>
<updated>2017-04-07T06:51:33.606Z</updated>
<content type="html"><![CDATA[<h2 id="重载-Overloading"><a href="#重载-Overloading" class="headerlink" title="重载(Overloading)"></a>重载(Overloading)</h2><p>(1) 方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。</p>
<p>重载Overloading是一个类中多态性的一种表现。</p>
<p>(2)Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。</p>
<p>调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性。</p>
<p>(3) 重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准。</p>
<p>下面是重载的例子:<br>package c04.answer;//这是包名<br>//这是这个程序的第一种编程方法,在main方法中先创建一个Dog类实例,然后在Dog类的构造方法中利用this关键字调用不同的bark方法。</p>
<p>不同的重载方法bark是根据其参数类型的不同而区分的。</p>
<p>//注意:除构造器以外,编译器禁止在其他任何地方中调用构造器。</p>
<pre><code>package c04.answer;
public class Dog {
Dog(){
this.bark();
}
//bark()方法是重载方法
void bark(){
System.out.println("no barking!");
this.bark("female", 3.4);
}
//注意:重载的方法的返回值都是一样的,
void bark(String m,double l) {
System.out.println("a barking dog!");
this.bark(5, "China");
}
//不能以返回值区分重载方法,而只能以“参数类型”和“类名”来区分
void bark(int a,String n) {
System.out.println("a howling dog");
}
public static void main(String[] args) {
Dog dog = new Dog();
//dog.bark(); [Page]
//dog.bark("male", "yellow");
//dog.bark(5, "China");
}
}
</code></pre><h2 id="重写(Overriding)"><a href="#重写(Overriding)" class="headerlink" title="重写(Overriding)"></a>重写(Overriding)</h2><p>(1) 父类与子类之间的多态性,对父类的函数进行重新定义。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。在Java中,子类可继承父类中的方法,而不需要重新编写相同的方法。</p>
<p>但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。</p>
<p>方法重写又称方法覆盖。</p>
<p>(2)若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。</p>
<p>如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。</p>
<p>(3)子类函数的访问修饰权限不能少于父类的;<br>下面是重写的例子:</p>
<p>概念:即调用对象方法的机制。</p>
<p>动态绑定的内幕:</p>
<p>1、编译器检查对象声明的类型和方法名,从而获取所有候选方法。试着把上例Base类的test注释掉,这时再编译就无法通过。</p>
<p>2、重载决策:编译器检查方法调用的参数类型,从上述候选方法选出唯一的那一个(其间会有隐含类型转化)。</p>
<p>如果编译器找到多于一个或者没找到,此时编译器就会报错。试着把上例Base类的test(byte b)注释掉,这时运行结果是1 1。</p>
<p>3、若方法类型为priavte static final ,java采用静态编译,编译器会准确知道该调用哪<br>个方法。</p>
<p>4、当程序运行并且使用动态绑定来调用一个方法时,那么虚拟机必须调用对象的实际类型相匹配的方法版本。</p>
<p>在例子中,b所指向的实际类型是TestOverriding,所以b.test(0)调用子类的test。</p>
<p>但是,子类并没有重写test(byte b),所以b.test((byte)0)调用的是父类的test(byte b)。</p>
<p>如果把父类的(byte b)注释掉,则通过第二步隐含类型转化为int,最终调用的是子类的test(int i)。</p>
<p>学习总结:</p>
<p>多态性是面向对象编程的一种特性,和方法无关,<br>简单说,就是同样的一个方法能够根据输入数据的不同,做出不同的处理,即方法的<br>重载——有不同的参数列表(静态多态性)</p>
<p> 而当子类继承自父类的相同方法,输入数据一样,但要做出有别于父类的响应时,你就要覆盖父类方法,</p>
<p>即在子类中重写该方法——相同参数,不同实现(动态多态性)</p>
<p>OOP三大特性:继承,多态,封装。</p>
<pre><code>public class Base {
void test(int i) {
System.out.print(i);
}
void test(byte b){
System.out.print(b);
}
}
public class TestOverriding extends Base {
void test(int i) {
i++;
System.out.println(i);
}
public static void main(String[]agrs) {
Base b=new TestOverriding();
b.test(0)
b.test((byte)0)
}
}
</code></pre><p>这时的输出结果是1 0,这是运行时动态绑定的结果。</p>
<p>重写的主要优点是能够定义某个子类特有的特征:</p>
<pre><code>public class Father{
public void speak(){
System.out.println(Father);
}
}
public class SonextendsFather{
public void speak(){
System.out.println("son");
}
}
</code></pre><p>这也叫做多态性,重写方法只能存在于具有继承关系中,重写方法只能重写父类非私有的方法。</p>
<p>当上例中Father类speak()方法被private时,Son类不能重写出Father类speak()方法,此时Son类speak()方法相当与在Son类中定义的一个speak()方法。</p>
<p>Father类speak()方法一但被final时,无论该方法被public,protected及默认所修饰时,Son类根本不能重写Father类speak()方法,</p>
<p>试图编译代码时,编译器会报错。例:</p>
<pre><code>public class Father{
final public void speak(){
System.out.println("Father");
}
}
public class SonextendsFather{
public void speak(){
System.out.println("son");
}
}//编译器会报错;
</code></pre><p>Father类speak()方法被默认修饰时,只能在同一包中,被其子类被重写,如果不在同一包则不能重写。</p>
<p>Father类speak()方法被protoeted时,不仅在同一包中,被其子类被重写,还可以不同包的子类重写。</p>
<p>重写方法的规则:</p>
<p>1、参数列表必须完全与被重写的方法相同,否则不能称其为重写而是重载。</p>
<p>2、返回的类型必须一直与被重写的方法的返回类型相同,否则不能称其为重写而是重载。</p>
<p>3、访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private)</p>
<p>4、重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常。例如:</p>
<p>父类的一个方法申明了一个检查异常IOException,在重写这个方法是就不能抛出Exception,只能抛出IOException的子类异常,可以抛出非检查异常。</p>
<p>而重载的规则:</p>
<p>1、必须具有不同的参数列表;</p>
<p>2、可以有不责骂的返回类型,只要参数列表不同就可以了;</p>
<p>3、可以有不同的访问修饰符;</p>
<p>4、可以抛出不同的异常;</p>
<p>重写与重载的区别在于:</p>
<p>重写多态性起作用,对调用被重载过的方法可以大大减少代码的输入量,同一个方法名只要往里面传递不同的参数就可以拥有不同的功能或返回值。</p>
<p>用好重写和重载可以设计一个结构清晰而简洁的类,可以说重写和重载在编写代码过程中的作用非同一般.</p>
<p>(来源:博客园)</p>
]]></content>
<summary type="html">
Java 重载与重写的区别
</summary>
<category term="blog" scheme="http://blog.wglgg.cn/categories/blog/"/>
</entry>
<entry>
<title>Java中关于Map的九大问题</title>
<link href="http://blog.wglgg.cn/2014/08/14/java-map-9-problems/"/>
<id>http://blog.wglgg.cn/2014/08/14/java-map-9-problems/</id>
<published>2014-08-13T16:00:00.000Z</published>
<updated>2017-04-07T06:51:33.604Z</updated>
<content type="html"><![CDATA[<p>通常来说,Map是一个由键值对组成的数据结构,且在集合中每个键是唯一的。下面就以K和V来代表键和值,来说明一下java中关于Map的九大问题。</p>
<h2 id="1、将Map转换为List类型"><a href="#1、将Map转换为List类型" class="headerlink" title="1、将Map转换为List类型"></a>1、将Map转换为List类型</h2><p>在java中Map接口提供了三种集合获取方式:Key set,,value set, and key-value set.。它们都可以通过构造方法或者addAll()方法来转换为List类型。下面代码就说明了如何从Map中构造ArrayList:</p>
<pre><code>// key list
List keyList = new ArrayList(map.keySet());
// value list
List valueList = new ArrayList(map.valueSet());
// key-value list
List entryList = new ArrayList(map.entrySet());
</code></pre><h2 id="2、通过Entry-遍历Map"><a href="#2、通过Entry-遍历Map" class="headerlink" title="2、通过Entry 遍历Map"></a>2、通过Entry 遍历Map</h2><p>java中这种以键值对存在的方式被称为Map.Entry。Map.entrySet()返回的是一个key-value 集合,这是一种非常高效的遍历方式。</p>
<pre><code>for(Entry entry: map.entrySet()) {
// get key
K key = entry.getKey();
// get value
V value = entry.getValue();
}
</code></pre><p>Iterator 我们也经常用到,尤其是在JDK1.5以前</p>
<pre><code>Iterator itr = map.entrySet().iterator();
while(itr.hasNext()) {
Entry entry = itr.next();
// get key
K key = entry.getKey();
// get value
V value = entry.getValue();
}
</code></pre><h2 id="3、通过Key来对Map排序"><a href="#3、通过Key来对Map排序" class="headerlink" title="3、通过Key来对Map排序"></a>3、通过Key来对Map排序</h2><p>排序需要对Map的ke进行频繁的操作,一种方式就是通过比较器(comparator )来实现:</p>
<pre><code>List list = new ArrayList(map.entrySet());
Collections.sort(list, new Comparator() {
@Override
public int compare(Entry e1, Entry e2) {
return e1.getKey().compareTo(e2.getKey());
}
});
</code></pre><p>另外一种方法就是通过SortedMap,但必须要实现Comparable接口。</p>
<pre><code>SortedMap sortedMap = new TreeMap(new Comparator() {
@Override
public int compare(K k1, K k2) {
return k1.compareTo(k2);
}
});
sortedMap.putAll(map);
</code></pre><h2 id="4、对value对Map进行排序"><a href="#4、对value对Map进行排序" class="headerlink" title="4、对value对Map进行排序"></a>4、对value对Map进行排序</h2><p>这与上一点有些类似,代码如下:</p>
<pre><code>List list = new ArrayList(map.entrySet());
Collections.sort(list, new Comparator() {
@Override
public int compare(Entry e1, Entry e2) {
return e1.getValue().compareTo(e2.getValue());
}
});
</code></pre><h2 id="5、初始化一个static-的常量Map"><a href="#5、初始化一个static-的常量Map" class="headerlink" title="5、初始化一个static 的常量Map"></a>5、初始化一个static 的常量Map</h2><p>当你希望创建一个全局静态Map的时候,我们有以下两种方式,而且是线程安全的。<br>而在Test1中,我们虽然声明了map是静态的,但是在初始化时,我们依然可以改变它的值,就像Test1.map.put(3,”three”);<br>在Test2中,我们通过一个内部类,将其设置为不可修改,那么当我们运行Test2.map.put(3,”three”)的时候,它就会抛出一个UnsupportedOperationException 异常来禁止你修改。<br> public class Test1 {<br> private static final Map map;<br> static {<br> map = new HashMap();<br> map.put(1, “one”);<br> map.put(2, “two”);<br> }<br> }</p>
<pre><code>public class Test2 {
private static final Map map;
static {
Map aMap = new HashMap();
aMap.put(1, “one”);
aMap.put(2, “two”);
map = Collections.unmodifiableMap(aMap);
}
}
</code></pre><h2 id="6、HashMap-TreeMap-and-Hashtable之间的不同"><a href="#6、HashMap-TreeMap-and-Hashtable之间的不同" class="headerlink" title="6、HashMap, TreeMap, and Hashtable之间的不同"></a>6、HashMap, TreeMap, and Hashtable之间的不同</h2><p>在Map接口中,共有三种实现:HashMap,TreeMap,Hashtable。</p>
<p>它们之间各有不同,详细内容请参考《 HashMap vs. TreeMap vs. Hashtable vs. LinkedHashMap》一文。</p>
<h2 id="6、Map中的反向查询"><a href="#6、Map中的反向查询" class="headerlink" title="6、Map中的反向查询"></a>6、Map中的反向查询</h2><p>我们在Map添加一个键值对后,意味着这在Map中键和值是一一对应的,一个键就是对应一个值。但是有时候我们需要反向查询,比如通过某一个值来查找它的键,这种数据结构被称为bidirectional map,遗憾的是JDK并没有对其支持。</p>
<p>Apache和Guava 共同提供了这种bidirectional map实现,它在实现中它规定了键和值都是必须是1:1的关系。</p>
<h2 id="7、对Map的复制"><a href="#7、对Map的复制" class="headerlink" title="7、对Map的复制"></a>7、对Map的复制</h2><p>java中提供了很多方法都可以实现对一个Map的复制,但是那些方法不见得会时时同步。简单说,就是一个Map发生的变化,而复制的那个依然保持原样。下面是一个比较高效的实现方法:</p>
<pre><code>Map copiedMap = Collections.synchronizedMap(map);
</code></pre><p>当然还有另外一个方法,那就是克隆。但是我们的java鼻祖Josh Bloch却不推荐这种方式,他曾经在一次访谈中说过关于Map克隆的问题:在很多类中都提供了克隆的方法,因为人们确实需要。但是克隆非常有局限性,而且在很多时候造成了不必要的影响。(原文《Copy constructor versus cloning》)</p>
<h2 id="8、创建一个空的Map"><a href="#8、创建一个空的Map" class="headerlink" title="8、创建一个空的Map"></a>8、创建一个空的Map</h2><p>如果这个map被置为不可用,可以通过以下实现</p>
<pre><code>map = Collections.emptyMap();
</code></pre><p>相反,我们会用到的时候,就可以直接</p>
<pre><code>map = new HashMap();
</code></pre><p>文章源自:IT学习者</p>
]]></content>
<summary type="html">
Java中关于Map的九大问题
</summary>
<category term="blog" scheme="http://blog.wglgg.cn/categories/blog/"/>
</entry>
<entry>
<title>redis 整理(五)set 类型</title>
<link href="http://blog.wglgg.cn/2014/08/10/redis-datatype-set/"/>
<id>http://blog.wglgg.cn/2014/08/10/redis-datatype-set/</id>
<published>2014-08-09T16:00:00.000Z</published>
<updated>2017-04-07T06:51:33.629Z</updated>
<content type="html"><![CDATA[<h2 id="set-类型简介"><a href="#set-类型简介" class="headerlink" title="set 类型简介"></a>set 类型简介</h2><p>在Redis中,set是集合,和我们数学中的集合概念相似,对集合的操作有添加删除元素,有对多个几个求交并差等操作,操作中key理解为集合的名字。Redis的set是string类型的无序集合。set元素最大可以包含(2的32次方)个元素。set的十通过hash table实现的,所以添加、删除和查找的复杂度都是0(1)。hash table会随着添加或者删除自动的调整大小。需要注意的是调整hash table大小时候需要同步(获取写锁)会阻塞其他读写操作,可能不久后就会改用跳表来实现。关于set集合类型除了基本的添加删除操作,其他有用的操作还包括集合的取并集(union),交集(intersection),差集(difference)。通过这些操作可以很容易的实现sns中的好友推荐和blog的tag功能。</p>
<h2 id="set-操作"><a href="#set-操作" class="headerlink" title="set 操作"></a>set 操作</h2><h3 id="1-sadd"><a href="#1-sadd" class="headerlink" title="1. sadd"></a>1. sadd</h3><p>向名称为key的set中添加元素</p>
<pre><code>redis 127.0.0.1:6379> sadd myset "hello"
(integer) 1
redis 127.0.0.1:6379> sadd myset "world"
(integer) 1
redis 127.0.0.1:6379> sadd myset "world"
(integer) 0
redis 127.0.0.1:6379> smembers myset
1) "world"
2) "hello"
redis 127.0.0.1:6379>
</code></pre><p>本例中,我们向myset中添加了三个元素,但由于第三个元素跟第二个元素十相同的,所以第三个元素没有添加成功,最后我们用smembers来查看myset中的所有元素。</p>
<h3 id="2-srem"><a href="#2-srem" class="headerlink" title="2. srem"></a>2. srem</h3><p>删除名称为key的set中的元素member</p>
<pre><code>redis 127.0.0.1:6379> sadd myset2 "one"
(integer) 1
redis 127.0.0.1:6379> sadd myset2 "two"
(integer) 1
redis 127.0.0.1:6379> sadd myset2 "three"
(integer) 1
redis 127.0.0.1:6379> srem myset2 "one"
(integer) 1
redis 127.0.0.1:6379> srem myset2 "four"
(integer) 0
redis 127.0.0.1:6379> smembers myset2
1) "three"
2) "two"
redis 127.0.0.1:6379>
</code></pre><p>本例中,我们向myset2中添加了三个元素后,再调用srem来删除one和four,但由于元素中没有four,所以,词条srem命令执行失败。</p>
<h3 id="3-spop"><a href="#3-spop" class="headerlink" title="3. spop"></a>3. spop</h3><p>随即返回并删除名称为key的set中一个元素</p>
<pre><code>redis 127.0.0.1:6379> sadd myset3 "one"
(integer) 1
redis 127.0.0.1:6379> sadd myset3 "two"
(integer) 1
redis 127.0.0.1:6379> sadd myset3 "three"
(integer) 1
redis 127.0.0.1:6379> spop myset3
"three"
redis 127.0.0.1:6379> smembers myset3
1) "two"
2) "one"
redis 127.0.0.1:6379>
</code></pre><p>本例中,我们向myset3中添加三个元素后,在调用spop来随即删除一个元素,可以看到three元素被删除了。</p>
<h3 id="4-sdiff"><a href="#4-sdiff" class="headerlink" title="4. sdiff"></a>4. sdiff</h3><p>返回所有给定key与第一个key的差集</p>
<pre><code>redis 127.0.0.1:6379> smembers myset2
1) "three"
2) "two"
redis 127.0.0.1:6379> smembers myset3
1) "two"
2) "one"
redis 127.0.0.1:6379> sdiff myset2 myset3
1) "three"
redis 127.0.0.1:6379>
</code></pre><p>本例中,我们可以看到myset2中的元素与myset3中不同的只是three,所以只有three被查询出来,而不是three和one,因为one是myset3的元素。我们也可以将myset2和myset3换个顺序来看一下结果:</p>
<pre><code>redis 127.0.0.1:6379> sdiff myset3 myset2
1) "one"
redis 127.0.0.1:6379>
</code></pre><p>这个结果中只显示了,myset3中的元素与myset2中的不同的元素。</p>
<h3 id="5-sdiffstore"><a href="#5-sdiffstore" class="headerlink" title="5. sdiffstore"></a>5. sdiffstore</h3><p>返回所有给定key与第一个key的差集,并将结果存为另一个key</p>
<pre><code>redis 127.0.0.1:6379> smembers myset2
1) "three"
2) "two"
redis 127.0.0.1:6379> smembers myset3
1) "two"
2) "one"
redis 127.0.0.1:6379> sdiffstore myset4 myset2 myset3
(integer) 1
redis 127.0.0.1:6379> smembers myset4
1) "three"
redis 127.0.0.1:6379>
</code></pre><h3 id="6-sinter"><a href="#6-sinter" class="headerlink" title="6. sinter"></a>6. sinter</h3><p>返回所有给定key的交集</p>
<pre><code>redis 127.0.0.1:6379> smembers myset2
1) "three"
2) "two"
redis 127.0.0.1:6379> smembers myset3
1) "two"
2) "one"
redis 127.0.0.1:6379> sinter myset2 myset3
1) "two"
redis 127.0.0.1:6379>
</code></pre><p>通过本例的结果可以看出,myset2和myset3的交集two被查出来了</p>
<h3 id="7-sinterstore"><a href="#7-sinterstore" class="headerlink" title="7. sinterstore"></a>7. sinterstore</h3><p>返回所有给定key的交集,并将结果存为另一个key</p>
<pre><code>redis 127.0.0.1:6379> smembers myset2