Browse Source

Site updated: 2020-05-31 21:49:44

master
nicksxs 5 years ago
parent
commit
1f422d7f99
48 changed files with 6464 additions and 3713 deletions
  1. +3
    -3
      2014/12/24/MFC 模态对话框/index.html
  2. +1
    -1
      2014/12/30/Clone-Graph-Part-I/index.html
  3. +2
    -2
      2015/01/04/Path-Sum/index.html
  4. +1
    -1
      2015/01/14/Two-Sum/index.html
  5. +4
    -4
      2015/01/16/pcre-intro-and-a-simple-package/index.html
  6. +1
    -1
      2015/03/11/Number-Of-1-Bits/index.html
  7. +2
    -2
      2015/03/11/Reverse-Bits/index.html
  8. +1
    -1
      2015/03/13/Reverse-Integer/index.html
  9. +3
    -3
      2015/04/14/Add-Two-Number/index.html
  10. +3
    -3
      2015/04/15/Leetcode-No-3/index.html
  11. +2
    -2
      2015/06/22/invert-binary-tree/index.html
  12. +3
    -3
      2016/08/14/34-Search-for-a-Range/index.html
  13. +2
    -2
      2016/09/29/binary-watch/index.html
  14. +2
    -2
      2016/10/11/minimum-size-subarray-sum-209/index.html
  15. +2
    -2
      2016/10/12/summary-ranges-228/index.html
  16. +2
    -2
      2019/12/07/JVM-G1-Part-1/index.html
  17. +2
    -2
      2019/12/26/redis数据结构介绍/index.html
  18. +2
    -2
      2020/01/19/redis数据结构介绍四/index.html
  19. +2
    -2
      2020/01/20/redis数据结构介绍五/index.html
  20. +2
    -2
      2020/01/22/redis数据结构介绍六/index.html
  21. +2
    -2
      2020/02/09/G1收集器概述/index.html
  22. +2
    -2
      2020/03/29/echo命令的一个小技巧/index.html
  23. +2
    -2
      2020/04/12/redis系列介绍七/index.html
  24. +2
    -2
      2020/04/18/redis系列介绍八/index.html
  25. +4
    -4
      2020/04/26/聊聊-mysql-的-MVCC/index.html
  26. +4
    -4
      2020/05/02/聊聊-mysql-的-MVCC-续篇/index.html
  27. +4
    -4
      2020/05/10/聊聊-mysql-的-MVCC-续续篇之加锁分析/index.html
  28. +2
    -2
      2020/05/22/聊聊我刚学会的应用诊断方法/index.html
  29. +2
    -2
      2020/05/31/聊聊-Dubbo-的-SPI/index.html
  30. +6
    -6
      atom.xml
  31. +8
    -8
      baidusitemap.xml
  32. +132
    -140
      categories/Java/index.html
  33. +1
    -1
      css/main.css
  34. +5
    -614
      index.html
  35. +1
    -0
      leancloud.memo
  36. +1
    -1
      leancloud_counter_security_urls.json
  37. +1078
    -0
      page/10/index.html
  38. +751
    -0
      page/11/index.html
  39. +141
    -711
      page/2/index.html
  40. +135
    -727
      page/3/index.html
  41. +162
    -605
      page/4/index.html
  42. +143
    -605
      page/5/index.html
  43. +409
    -19
      page/6/index.html
  44. +1072
    -0
      page/7/index.html
  45. +1073
    -0
      page/8/index.html
  46. +1082
    -0
      page/9/index.html
  47. +14
    -14
      sitemap.xml
  48. +184
    -196
      tags/c/index.html

+ 3
- 3
2014/12/24/MFC 模态对话框/index.html View File

@ -301,16 +301,16 @@
<div class="popular-posts-title"><a href="/2015/01/16/pcre-intro-and-a-simple-package/" rel="bookmark">pcre-intro-and-a-simple-package</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2015/03/13/Reverse-Integer/" rel="bookmark">Reverse Integer</a></div>
<div class="popular-posts-title"><a href="/2015/01/14/Two-Sum/" rel="bookmark">two sum</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2015/04/15/Leetcode-No-3/" rel="bookmark">leetcode no.3</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2015/03/11/Number-Of-1-Bits/" rel="bookmark">Number of 1 Bits</a></div>
<div class="popular-posts-title"><a href="/2015/01/04/Path-Sum/" rel="bookmark">Path Sum</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2015/01/04/Path-Sum/" rel="bookmark">Path Sum</a></div>
<div class="popular-posts-title"><a href="/2015/03/11/Reverse-Bits/" rel="bookmark">Reverse Bits</a></div>
</li>
</ul>


+ 1
- 1
2014/12/30/Clone-Graph-Part-I/index.html View File

@ -300,7 +300,7 @@
<div class="popular-posts-header">Related Posts</div>
<ul class="popular-posts">
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2015/03/11/Reverse-Bits/" rel="bookmark">Reverse Bits</a></div>
<div class="popular-posts-title"><a href="/2015/03/11/Number-Of-1-Bits/" rel="bookmark">Number of 1 Bits</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2020/02/09/G1收集器概述/" rel="bookmark">G1收集器概述</a></div>


+ 2
- 2
2015/01/04/Path-Sum/index.html View File

@ -302,7 +302,7 @@
<div class="popular-posts-header">Related Posts</div>
<ul class="popular-posts">
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2015/01/14/Two-Sum/" rel="bookmark">two sum</a></div>
<div class="popular-posts-title"><a href="/2015/03/13/Reverse-Integer/" rel="bookmark">Reverse Integer</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2016/08/14/34-Search-for-a-Range/" rel="bookmark">34_Search_for_a_Range</a></div>
@ -314,7 +314,7 @@
<div class="popular-posts-title"><a href="/2015/04/15/Leetcode-No-3/" rel="bookmark">leetcode no.3</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2015/03/11/Number-Of-1-Bits/" rel="bookmark">Number of 1 Bits</a></div>
<div class="popular-posts-title"><a href="/2015/03/11/Reverse-Bits/" rel="bookmark">Reverse Bits</a></div>
</li>
</ul>


+ 1
- 1
2015/01/14/Two-Sum/index.html View File

@ -315,7 +315,7 @@
<div class="popular-posts-title"><a href="/2015/04/15/Leetcode-No-3/" rel="bookmark">leetcode no.3</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2015/03/11/Number-Of-1-Bits/" rel="bookmark">Number of 1 Bits</a></div>
<div class="popular-posts-title"><a href="/2015/01/04/Path-Sum/" rel="bookmark">Path Sum</a></div>
</li>
</ul>


+ 4
- 4
2015/01/16/pcre-intro-and-a-simple-package/index.html View File

@ -318,16 +318,16 @@
<div class="popular-posts-title"><a href="/2014/12/24/MFC 模态对话框/" rel="bookmark">MFC 模态对话框</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2015/03/11/Reverse-Bits/" rel="bookmark">Reverse Bits</a></div>
<div class="popular-posts-title"><a href="/2015/03/11/Number-Of-1-Bits/" rel="bookmark">Number of 1 Bits</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2015/04/15/Leetcode-No-3/" rel="bookmark">leetcode no.3</a></div>
<div class="popular-posts-title"><a href="/2016/08/14/34-Search-for-a-Range/" rel="bookmark">34_Search_for_a_Range</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2016/08/14/34-Search-for-a-Range/" rel="bookmark">34_Search_for_a_Range</a></div>
<div class="popular-posts-title"><a href="/2015/04/15/Leetcode-No-3/" rel="bookmark">leetcode no.3</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2015/03/11/Number-Of-1-Bits/" rel="bookmark">Number of 1 Bits</a></div>
<div class="popular-posts-title"><a href="/2015/01/04/Path-Sum/" rel="bookmark">Path Sum</a></div>
</li>
</ul>


+ 1
- 1
2015/03/11/Number-Of-1-Bits/index.html View File

@ -299,7 +299,7 @@
<div class="popular-posts-header">Related Posts</div>
<ul class="popular-posts">
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2015/01/14/Two-Sum/" rel="bookmark">two sum</a></div>
<div class="popular-posts-title"><a href="/2015/03/13/Reverse-Integer/" rel="bookmark">Reverse Integer</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2016/08/14/34-Search-for-a-Range/" rel="bookmark">34_Search_for_a_Range</a></div>


+ 2
- 2
2015/03/11/Reverse-Bits/index.html View File

@ -300,7 +300,7 @@
<div class="popular-posts-header">Related Posts</div>
<ul class="popular-posts">
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2015/01/14/Two-Sum/" rel="bookmark">two sum</a></div>
<div class="popular-posts-title"><a href="/2015/03/13/Reverse-Integer/" rel="bookmark">Reverse Integer</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2016/08/14/34-Search-for-a-Range/" rel="bookmark">34_Search_for_a_Range</a></div>
@ -312,7 +312,7 @@
<div class="popular-posts-title"><a href="/2015/04/15/Leetcode-No-3/" rel="bookmark">leetcode no.3</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2015/03/11/Number-Of-1-Bits/" rel="bookmark">Number of 1 Bits</a></div>
<div class="popular-posts-title"><a href="/2015/01/04/Path-Sum/" rel="bookmark">Path Sum</a></div>
</li>
</ul>


+ 1
- 1
2015/03/13/Reverse-Integer/index.html View File

@ -315,7 +315,7 @@
<div class="popular-posts-title"><a href="/2015/04/15/Leetcode-No-3/" rel="bookmark">leetcode no.3</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2015/03/11/Number-Of-1-Bits/" rel="bookmark">Number of 1 Bits</a></div>
<div class="popular-posts-title"><a href="/2015/01/04/Path-Sum/" rel="bookmark">Path Sum</a></div>
</li>
</ul>


+ 3
- 3
2015/04/14/Add-Two-Number/index.html View File

@ -303,7 +303,7 @@
<div class="popular-posts-header">Related Posts</div>
<ul class="popular-posts">
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2015/01/14/Two-Sum/" rel="bookmark">two sum</a></div>
<div class="popular-posts-title"><a href="/2015/03/13/Reverse-Integer/" rel="bookmark">Reverse Integer</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2016/08/14/34-Search-for-a-Range/" rel="bookmark">34_Search_for_a_Range</a></div>
@ -312,10 +312,10 @@
<div class="popular-posts-title"><a href="/2015/04/15/Leetcode-No-3/" rel="bookmark">leetcode no.3</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2015/03/11/Number-Of-1-Bits/" rel="bookmark">Number of 1 Bits</a></div>
<div class="popular-posts-title"><a href="/2015/01/04/Path-Sum/" rel="bookmark">Path Sum</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2015/01/04/Path-Sum/" rel="bookmark">Path Sum</a></div>
<div class="popular-posts-title"><a href="/2015/03/11/Reverse-Bits/" rel="bookmark">Reverse Bits</a></div>
</li>
</ul>


+ 3
- 3
2015/04/15/Leetcode-No-3/index.html View File

@ -300,7 +300,7 @@
<div class="popular-posts-header">Related Posts</div>
<ul class="popular-posts">
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2015/01/14/Two-Sum/" rel="bookmark">two sum</a></div>
<div class="popular-posts-title"><a href="/2015/03/13/Reverse-Integer/" rel="bookmark">Reverse Integer</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2016/08/14/34-Search-for-a-Range/" rel="bookmark">34_Search_for_a_Range</a></div>
@ -309,10 +309,10 @@
<div class="popular-posts-title"><a href="/2016/10/12/summary-ranges-228/" rel="bookmark">summary-ranges-228</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2015/03/11/Number-Of-1-Bits/" rel="bookmark">Number of 1 Bits</a></div>
<div class="popular-posts-title"><a href="/2015/01/04/Path-Sum/" rel="bookmark">Path Sum</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2015/01/04/Path-Sum/" rel="bookmark">Path Sum</a></div>
<div class="popular-posts-title"><a href="/2015/03/11/Reverse-Bits/" rel="bookmark">Reverse Bits</a></div>
</li>
</ul>


+ 2
- 2
2015/06/22/invert-binary-tree/index.html View File

@ -309,7 +309,7 @@
<div class="popular-posts-header">Related Posts</div>
<ul class="popular-posts">
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2015/03/13/Reverse-Integer/" rel="bookmark">Reverse Integer</a></div>
<div class="popular-posts-title"><a href="/2015/01/14/Two-Sum/" rel="bookmark">two sum</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2016/08/14/34-Search-for-a-Range/" rel="bookmark">34_Search_for_a_Range</a></div>
@ -321,7 +321,7 @@
<div class="popular-posts-title"><a href="/2015/04/15/Leetcode-No-3/" rel="bookmark">leetcode no.3</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2015/03/11/Number-Of-1-Bits/" rel="bookmark">Number of 1 Bits</a></div>
<div class="popular-posts-title"><a href="/2015/01/04/Path-Sum/" rel="bookmark">Path Sum</a></div>
</li>
</ul>


+ 3
- 3
2016/08/14/34-Search-for-a-Range/index.html View File

@ -301,7 +301,7 @@
<div class="popular-posts-header">Related Posts</div>
<ul class="popular-posts">
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2015/01/14/Two-Sum/" rel="bookmark">two sum</a></div>
<div class="popular-posts-title"><a href="/2015/03/13/Reverse-Integer/" rel="bookmark">Reverse Integer</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2015/04/14/Add-Two-Number/" rel="bookmark">add-two-number</a></div>
@ -310,10 +310,10 @@
<div class="popular-posts-title"><a href="/2015/04/15/Leetcode-No-3/" rel="bookmark">leetcode no.3</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2015/03/11/Number-Of-1-Bits/" rel="bookmark">Number of 1 Bits</a></div>
<div class="popular-posts-title"><a href="/2015/01/04/Path-Sum/" rel="bookmark">Path Sum</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2015/01/04/Path-Sum/" rel="bookmark">Path Sum</a></div>
<div class="popular-posts-title"><a href="/2015/03/11/Reverse-Bits/" rel="bookmark">Reverse Bits</a></div>
</li>
</ul>


+ 2
- 2
2016/09/29/binary-watch/index.html View File

@ -309,7 +309,7 @@
<div class="popular-posts-header">Related Posts</div>
<ul class="popular-posts">
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2015/03/13/Reverse-Integer/" rel="bookmark">Reverse Integer</a></div>
<div class="popular-posts-title"><a href="/2015/01/14/Two-Sum/" rel="bookmark">two sum</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2016/08/14/34-Search-for-a-Range/" rel="bookmark">34_Search_for_a_Range</a></div>
@ -321,7 +321,7 @@
<div class="popular-posts-title"><a href="/2015/04/15/Leetcode-No-3/" rel="bookmark">leetcode no.3</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2015/03/11/Number-Of-1-Bits/" rel="bookmark">Number of 1 Bits</a></div>
<div class="popular-posts-title"><a href="/2015/01/04/Path-Sum/" rel="bookmark">Path Sum</a></div>
</li>
</ul>


+ 2
- 2
2016/10/11/minimum-size-subarray-sum-209/index.html View File

@ -299,7 +299,7 @@
<div class="popular-posts-header">Related Posts</div>
<ul class="popular-posts">
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2015/03/13/Reverse-Integer/" rel="bookmark">Reverse Integer</a></div>
<div class="popular-posts-title"><a href="/2015/01/14/Two-Sum/" rel="bookmark">two sum</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2016/08/14/34-Search-for-a-Range/" rel="bookmark">34_Search_for_a_Range</a></div>
@ -311,7 +311,7 @@
<div class="popular-posts-title"><a href="/2015/04/15/Leetcode-No-3/" rel="bookmark">leetcode no.3</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2015/03/11/Number-Of-1-Bits/" rel="bookmark">Number of 1 Bits</a></div>
<div class="popular-posts-title"><a href="/2015/01/04/Path-Sum/" rel="bookmark">Path Sum</a></div>
</li>
</ul>


+ 2
- 2
2016/10/12/summary-ranges-228/index.html View File

@ -298,7 +298,7 @@
<div class="popular-posts-header">Related Posts</div>
<ul class="popular-posts">
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2015/03/13/Reverse-Integer/" rel="bookmark">Reverse Integer</a></div>
<div class="popular-posts-title"><a href="/2015/01/14/Two-Sum/" rel="bookmark">two sum</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2016/08/14/34-Search-for-a-Range/" rel="bookmark">34_Search_for_a_Range</a></div>
@ -310,7 +310,7 @@
<div class="popular-posts-title"><a href="/2015/04/15/Leetcode-No-3/" rel="bookmark">leetcode no.3</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2015/03/11/Number-Of-1-Bits/" rel="bookmark">Number of 1 Bits</a></div>
<div class="popular-posts-title"><a href="/2015/01/04/Path-Sum/" rel="bookmark">Path Sum</a></div>
</li>
</ul>


+ 2
- 2
2019/12/07/JVM-G1-Part-1/index.html View File

@ -324,10 +324,10 @@
<div class="popular-posts-title"><a href="/2020/02/09/G1收集器概述/" rel="bookmark">G1收集器概述</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2020/04/05/Comparator使用小记/" rel="bookmark">Comparator使用小记</a></div>
<div class="popular-posts-title"><a href="/2020/02/16/Maven实用小技巧/" rel="bookmark">Maven实用小技巧</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2020/02/16/Maven实用小技巧/" rel="bookmark">Maven实用小技巧</a></div>
<div class="popular-posts-title"><a href="/2020/04/05/Comparator使用小记/" rel="bookmark">Comparator使用小记</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2020/05/31/聊聊-Dubbo-的-SPI/" rel="bookmark">聊聊 Dubbo 的 SPI</a></div>


+ 2
- 2
2019/12/26/redis数据结构介绍/index.html View File

@ -331,10 +331,10 @@
<div class="popular-posts-header">Related Posts</div>
<ul class="popular-posts">
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2020/01/04/redis数据结构介绍二/" rel="bookmark">redis数据结构介绍二-第二部分 跳表</a></div>
<div class="popular-posts-title"><a href="/2020/01/10/redis数据结构介绍三/" rel="bookmark">redis数据结构介绍三-第三部分 整数集合</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2020/01/10/redis数据结构介绍三/" rel="bookmark">redis数据结构介绍三-第三部分 整数集合</a></div>
<div class="popular-posts-title"><a href="/2020/01/04/redis数据结构介绍二/" rel="bookmark">redis数据结构介绍二-第二部分 跳表</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2020/01/20/redis数据结构介绍五/" rel="bookmark">redis数据结构介绍五-第五部分 对象</a></div>


+ 2
- 2
2020/01/19/redis数据结构介绍四/index.html View File

@ -321,10 +321,10 @@
<div class="popular-posts-header">Related Posts</div>
<ul class="popular-posts">
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2020/01/04/redis数据结构介绍二/" rel="bookmark">redis数据结构介绍二-第二部分 跳表</a></div>
<div class="popular-posts-title"><a href="/2020/01/10/redis数据结构介绍三/" rel="bookmark">redis数据结构介绍三-第三部分 整数集合</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2020/01/10/redis数据结构介绍三/" rel="bookmark">redis数据结构介绍三-第三部分 整数集合</a></div>
<div class="popular-posts-title"><a href="/2020/01/04/redis数据结构介绍二/" rel="bookmark">redis数据结构介绍二-第二部分 跳表</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2020/01/20/redis数据结构介绍五/" rel="bookmark">redis数据结构介绍五-第五部分 对象</a></div>


+ 2
- 2
2020/01/20/redis数据结构介绍五/index.html View File

@ -319,10 +319,10 @@
<div class="popular-posts-header">Related Posts</div>
<ul class="popular-posts">
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2020/01/04/redis数据结构介绍二/" rel="bookmark">redis数据结构介绍二-第二部分 跳表</a></div>
<div class="popular-posts-title"><a href="/2020/01/10/redis数据结构介绍三/" rel="bookmark">redis数据结构介绍三-第三部分 整数集合</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2020/01/10/redis数据结构介绍三/" rel="bookmark">redis数据结构介绍三-第三部分 整数集合</a></div>
<div class="popular-posts-title"><a href="/2020/01/04/redis数据结构介绍二/" rel="bookmark">redis数据结构介绍二-第二部分 跳表</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2020/01/19/redis数据结构介绍四/" rel="bookmark">redis数据结构介绍四-第四部分 压缩表</a></div>


+ 2
- 2
2020/01/22/redis数据结构介绍六/index.html View File

@ -340,10 +340,10 @@
<div class="popular-posts-header">Related Posts</div>
<ul class="popular-posts">
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2020/01/04/redis数据结构介绍二/" rel="bookmark">redis数据结构介绍二-第二部分 跳表</a></div>
<div class="popular-posts-title"><a href="/2020/01/10/redis数据结构介绍三/" rel="bookmark">redis数据结构介绍三-第三部分 整数集合</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2020/01/10/redis数据结构介绍三/" rel="bookmark">redis数据结构介绍三-第三部分 整数集合</a></div>
<div class="popular-posts-title"><a href="/2020/01/04/redis数据结构介绍二/" rel="bookmark">redis数据结构介绍二-第二部分 跳表</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2020/01/20/redis数据结构介绍五/" rel="bookmark">redis数据结构介绍五-第五部分 对象</a></div>


+ 2
- 2
2020/02/09/G1收集器概述/index.html View File

@ -319,10 +319,10 @@
<div class="popular-posts-title"><a href="/2019/12/07/JVM-G1-Part-1/" rel="bookmark">JVM源码分析之G1垃圾收集器分析一</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2020/04/05/Comparator使用小记/" rel="bookmark">Comparator使用小记</a></div>
<div class="popular-posts-title"><a href="/2020/02/16/Maven实用小技巧/" rel="bookmark">Maven实用小技巧</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2020/02/16/Maven实用小技巧/" rel="bookmark">Maven实用小技巧</a></div>
<div class="popular-posts-title"><a href="/2020/04/05/Comparator使用小记/" rel="bookmark">Comparator使用小记</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2020/05/31/聊聊-Dubbo-的-SPI/" rel="bookmark">聊聊 Dubbo 的 SPI</a></div>


+ 2
- 2
2020/03/29/echo命令的一个小技巧/index.html View File

@ -317,10 +317,10 @@
<div class="popular-posts-title"><a href="/2020/03/08/docker比一般多一点的初学者介绍/" rel="bookmark">docker比一般多一点的初学者介绍</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2020/03/15/docker比一般多一点的初学者介绍二/" rel="bookmark">docker比一般多一点的初学者介绍</a></div>
<div class="popular-posts-title"><a href="/2020/03/21/docker比一般多一点的初学者介绍三/" rel="bookmark">docker比一般多一点的初学者介绍</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2020/03/21/docker比一般多一点的初学者介绍三/" rel="bookmark">docker比一般多一点的初学者介绍</a></div>
<div class="popular-posts-title"><a href="/2020/03/15/docker比一般多一点的初学者介绍二/" rel="bookmark">docker比一般多一点的初学者介绍</a></div>
</li>
</ul>


+ 2
- 2
2020/04/12/redis系列介绍七/index.html View File

@ -320,10 +320,10 @@
<div class="popular-posts-header">Related Posts</div>
<ul class="popular-posts">
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2020/01/04/redis数据结构介绍二/" rel="bookmark">redis数据结构介绍二-第二部分 跳表</a></div>
<div class="popular-posts-title"><a href="/2020/01/10/redis数据结构介绍三/" rel="bookmark">redis数据结构介绍三-第三部分 整数集合</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2020/01/10/redis数据结构介绍三/" rel="bookmark">redis数据结构介绍三-第三部分 整数集合</a></div>
<div class="popular-posts-title"><a href="/2020/01/04/redis数据结构介绍二/" rel="bookmark">redis数据结构介绍二-第二部分 跳表</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2020/01/20/redis数据结构介绍五/" rel="bookmark">redis数据结构介绍五-第五部分 对象</a></div>


+ 2
- 2
2020/04/18/redis系列介绍八/index.html View File

@ -352,10 +352,10 @@
<div class="popular-posts-header">Related Posts</div>
<ul class="popular-posts">
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2020/01/04/redis数据结构介绍二/" rel="bookmark">redis数据结构介绍二-第二部分 跳表</a></div>
<div class="popular-posts-title"><a href="/2020/01/10/redis数据结构介绍三/" rel="bookmark">redis数据结构介绍三-第三部分 整数集合</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2020/01/10/redis数据结构介绍三/" rel="bookmark">redis数据结构介绍三-第三部分 整数集合</a></div>
<div class="popular-posts-title"><a href="/2020/01/04/redis数据结构介绍二/" rel="bookmark">redis数据结构介绍二-第二部分 跳表</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2020/01/20/redis数据结构介绍五/" rel="bookmark">redis数据结构介绍五-第五部分 对象</a></div>


+ 4
- 4
2020/04/26/聊聊-mysql-的-MVCC/index.html View File

@ -252,11 +252,11 @@
</span>
,
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/Mysql/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/" itemprop="url" rel="index"><span itemprop="name">数据结构</span></a>
<a href="/categories/C/" itemprop="url" rel="index"><span itemprop="name">C</span></a>
</span>
,
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/C/" itemprop="url" rel="index"><span itemprop="name">C</span></a>
<a href="/categories/Mysql/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/" itemprop="url" rel="index"><span itemprop="name">数据结构</span></a>
</span>
,
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
@ -347,10 +347,10 @@
<div class="popular-posts-title"><a href="/2020/01/20/redis数据结构介绍五/" rel="bookmark">redis数据结构介绍五-第五部分 对象</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2020/01/04/redis数据结构介绍二/" rel="bookmark">redis数据结构介绍二-第二部分 跳表</a></div>
<div class="popular-posts-title"><a href="/2020/01/10/redis数据结构介绍三/" rel="bookmark">redis数据结构介绍三-第三部分 整数集合</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2020/01/10/redis数据结构介绍三/" rel="bookmark">redis数据结构介绍三-第三部分 整数集合</a></div>
<div class="popular-posts-title"><a href="/2020/01/04/redis数据结构介绍二/" rel="bookmark">redis数据结构介绍二-第二部分 跳表</a></div>
</li>
</ul>


+ 4
- 4
2020/05/02/聊聊-mysql-的-MVCC-续篇/index.html View File

@ -257,11 +257,11 @@
</span>
,
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/Mysql/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/" itemprop="url" rel="index"><span itemprop="name">数据结构</span></a>
<a href="/categories/C/" itemprop="url" rel="index"><span itemprop="name">C</span></a>
</span>
,
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/C/" itemprop="url" rel="index"><span itemprop="name">C</span></a>
<a href="/categories/Mysql/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/" itemprop="url" rel="index"><span itemprop="name">数据结构</span></a>
</span>
,
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
@ -339,10 +339,10 @@
<div class="popular-posts-title"><a href="/2020/01/20/redis数据结构介绍五/" rel="bookmark">redis数据结构介绍五-第五部分 对象</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2020/01/04/redis数据结构介绍二/" rel="bookmark">redis数据结构介绍二-第二部分 跳表</a></div>
<div class="popular-posts-title"><a href="/2020/01/10/redis数据结构介绍三/" rel="bookmark">redis数据结构介绍三-第三部分 整数集合</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2020/01/10/redis数据结构介绍三/" rel="bookmark">redis数据结构介绍三-第三部分 整数集合</a></div>
<div class="popular-posts-title"><a href="/2020/01/04/redis数据结构介绍二/" rel="bookmark">redis数据结构介绍二-第二部分 跳表</a></div>
</li>
</ul>


+ 4
- 4
2020/05/10/聊聊-mysql-的-MVCC-续续篇之加锁分析/index.html View File

@ -253,11 +253,11 @@
</span>
,
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/Mysql/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/" itemprop="url" rel="index"><span itemprop="name">数据结构</span></a>
<a href="/categories/C/" itemprop="url" rel="index"><span itemprop="name">C</span></a>
</span>
,
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/C/" itemprop="url" rel="index"><span itemprop="name">C</span></a>
<a href="/categories/Mysql/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/" itemprop="url" rel="index"><span itemprop="name">数据结构</span></a>
</span>
,
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
@ -340,10 +340,10 @@
<div class="popular-posts-title"><a href="/2020/01/20/redis数据结构介绍五/" rel="bookmark">redis数据结构介绍五-第五部分 对象</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2020/01/04/redis数据结构介绍二/" rel="bookmark">redis数据结构介绍二-第二部分 跳表</a></div>
<div class="popular-posts-title"><a href="/2020/01/10/redis数据结构介绍三/" rel="bookmark">redis数据结构介绍三-第三部分 整数集合</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2020/01/10/redis数据结构介绍三/" rel="bookmark">redis数据结构介绍三-第三部分 整数集合</a></div>
<div class="popular-posts-title"><a href="/2020/01/04/redis数据结构介绍二/" rel="bookmark">redis数据结构介绍二-第二部分 跳表</a></div>
</li>
</ul>


+ 2
- 2
2020/05/22/聊聊我刚学会的应用诊断方法/index.html View File

@ -317,10 +317,10 @@
<div class="popular-posts-header">Related Posts</div>
<ul class="popular-posts">
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2020/04/05/Comparator使用小记/" rel="bookmark">Comparator使用小记</a></div>
<div class="popular-posts-title"><a href="/2020/02/16/Maven实用小技巧/" rel="bookmark">Maven实用小技巧</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2020/02/16/Maven实用小技巧/" rel="bookmark">Maven实用小技巧</a></div>
<div class="popular-posts-title"><a href="/2020/04/05/Comparator使用小记/" rel="bookmark">Comparator使用小记</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2020/02/09/G1收集器概述/" rel="bookmark">G1收集器概述</a></div>


+ 2
- 2
2020/05/31/聊聊-Dubbo-的-SPI/index.html View File

@ -320,10 +320,10 @@
<div class="popular-posts-header">Related Posts</div>
<ul class="popular-posts">
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2020/04/05/Comparator使用小记/" rel="bookmark">Comparator使用小记</a></div>
<div class="popular-posts-title"><a href="/2020/02/16/Maven实用小技巧/" rel="bookmark">Maven实用小技巧</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2020/02/16/Maven实用小技巧/" rel="bookmark">Maven实用小技巧</a></div>
<div class="popular-posts-title"><a href="/2020/04/05/Comparator使用小记/" rel="bookmark">Comparator使用小记</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2020/02/09/G1收集器概述/" rel="bookmark">G1收集器概述</a></div>


+ 6
- 6
atom.xml View File

@ -153,10 +153,10 @@
<category term="Mysql" scheme="https://nicksxs.me/categories/Mysql/"/>
<category term="数据结构" scheme="https://nicksxs.me/categories/Mysql/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/"/>
<category term="C" scheme="https://nicksxs.me/categories/C/"/>
<category term="数据结构" scheme="https://nicksxs.me/categories/Mysql/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/"/>
<category term="源码" scheme="https://nicksxs.me/categories/Mysql/%E6%BA%90%E7%A0%81/"/>
<category term="Mysql" scheme="https://nicksxs.me/categories/C/Mysql/"/>
@ -202,10 +202,10 @@
<category term="Mysql" scheme="https://nicksxs.me/categories/Mysql/"/>
<category term="数据结构" scheme="https://nicksxs.me/categories/Mysql/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/"/>
<category term="C" scheme="https://nicksxs.me/categories/C/"/>
<category term="数据结构" scheme="https://nicksxs.me/categories/Mysql/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/"/>
<category term="源码" scheme="https://nicksxs.me/categories/Mysql/%E6%BA%90%E7%A0%81/"/>
<category term="Mysql" scheme="https://nicksxs.me/categories/C/Mysql/"/>
@ -251,10 +251,10 @@
<category term="Mysql" scheme="https://nicksxs.me/categories/Mysql/"/>
<category term="数据结构" scheme="https://nicksxs.me/categories/Mysql/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/"/>
<category term="C" scheme="https://nicksxs.me/categories/C/"/>
<category term="数据结构" scheme="https://nicksxs.me/categories/Mysql/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/"/>
<category term="源码" scheme="https://nicksxs.me/categories/Mysql/%E6%BA%90%E7%A0%81/"/>
<category term="Mysql" scheme="https://nicksxs.me/categories/C/Mysql/"/>


+ 8
- 8
baidusitemap.xml View File

@ -70,19 +70,19 @@
<loc>https://nicksxs.me/2019/12/10/Redis-Part-1/</loc>
<lastmod>2020-01-12</lastmod>
</url> <url>
<loc>https://nicksxs.me/2016/11/10/php-abstract-class-and-interface/</loc>
<loc>https://nicksxs.me/2016/09/29/binary-watch/</loc>
<lastmod>2020-01-12</lastmod>
</url> <url>
<loc>https://nicksxs.me/2016/09/29/binary-watch/</loc>
<loc>https://nicksxs.me/2016/11/10/php-abstract-class-and-interface/</loc>
<lastmod>2020-01-12</lastmod>
</url> <url>
<loc>https://nicksxs.me/2019/12/26/redis%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%BB%8B%E7%BB%8D/</loc>
<lastmod>2020-01-12</lastmod>
</url> <url>
<loc>https://nicksxs.me/2015/03/13/Reverse-Integer/</loc>
<loc>https://nicksxs.me/2015/04/14/Add-Two-Number/</loc>
<lastmod>2020-01-12</lastmod>
</url> <url>
<loc>https://nicksxs.me/2015/04/14/Add-Two-Number/</loc>
<loc>https://nicksxs.me/2015/03/13/Reverse-Integer/</loc>
<lastmod>2020-01-12</lastmod>
</url> <url>
<loc>https://nicksxs.me/2016/08/14/docker-mysql-cluster/</loc>
@ -91,10 +91,10 @@
<loc>https://nicksxs.me/2014/12/24/MFC%20%E6%A8%A1%E6%80%81%E5%AF%B9%E8%AF%9D%E6%A1%86/</loc>
<lastmod>2020-01-12</lastmod>
</url> <url>
<loc>https://nicksxs.me/2017/05/09/ambari-summary/</loc>
<loc>https://nicksxs.me/2019/06/18/openresty/</loc>
<lastmod>2020-01-12</lastmod>
</url> <url>
<loc>https://nicksxs.me/2019/06/18/openresty/</loc>
<loc>https://nicksxs.me/2017/05/09/ambari-summary/</loc>
<lastmod>2020-01-12</lastmod>
</url> <url>
<loc>https://nicksxs.me/2020/01/04/redis%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%BB%8B%E7%BB%8D%E4%BA%8C/</loc>
@ -130,10 +130,10 @@
<loc>https://nicksxs.me/2016/10/12/summary-ranges-228/</loc>
<lastmod>2020-01-12</lastmod>
</url> <url>
<loc>https://nicksxs.me/2017/04/25/rabbitmq-tips/</loc>
<loc>https://nicksxs.me/2015/01/04/Path-Sum/</loc>
<lastmod>2020-01-12</lastmod>
</url> <url>
<loc>https://nicksxs.me/2015/01/04/Path-Sum/</loc>
<loc>https://nicksxs.me/2017/04/25/rabbitmq-tips/</loc>
<lastmod>2020-01-12</lastmod>
</url> <url>
<loc>https://nicksxs.me/2015/03/11/Number-Of-1-Bits/</loc>


+ 132
- 140
categories/Java/index.html View File

@ -29,7 +29,7 @@
<meta name="description" content="learn from zero,技术博客,Nicksxs,史学森">
<meta property="og:type" content="website">
<meta property="og:title" content="Nicksxs&#39;s Blog">
<meta property="og:url" content="https://nicksxs.me/categories/java/index.html">
<meta property="og:url" content="https://nicksxs.me/categories/Java/index.html">
<meta property="og:site_name" content="Nicksxs&#39;s Blog">
<meta property="og:description" content="learn from zero,技术博客,Nicksxs,史学森">
<meta property="article:author" content="Nicksxs">
@ -40,7 +40,7 @@
<meta property="article:tag" content="森哥">
<meta name="twitter:card" content="summary">
<link rel="canonical" href="https://nicksxs.me/categories/java/">
<link rel="canonical" href="https://nicksxs.me/categories/Java/">
<script id="page-configurations">
@ -53,7 +53,7 @@
};
</script>
<title>Category: java | Nicksxs's Blog</title>
<title>Category: Java | Nicksxs's Blog</title>
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-61358619-1"></script>
<script>
@ -207,12 +207,115 @@
<div class="post-block">
<div class="posts-collapse">
<div class="collection-title">
<h2 class="collection-header">java
<h2 class="collection-header">Java
<small>Category</small>
</h2>
</div>
<div class="collection-year">
<span class="collection-header">2020</span>
</div>
<article itemscope itemtype="http://schema.org/Article">
<header class="post-header">
<div class="post-meta">
<time itemprop="dateCreated"
datetime="2020-05-31T21:06:13+08:00"
content="2020-05-31">
05-31
</time>
</div>
<div class="post-title">
<a class="post-title-link" href="/2020/05/31/%E8%81%8A%E8%81%8A-Dubbo-%E7%9A%84-SPI/" itemprop="url">
<span itemprop="name">聊聊 Dubbo 的 SPI</span>
</a>
</div>
</header>
</article>
<article itemscope itemtype="http://schema.org/Article">
<header class="post-header">
<div class="post-meta">
<time itemprop="dateCreated"
datetime="2020-05-22T23:26:50+08:00"
content="2020-05-22">
05-22
</time>
</div>
<div class="post-title">
<a class="post-title-link" href="/2020/05/22/%E8%81%8A%E8%81%8A%E6%88%91%E5%88%9A%E5%AD%A6%E4%BC%9A%E7%9A%84%E5%BA%94%E7%94%A8%E8%AF%8A%E6%96%AD%E6%96%B9%E6%B3%95/" itemprop="url">
<span itemprop="name">聊聊我刚学会的应用诊断方法</span>
</a>
</div>
</header>
</article>
<article itemscope itemtype="http://schema.org/Article">
<header class="post-header">
<div class="post-meta">
<time itemprop="dateCreated"
datetime="2020-04-05T21:41:41+08:00"
content="2020-04-05">
04-05
</time>
</div>
<div class="post-title">
<a class="post-title-link" href="/2020/04/05/Comparator%E4%BD%BF%E7%94%A8%E5%B0%8F%E8%AE%B0/" itemprop="url">
<span itemprop="name">Comparator使用小记</span>
</a>
</div>
</header>
</article>
<article itemscope itemtype="http://schema.org/Article">
<header class="post-header">
<div class="post-meta">
<time itemprop="dateCreated"
datetime="2020-02-16T10:39:42+08:00"
content="2020-02-16">
02-16
</time>
</div>
<div class="post-title">
<a class="post-title-link" href="/2020/02/16/Maven%E5%AE%9E%E7%94%A8%E5%B0%8F%E6%8A%80%E5%B7%A7/" itemprop="url">
<span itemprop="name">Maven实用小技巧</span>
</a>
</div>
</header>
</article>
<article itemscope itemtype="http://schema.org/Article">
<header class="post-header">
<div class="post-meta">
<time itemprop="dateCreated"
datetime="2020-02-09T20:52:02+08:00"
content="2020-02-09">
02-09
</time>
</div>
<div class="post-title">
<a class="post-title-link" href="/2020/02/09/G1%E6%94%B6%E9%9B%86%E5%99%A8%E6%A6%82%E8%BF%B0/" itemprop="url">
<span itemprop="name">G1收集器概述</span>
</a>
</div>
</header>
</article>
<div class="collection-year">
<span class="collection-header">2019</span>
</div>
@ -222,15 +325,35 @@
<div class="post-meta">
<time itemprop="dateCreated"
datetime="2019-09-23T23:40:05+08:00"
content="2019-09-23">
09-23
datetime="2019-12-21T01:03:09+08:00"
content="2019-12-21">
12-21
</time>
</div>
<div class="post-title">
<a class="post-title-link" href="/2019/09/23/AbstractQueuedSynchronizer/" itemprop="url">
<span itemprop="name">AbstractQueuedSynchronizer</span>
<a class="post-title-link" href="/2019/12/21/%E8%81%8A%E8%81%8AJava%E4%B8%AD%E7%9A%84%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F/" itemprop="url">
<span itemprop="name">聊聊Java中的单例模式</span>
</a>
</div>
</header>
</article>
<article itemscope itemtype="http://schema.org/Article">
<header class="post-header">
<div class="post-meta">
<time itemprop="dateCreated"
datetime="2019-12-07T00:54:19+08:00"
content="2019-12-07">
12-07
</time>
</div>
<div class="post-title">
<a class="post-title-link" href="/2019/12/07/JVM-G1-Part-1/" itemprop="url">
<span itemprop="name">JVM源码分析之G1垃圾收集器分析一</span>
</a>
</div>
@ -577,137 +700,6 @@
<script src="//cdn.jsdelivr.net/npm/quicklink@1/dist/quicklink.umd.js"></script>
<script>
window.addEventListener('load', () => {
quicklink({
timeout : 3000,
priority: true,
ignores : [uri => uri.includes('#'),uri => uri === 'https://nicksxs.me/categories/java/',]
});
});
</script>
<script>
function loadCount() {
var d = document, s = d.createElement('script');
s.src = 'https://nicksxs.disqus.com/count.js';
s.id = 'dsq-count-scr';
(d.head || d.body).appendChild(s);
}
// defer loading until the whole page loading is completed
window.addEventListener('load', loadCount, false);
</script>
</body>
</html>
s = document.querySelectorAll('.leancloud_visitors');
var entries = [...visitors].map(element => {
return decodeURI(element.id);
});
Counter('get', '/classes/Counter?where=' + encodeURIComponent(JSON.stringify({ url: { '$in': entries } })))
.then(response => response.json())
.then(({ results }) => {
for (let url of entries) {
let target = results.find(item => item.url === url);
leancloudSelector(url).innerText = target ? target.time : 0;
}
})
.catch(error => {
console.error('LeanCloud Counter Error', error);
});
}
let { app_id, app_key, server_url } = {"enable":true,"app_id":"ysza182Vghlqjdt7QiwGLLJy-gzGzoHsz","app_key":"s9GDqbn7gnGGkusf66YRVccw","server_url":"https://leancloud.cn","security":true};
function fetchData(api_server) {
var Counter = (method, url, data) => {
return fetch(`${api_server}/1.1${url}`, {
method,
headers: {
'X-LC-Id' : app_id,
'X-LC-Key' : app_key,
'Content-Type': 'application/json',
},
body: JSON.stringify(data)
});
};
if (CONFIG.page.isPost) {
if (CONFIG.hostname !== location.hostname) return;
addCount(Counter);
} else if (document.querySelectorAll('.post-title-link').length >= 1) {
showTime(Counter);
}
}
let api_server = app_id.slice(-9) !== '-MdYXbMMI' ? server_url : `https://${app_id.slice(0, 8).toLowerCase()}.api.lncldglobal.com`;
if (api_server) {
fetchData(api_server);
} else {
fetch('https://app-router.leancloud.cn/2/route?appId=' + app_id)
.then(response => response.json())
.then(({ api_server }) => {
fetchData('https://' + api_server);
});
}
})();
</script>
</div>
</footer>
</div>
<script src="/lib/anime.min.js"></script>
<script src="//cdn.jsdelivr.net/npm/jquery@3/dist/jquery.min.js"></script>
<script src="//cdn.jsdelivr.net/gh/fancyapps/fancybox@3/dist/jquery.fancybox.min.js"></script>
<script src="//cdn.jsdelivr.net/npm/lozad@1/dist/lozad.min.js"></script>
<script src="/lib/velocity/velocity.min.js"></script>
<script src="/lib/velocity/velocity.ui.min.js"></script>
<script src="/js/utils.js"></script>
<script src="/js/motion.js"></script>
<script src="/js/schemes/pisces.js"></script>
<script src="/js/next-boot.js"></script>
<script>
(function(){
var bp = document.createElement('script');
var curProtocol = window.location.protocol.split(':')[0];
bp.src = (curProtocol === 'https') ? 'https://zz.bdstatic.com/linksubmit/push.js' : 'http://push.zhanzhang.baidu.com/push.js';
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(bp, s);
})();
</script>
<script src="//cdn.jsdelivr.net/npm/quicklink@1/dist/quicklink.umd.js"></script>
<script>
window.addEventListener('load', () => {


+ 1
- 1
css/main.css View File

@ -1262,7 +1262,7 @@ pre .javascript .function {
}
.links-of-author a::before,
.links-of-author span.exturl::before {
background: #ff6049;
background: #5bff93;
border-radius: 50%;
content: ' ';
display: inline-block;


+ 5
- 614
index.html
File diff suppressed because it is too large
View File


+ 1
- 0
leancloud.memo View File

@ -50,4 +50,5 @@
{"title":"聊聊 mysql 的 MVCC 续续篇之锁分析","url":"/2020/05/10/聊聊-mysql-的-MVCC-续续篇之加锁分析/"},
{"title":"聊聊我理解的分布式事务","url":"/2020/05/17/聊聊我理解的分布式事务/"},
{"title":"聊聊我刚学会的应用诊断方法","url":"/2020/05/22/聊聊我刚学会的应用诊断方法/"},
{"title":"聊聊 Dubbo 的 SPI","url":"/2020/05/31/聊聊-Dubbo-的-SPI/"},
]

+ 1
- 1
leancloud_counter_security_urls.json View File

@ -1 +1 @@
[{"title":"村上春树《1Q84》读后感","url":"/2019/12/18/1Q84读后感/"},{"title":"2019年终总结","url":"/2020/02/01/2019年终总结/"},{"title":"34_Search_for_a_Range","url":"/2016/08/14/34-Search-for-a-Range/"},{"title":"AbstractQueuedSynchronizer","url":"/2019/09/23/AbstractQueuedSynchronizer/"},{"title":"add-two-number","url":"/2015/04/14/Add-Two-Number/"},{"title":"Clone Graph Part I","url":"/2014/12/30/Clone-Graph-Part-I/"},{"title":"Comparator使用小记","url":"/2020/04/05/Comparator使用小记/"},{"title":"leetcode no.3","url":"/2015/04/15/Leetcode-No-3/"},{"title":"MFC 模态对话框","url":"/2014/12/24/MFC 模态对话框/"},{"title":"Maven实用小技巧","url":"/2020/02/16/Maven实用小技巧/"},{"title":"Number of 1 Bits","url":"/2015/03/11/Number-Of-1-Bits/"},{"title":"G1收集器概述","url":"/2020/02/09/G1收集器概述/"},{"title":"Path Sum","url":"/2015/01/04/Path-Sum/"},{"title":"Redis_分布式锁","url":"/2019/12/10/Redis-Part-1/"},{"title":"Reverse Bits","url":"/2015/03/11/Reverse-Bits/"},{"title":"Reverse Integer","url":"/2015/03/13/Reverse-Integer/"},{"title":"two sum","url":"/2015/01/14/Two-Sum/"},{"title":"ambari-summary","url":"/2017/05/09/ambari-summary/"},{"title":"docker-mysql-cluster","url":"/2016/08/14/docker-mysql-cluster/"},{"title":"binary-watch","url":"/2016/09/29/binary-watch/"},{"title":"docker比一般多一点的初学者介绍","url":"/2020/03/08/docker比一般多一点的初学者介绍/"},{"title":"docker比一般多一点的初学者介绍二","url":"/2020/03/15/docker比一般多一点的初学者介绍二/"},{"title":"docker使用中发现的echo命令的一个小技巧及其他","url":"/2020/03/29/echo命令的一个小技巧/"},{"title":"gogs使用webhook部署react单页应用","url":"/2020/02/22/gogs使用webhook部署react单页应用/"},{"title":"invert-binary-tree","url":"/2015/06/22/invert-binary-tree/"},{"title":"minimum-size-subarray-sum-209","url":"/2016/10/11/minimum-size-subarray-sum-209/"},{"title":"openresty","url":"/2019/06/18/openresty/"},{"title":"docker比一般多一点的初学者介绍三","url":"/2020/03/21/docker比一般多一点的初学者介绍三/"},{"title":"pcre-intro-and-a-simple-package","url":"/2015/01/16/pcre-intro-and-a-simple-package/"},{"title":"php-abstract-class-and-interface","url":"/2016/11/10/php-abstract-class-and-interface/"},{"title":"rabbitmq-tips","url":"/2017/04/25/rabbitmq-tips/"},{"title":"C++ 指针使用中的一个小问题","url":"/2014/12/23/my-new-post/"},{"title":"redis数据结构介绍二-第二部分 跳表","url":"/2020/01/04/redis数据结构介绍二/"},{"title":"redis数据结构介绍三-第三部分 整数集合","url":"/2020/01/10/redis数据结构介绍三/"},{"title":"redis数据结构介绍五-第五部分 对象","url":"/2020/01/20/redis数据结构介绍五/"},{"title":"redis数据结构介绍四-第四部分 压缩表","url":"/2020/01/19/redis数据结构介绍四/"},{"title":"spark-little-tips","url":"/2017/03/28/spark-little-tips/"},{"title":"summary-ranges-228","url":"/2016/10/12/summary-ranges-228/"},{"title":"swoole-websocket-test","url":"/2016/07/13/swoole-websocket-test/"},{"title":"寄生虫观后感","url":"/2020/03/01/寄生虫观后感/"},{"title":"聊聊 mysql 的 MVCC 续篇","url":"/2020/05/02/聊聊-mysql-的-MVCC-续篇/"},{"title":"聊聊 Dubbo 的 SPI","url":"/2020/05/31/聊聊-Dubbo-的-SPI/"},{"title":"聊聊 mysql 的 MVCC 续续篇之锁分析","url":"/2020/05/10/聊聊-mysql-的-MVCC-续续篇之加锁分析/"},{"title":"聊聊Java中的单例模式","url":"/2019/12/21/聊聊Java中的单例模式/"},{"title":"聊聊我刚学会的应用诊断方法","url":"/2020/05/22/聊聊我刚学会的应用诊断方法/"},{"title":"聊聊 mysql 的 MVCC","url":"/2020/04/26/聊聊-mysql-的-MVCC/"},{"title":"redis数据结构介绍-第一部分 SDS,链表,字典","url":"/2019/12/26/redis数据结构介绍/"},{"title":"redis数据结构介绍六 快表","url":"/2020/01/22/redis数据结构介绍六/"},{"title":"聊聊我理解的分布式事务","url":"/2020/05/17/聊聊我理解的分布式事务/"},{"title":"redis系列介绍七-过期策略","url":"/2020/04/12/redis系列介绍七/"},{"title":"JVM源码分析之G1垃圾收集器分析一","url":"/2019/12/07/JVM-G1-Part-1/"},{"title":"redis系列介绍八-淘汰策略","url":"/2020/04/18/redis系列介绍八/"}]
[{"title":"34_Search_for_a_Range","url":"/2016/08/14/34-Search-for-a-Range/"},{"title":"add-two-number","url":"/2015/04/14/Add-Two-Number/"},{"title":"Clone Graph Part I","url":"/2014/12/30/Clone-Graph-Part-I/"},{"title":"村上春树《1Q84》读后感","url":"/2019/12/18/1Q84读后感/"},{"title":"MFC 模态对话框","url":"/2014/12/24/MFC 模态对话框/"},{"title":"AbstractQueuedSynchronizer","url":"/2019/09/23/AbstractQueuedSynchronizer/"},{"title":"leetcode no.3","url":"/2015/04/15/Leetcode-No-3/"},{"title":"Maven实用小技巧","url":"/2020/02/16/Maven实用小技巧/"},{"title":"Path Sum","url":"/2015/01/04/Path-Sum/"},{"title":"Reverse Bits","url":"/2015/03/11/Reverse-Bits/"},{"title":"Redis_分布式锁","url":"/2019/12/10/Redis-Part-1/"},{"title":"Number of 1 Bits","url":"/2015/03/11/Number-Of-1-Bits/"},{"title":"ambari-summary","url":"/2017/05/09/ambari-summary/"},{"title":"two sum","url":"/2015/01/14/Two-Sum/"},{"title":"Reverse Integer","url":"/2015/03/13/Reverse-Integer/"},{"title":"binary-watch","url":"/2016/09/29/binary-watch/"},{"title":"docker-mysql-cluster","url":"/2016/08/14/docker-mysql-cluster/"},{"title":"Comparator使用小记","url":"/2020/04/05/Comparator使用小记/"},{"title":"G1收集器概述","url":"/2020/02/09/G1收集器概述/"},{"title":"2019年终总结","url":"/2020/02/01/2019年终总结/"},{"title":"docker比一般多一点的初学者介绍","url":"/2020/03/08/docker比一般多一点的初学者介绍/"},{"title":"invert-binary-tree","url":"/2015/06/22/invert-binary-tree/"},{"title":"docker比一般多一点的初学者介绍三","url":"/2020/03/21/docker比一般多一点的初学者介绍三/"},{"title":"C++ 指针使用中的一个小问题","url":"/2014/12/23/my-new-post/"},{"title":"minimum-size-subarray-sum-209","url":"/2016/10/11/minimum-size-subarray-sum-209/"},{"title":"docker比一般多一点的初学者介绍二","url":"/2020/03/15/docker比一般多一点的初学者介绍二/"},{"title":"pcre-intro-and-a-simple-package","url":"/2015/01/16/pcre-intro-and-a-simple-package/"},{"title":"openresty","url":"/2019/06/18/openresty/"},{"title":"php-abstract-class-and-interface","url":"/2016/11/10/php-abstract-class-and-interface/"},{"title":"docker使用中发现的echo命令的一个小技巧及其他","url":"/2020/03/29/echo命令的一个小技巧/"},{"title":"rabbitmq-tips","url":"/2017/04/25/rabbitmq-tips/"},{"title":"redis数据结构介绍三-第三部分 整数集合","url":"/2020/01/10/redis数据结构介绍三/"},{"title":"redis数据结构介绍二-第二部分 跳表","url":"/2020/01/04/redis数据结构介绍二/"},{"title":"spark-little-tips","url":"/2017/03/28/spark-little-tips/"},{"title":"summary-ranges-228","url":"/2016/10/12/summary-ranges-228/"},{"title":"swoole-websocket-test","url":"/2016/07/13/swoole-websocket-test/"},{"title":"gogs使用webhook部署react单页应用","url":"/2020/02/22/gogs使用webhook部署react单页应用/"},{"title":"聊聊 Dubbo 的 SPI","url":"/2020/05/31/聊聊-Dubbo-的-SPI/"},{"title":"聊聊 mysql 的 MVCC 续篇","url":"/2020/05/02/聊聊-mysql-的-MVCC-续篇/"},{"title":"redis数据结构介绍五-第五部分 对象","url":"/2020/01/20/redis数据结构介绍五/"},{"title":"聊聊Java中的单例模式","url":"/2019/12/21/聊聊Java中的单例模式/"},{"title":"寄生虫观后感","url":"/2020/03/01/寄生虫观后感/"},{"title":"聊聊 mysql 的 MVCC 续续篇之锁分析","url":"/2020/05/10/聊聊-mysql-的-MVCC-续续篇之加锁分析/"},{"title":"redis数据结构介绍四-第四部分 压缩表","url":"/2020/01/19/redis数据结构介绍四/"},{"title":"聊聊我刚学会的应用诊断方法","url":"/2020/05/22/聊聊我刚学会的应用诊断方法/"},{"title":"聊聊 mysql 的 MVCC","url":"/2020/04/26/聊聊-mysql-的-MVCC/"},{"title":"redis数据结构介绍-第一部分 SDS,链表,字典","url":"/2019/12/26/redis数据结构介绍/"},{"title":"redis数据结构介绍六 快表","url":"/2020/01/22/redis数据结构介绍六/"},{"title":"聊聊我理解的分布式事务","url":"/2020/05/17/聊聊我理解的分布式事务/"},{"title":"redis系列介绍七-过期策略","url":"/2020/04/12/redis系列介绍七/"},{"title":"JVM源码分析之G1垃圾收集器分析一","url":"/2019/12/07/JVM-G1-Part-1/"},{"title":"redis系列介绍八-淘汰策略","url":"/2020/04/18/redis系列介绍八/"}]

+ 1078
- 0
page/10/index.html
File diff suppressed because it is too large
View File


+ 751
- 0
page/11/index.html
File diff suppressed because it is too large
View File


+ 141
- 711
page/2/index.html
File diff suppressed because it is too large
View File


+ 135
- 727
page/3/index.html
File diff suppressed because it is too large
View File


+ 162
- 605
page/4/index.html
File diff suppressed because it is too large
View File


+ 143
- 605
page/5/index.html View File

@ -204,7 +204,7 @@
<article itemscope itemtype="http://schema.org/Article" class="post-block" lang="zh-Hans">
<link itemprop="mainEntityOfPage" href="https://nicksxs.me/2015/06/22/invert-binary-tree/">
<link itemprop="mainEntityOfPage" href="https://nicksxs.me/2020/01/19/redis%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%BB%8B%E7%BB%8D%E5%9B%9B/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="image" content="/uploads/avatar.jpg">
@ -218,7 +218,7 @@
<header class="post-header">
<h2 class="post-title" itemprop="name headline">
<a href="/2015/06/22/invert-binary-tree/" class="post-title-link" itemprop="url">invert-binary-tree</a>
<a href="/2020/01/19/redis%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%BB%8B%E7%BB%8D%E5%9B%9B/" class="post-title-link" itemprop="url">redis数据结构介绍四-第四部分 压缩表</a>
</h2>
<div class="post-meta">
@ -228,27 +228,36 @@
</span>
<span class="post-meta-item-text">Posted on</span>
<time title="Created: 2015-06-22 10:29:44" itemprop="dateCreated datePublished" datetime="2015-06-22T10:29:44+08:00">2015-06-22</time>
<time title="Created: 2020-01-19 00:00:22" itemprop="dateCreated datePublished" datetime="2020-01-19T00:00:22+08:00">2020-01-19</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar-check"></i>
</span>
<span class="post-meta-item-text">Edited on</span>
<time title="Modified: 2020-01-12 21:08:26" itemprop="dateModified" datetime="2020-01-12T21:08:26+08:00">2020-01-12</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-folder"></i>
</span>
<span class="post-meta-item-text">In</span>
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/leetcode/" itemprop="url" rel="index"><span itemprop="name">leetcode</span></a>
<a href="/categories/Redis/" itemprop="url" rel="index"><span itemprop="name">Redis</span></a>
</span>
,
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/Redis/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/" itemprop="url" rel="index"><span itemprop="name">数据结构</span></a>
</span>
,
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/C/" itemprop="url" rel="index"><span itemprop="name">C</span></a>
</span>
,
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/Redis/%E6%BA%90%E7%A0%81/" itemprop="url" rel="index"><span itemprop="name">源码</span></a>
</span>
,
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/C/Redis/" itemprop="url" rel="index"><span itemprop="name">Redis</span></a>
</span>
</span>
<span id="/2015/06/22/invert-binary-tree/" class="post-meta-item leancloud_visitors" data-flag-title="invert-binary-tree" title="Views">
<span id="/2020/01/19/redis%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%BB%8B%E7%BB%8D%E5%9B%9B/" class="post-meta-item leancloud_visitors" data-flag-title="redis数据结构介绍四-第四部分 压缩表" title="Views">
<span class="post-meta-item-icon">
<i class="fa fa-eye"></i>
</span>
@ -263,8 +272,8 @@
</span>
<span class="post-meta-item-text">Disqus: </span>
<a title="disqus" href="/2015/06/22/invert-binary-tree/#disqus_thread" itemprop="discussionUrl">
<span class="post-comments-count disqus-comment-count" data-disqus-identifier="2015/06/22/invert-binary-tree/" itemprop="commentCount"></span>
<a title="disqus" href="/2020/01/19/redis%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%BB%8B%E7%BB%8D%E5%9B%9B/#disqus_thread" itemprop="discussionUrl">
<span class="post-comments-count disqus-comment-count" data-disqus-identifier="2020/01/19/redis数据结构介绍四/" itemprop="commentCount"></span>
</a>
</span>
@ -279,21 +288,19 @@
<div class="post-body" itemprop="articleBody">
<p><strong>Invert a binary tree</strong></p>
<pre><code> 4
/ \
2 7
/ \ / \
1 3 6 9</code></pre><p>to</p>
<pre><code> 4
/ \
7 2
/ \ / \
9 6 3 1</code></pre><p><strong>Trivia:</strong><br>This problem was inspired by <a href="https://twitter.com/mxcl/status/608682016205344768" target="_blank" rel="noopener">this original tweet</a> by <a href="https://twitter.com/mxcl" target="_blank" rel="noopener">Max Howell</a>:</p>
<p>在 redis 中还有一类表型数据结构叫压缩表,ziplist,它的目的是替代链表,链表是个很容易理解的数据结构,双向链表有前后指针,有带头结点的有的不带,但是链表有个比较大的问题是相对于普通的数组,它的内存不连续,碎片化的存储,内存利用效率不高,而且指针寻址相对于直接使用偏移量的话,也有一定的效率劣势,当然这不是主要的原因,ziplist 设计的主要目的是让链表的内存使用更高效</p>
<blockquote>
<p>Google: 90% of our engineers use the software you wrote (Homebrew),<br>but you can’t invert a binary tree on a whiteboard so fuck off. </p>
<p>The ziplist is a specially encoded dually linked list that is designed to be very memory efficient.<br>这是摘自 redis 源码中ziplist.c 文件的注释,也说明了原因,它的大概结构是这样子</p>
</blockquote>
<figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * Definition for a binary tree node.</span></span><br><span class="line"><span class="comment"> * struct TreeNode &#123;</span></span><br><span class="line"><span class="comment"> * int val;</span></span><br><span class="line"><span class="comment"> * TreeNode *left;</span></span><br><span class="line"><span class="comment"> * TreeNode *right;</span></span><br><span class="line"><span class="comment"> * TreeNode(int x) : val(x), left(NULL), right(NULL) &#123;&#125;</span></span><br><span class="line"><span class="comment"> * &#125;;</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span> &#123;</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> <span class="function">TreeNode* <span class="title">invertTree</span><span class="params">(TreeNode* root)</span> </span>&#123;</span><br><span class="line"> <span class="keyword">if</span>(root == <span class="literal">NULL</span>) <span class="keyword">return</span> root;</span><br><span class="line"> TreeNode* temp;</span><br><span class="line"> temp = invertTree(root-&gt;left);</span><br><span class="line"> root-&gt;left = invertTree(root-&gt;right);</span><br><span class="line"> root-&gt;right = temp;</span><br><span class="line"> <span class="keyword">return</span> root;</span><br><span class="line"> &#125;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&lt;zlbytes&gt; &lt;zltail&gt; &lt;zllen&gt; &lt;entry&gt; &lt;entry&gt; ... &lt;entry&gt; &lt;zlend&gt;</span><br></pre></td></tr></table></figure>
<p>其中<br><code>&lt;zlbytes&gt;</code>表示 ziplist 占用的字节总数,类型是uint32_t,32 位的无符号整型,当然表示的字节数也包含自己本身占用的 4 个<br><code>&lt;zltail&gt;</code> 类型也是是uint32_t,表示ziplist表中最后一项(entry)在ziplist中的偏移字节数。<code>&lt;zltail&gt;</code>的存在,使得我们可以很方便地找到最后一项(不用遍历整个ziplist),从而可以在ziplist尾端快速地执行push或pop操作。<br><code>&lt;uint16_t zllen&gt;</code> 表示ziplist 中的数据项个数,因为是 16 位,所以当数量超过所能表示的最大的数量,它的 16 位全会置为 1,但是真实的数量需要遍历整个 ziplist 才能知道<br><code>&lt;entry&gt;</code>是具体的数据项,后面解释<br><code>&lt;zlend&gt;</code> ziplist 的最后一个字节,固定是255。<br>再看一下<code>&lt;entry&gt;</code>中的具体结构,</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&lt;prevlen&gt; &lt;encoding&gt; &lt;entry-data&gt;</span><br></pre></td></tr></table></figure>
<p>首先这个<code>&lt;prevlen&gt;</code>有两种情况,一种是前面的元素的长度,如果是小于等于 253的时候就用一个uint8_t 来表示前一元素的长度,如果大于的话他将占用五个字节,第一个字节是 254,即表示这个字节已经表示不下了,需要后面的四个字节帮忙表示<br><code>&lt;encoding&gt;</code>这个就比较复杂,把源码的注释放下面先看下</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line">* |00pppppp| - 1 byte</span><br><span class="line">* String value with length less than or equal to 63 bytes (6 bits).</span><br><span class="line">* &quot;pppppp&quot; represents the unsigned 6 bit length.</span><br><span class="line">* |01pppppp|qqqqqqqq| - 2 bytes</span><br><span class="line">* String value with length less than or equal to 16383 bytes (14 bits).</span><br><span class="line">* IMPORTANT: The 14 bit number is stored in big endian.</span><br><span class="line">* |10000000|qqqqqqqq|rrrrrrrr|ssssssss|tttttttt| - 5 bytes</span><br><span class="line">* String value with length greater than or equal to 16384 bytes.</span><br><span class="line">* Only the 4 bytes following the first byte represents the length</span><br><span class="line">* up to 32^2-1. The 6 lower bits of the first byte are not used and</span><br><span class="line">* are set to zero.</span><br><span class="line">* IMPORTANT: The 32 bit number is stored in big endian.</span><br><span class="line">* |11000000| - 3 bytes</span><br><span class="line">* Integer encoded as int16_t (2 bytes).</span><br><span class="line">* |11010000| - 5 bytes</span><br><span class="line">* Integer encoded as int32_t (4 bytes).</span><br><span class="line">* |11100000| - 9 bytes</span><br><span class="line">* Integer encoded as int64_t (8 bytes).</span><br><span class="line">* |11110000| - 4 bytes</span><br><span class="line">* Integer encoded as 24 bit signed (3 bytes).</span><br><span class="line">* |11111110| - 2 bytes</span><br><span class="line">* Integer encoded as 8 bit signed (1 byte).</span><br><span class="line">* |1111xxxx| - (with xxxx between 0000 and 1101) immediate 4 bit integer.</span><br><span class="line">* Unsigned integer from 0 to 12. The encoded value is actually from</span><br><span class="line">* 1 to 13 because 0000 and 1111 can not be used, so 1 should be</span><br><span class="line">* subtracted from the encoded 4 bit value to obtain the right value.</span><br><span class="line">* |11111111| - End of ziplist special entry.</span><br></pre></td></tr></table></figure>
<p>首先如果 encoding 的前两位是 00 的话代表这个元素是个 6 位的字符串,即直接将数据保存在 encoding 中,不消耗额外的<code>&lt;entry-data&gt;</code>,如果前两位是 01 的话表示是个 14 位的字符串,如果是 10 的话表示encoding 块之后的四个字节是存放字符串类型的数据,encoding 的剩余 6 位置 0。<br>如果 encoding 的前两位是 11 的话表示这是个整型,具体的如果后两位是00的话,表示后面是个2字节的 int16_t 类型,如果是01的话,后面是个4字节的int32_t,如果是10的话后面是8字节的int64_t,如果是 11 的话后面是 3 字节的有符号整型,这些都要最后 4 位都是 0 的情况噢<br>剩下当是<code>11111110</code>时,则表示是一个1 字节的有符号数,如果是 <code>1111xxxx</code>,其中<code>xxxx</code>在0000 到 1101 表示实际的 1 到 13,为啥呢,因为 0000 前面已经用过了,而 1110 跟 1111 也都有用了。<br>看个具体的例子(上下有点对不齐,将就看)</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">[0f 00 00 00] [0c 00 00 00] [02 00] [00 f3] [02 f6] [ff]</span><br><span class="line">|**zlbytes***| |***zltail***| |*zllen*| |entry1 entry2| |zlend|</span><br></pre></td></tr></table></figure>
<p>第一部分代表整个 ziplist 有 15 个字节,zlbytes 自己占了 4 个 zltail 表示最后一个元素的偏移量,第 13 个字节起,zllen 表示有 2 个元素,第一个元素是<code>00f3</code>,00表示前一个元素长度是 0,本来前面就没元素(不过不知道这个能不能优化这一字节),然后是 f3,换成二进制就是11110011,对照上面的注释,是落在|1111xxxx|这个类型里,注意这个其实是用 0001 到 1101 也就是 1到 13 来表示 0到 12,所以 f3 应该就是 2,第一个元素是 2,第二个元素呢,02 代表前一个元素也就是刚才说的这个,占用 2 字节,f6 展开也是刚才的类型,实际是 5,ff 表示 ziplist 的结尾,所以这个 ziplist 里面是两个元素,2 跟 5</p>
</div>
@ -314,7 +321,7 @@
<article itemscope itemtype="http://schema.org/Article" class="post-block" lang="zh-Hans">
<link itemprop="mainEntityOfPage" href="https://nicksxs.me/2015/04/15/Leetcode-No-3/">
<link itemprop="mainEntityOfPage" href="https://nicksxs.me/2020/01/10/redis%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%BB%8B%E7%BB%8D%E4%B8%89/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="image" content="/uploads/avatar.jpg">
@ -328,7 +335,7 @@
<header class="post-header">
<h2 class="post-title" itemprop="name headline">
<a href="/2015/04/15/Leetcode-No-3/" class="post-title-link" itemprop="url">leetcode no.3</a>
<a href="/2020/01/10/redis%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%BB%8B%E7%BB%8D%E4%B8%89/" class="post-title-link" itemprop="url">redis数据结构介绍三-第三部分 整数集合</a>
</h2>
<div class="post-meta">
@ -338,14 +345,14 @@
</span>
<span class="post-meta-item-text">Posted on</span>
<time title="Created: 2015-04-15 13:49:00" itemprop="dateCreated datePublished" datetime="2015-04-15T13:49:00+08:00">2015-04-15</time>
<time title="Created: 2020-01-10 00:54:04" itemprop="dateCreated datePublished" datetime="2020-01-10T00:54:04+08:00">2020-01-10</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar-check"></i>
</span>
<span class="post-meta-item-text">Edited on</span>
<time title="Modified: 2020-01-12 21:08:26" itemprop="dateModified" datetime="2020-01-12T21:08:26+08:00">2020-01-12</time>
<time title="Modified: 2020-01-12 21:08:27" itemprop="dateModified" datetime="2020-01-12T21:08:27+08:00">2020-01-12</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
@ -353,222 +360,28 @@
</span>
<span class="post-meta-item-text">In</span>
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/leetcode/" itemprop="url" rel="index"><span itemprop="name">leetcode</span></a>
<a href="/categories/Redis/" itemprop="url" rel="index"><span itemprop="name">Redis</span></a>
</span>
</span>
<span id="/2015/04/15/Leetcode-No-3/" class="post-meta-item leancloud_visitors" data-flag-title="leetcode no.3" title="Views">
<span class="post-meta-item-icon">
<i class="fa fa-eye"></i>
</span>
<span class="post-meta-item-text">Views: </span>
<span class="leancloud-visitors-count"></span>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-comment"></i>
</span>
<span class="post-meta-item-text">Disqus: </span>
<a title="disqus" href="/2015/04/15/Leetcode-No-3/#disqus_thread" itemprop="discussionUrl">
<span class="post-comments-count disqus-comment-count" data-disqus-identifier="2015/04/15/Leetcode-No-3/" itemprop="commentCount"></span>
</a>
</span>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<p>*<em>Longest Substring Without Repeating Characters *</em></p>
<!--noindex-->
<div class="post-button">
<a class="btn" href="/2015/04/15/Leetcode-No-3/#more" rel="contents">
Read more &raquo;
</a>
</div>
<!--/noindex-->
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</article>
<article itemscope itemtype="http://schema.org/Article" class="post-block" lang="zh-Hans">
<link itemprop="mainEntityOfPage" href="https://nicksxs.me/2015/04/14/Add-Two-Number/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="image" content="/uploads/avatar.jpg">
<meta itemprop="name" content="Nicksxs">
<meta itemprop="description" content="learn from zero,技术博客,Nicksxs,史学森">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="Nicksxs's Blog">
</span>
<header class="post-header">
<h2 class="post-title" itemprop="name headline">
<a href="/2015/04/14/Add-Two-Number/" class="post-title-link" itemprop="url">add-two-number</a>
</h2>
<div class="post-meta">
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar"></i>
</span>
<span class="post-meta-item-text">Posted on</span>
<time title="Created: 2015-04-14 17:40:10" itemprop="dateCreated datePublished" datetime="2015-04-14T17:40:10+08:00">2015-04-14</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar-check"></i>
,
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/Redis/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/" itemprop="url" rel="index"><span itemprop="name">数据结构</span></a>
</span>
<span class="post-meta-item-text">Edited on</span>
<time title="Modified: 2020-01-12 21:08:27" itemprop="dateModified" datetime="2020-01-12T21:08:27+08:00">2020-01-12</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-folder"></i>
</span>
<span class="post-meta-item-text">In</span>
,
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/leetcode/" itemprop="url" rel="index"><span itemprop="name">leetcode</span></a>
<a href="/categories/C/" itemprop="url" rel="index"><span itemprop="name">C</span></a>
</span>
</span>
<span id="/2015/04/14/Add-Two-Number/" class="post-meta-item leancloud_visitors" data-flag-title="add-two-number" title="Views">
<span class="post-meta-item-icon">
<i class="fa fa-eye"></i>
</span>
<span class="post-meta-item-text">Views: </span>
<span class="leancloud-visitors-count"></span>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-comment"></i>
</span>
<span class="post-meta-item-text">Disqus: </span>
<a title="disqus" href="/2015/04/14/Add-Two-Number/#disqus_thread" itemprop="discussionUrl">
<span class="post-comments-count disqus-comment-count" data-disqus-identifier="2015/04/14/Add-Two-Number/" itemprop="commentCount"></span>
</a>
</span>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<h3 id="problem"><a href="#problem" class="headerlink" title="problem"></a>problem</h3><p>You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list.</p>
<p><strong>Input</strong>:<code>(2 -&gt; 4 -&gt; 3) + (5 -&gt; 6 -&gt; 4)</code><br><strong>Output</strong>: <code>7 -&gt; 0 -&gt; 8</code></p>
<p><strong>分析(不用英文装逼了)</strong><br>这个代码是抄来的,<a href="https://github.com/haoel/leetcode" target="_blank" rel="noopener">链接</a>原作是这位大大。</p>
<!--noindex-->
<div class="post-button">
<a class="btn" href="/2015/04/14/Add-Two-Number/#more" rel="contents">
Read more &raquo;
</a>
</div>
<!--/noindex-->
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</article>
<article itemscope itemtype="http://schema.org/Article" class="post-block" lang="zh-Hans">
<link itemprop="mainEntityOfPage" href="https://nicksxs.me/2015/03/13/Reverse-Integer/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="image" content="/uploads/avatar.jpg">
<meta itemprop="name" content="Nicksxs">
<meta itemprop="description" content="learn from zero,技术博客,Nicksxs,史学森">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="Nicksxs's Blog">
</span>
<header class="post-header">
<h2 class="post-title" itemprop="name headline">
<a href="/2015/03/13/Reverse-Integer/" class="post-title-link" itemprop="url">Reverse Integer</a>
</h2>
<div class="post-meta">
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar"></i>
</span>
<span class="post-meta-item-text">Posted on</span>
<time title="Created: 2015-03-13 17:22:20" itemprop="dateCreated datePublished" datetime="2015-03-13T17:22:20+08:00">2015-03-13</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar-check"></i>
,
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/Redis/%E6%BA%90%E7%A0%81/" itemprop="url" rel="index"><span itemprop="name">源码</span></a>
</span>
<span class="post-meta-item-text">Edited on</span>
<time title="Modified: 2020-01-12 21:08:27" itemprop="dateModified" datetime="2020-01-12T21:08:27+08:00">2020-01-12</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-folder"></i>
</span>
<span class="post-meta-item-text">In</span>
,
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/leetcode/" itemprop="url" rel="index"><span itemprop="name">leetcode</span></a>
<a href="/categories/C/Redis/" itemprop="url" rel="index"><span itemprop="name">Redis</span></a>
</span>
</span>
<span id="/2015/03/13/Reverse-Integer/" class="post-meta-item leancloud_visitors" data-flag-title="Reverse Integer" title="Views">
<span id="/2020/01/10/redis%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%BB%8B%E7%BB%8D%E4%B8%89/" class="post-meta-item leancloud_visitors" data-flag-title="redis数据结构介绍三-第三部分 整数集合" title="Views">
<span class="post-meta-item-icon">
<i class="fa fa-eye"></i>
</span>
@ -583,8 +396,8 @@
</span>
<span class="post-meta-item-text">Disqus: </span>
<a title="disqus" href="/2015/03/13/Reverse-Integer/#disqus_thread" itemprop="discussionUrl">
<span class="post-comments-count disqus-comment-count" data-disqus-identifier="2015/03/13/Reverse-Integer/" itemprop="commentCount"></span>
<a title="disqus" href="/2020/01/10/redis%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%BB%8B%E7%BB%8D%E4%B8%89/#disqus_thread" itemprop="discussionUrl">
<span class="post-comments-count disqus-comment-count" data-disqus-identifier="2020/01/10/redis数据结构介绍三/" itemprop="commentCount"></span>
</a>
</span>
@ -599,15 +412,15 @@
<div class="post-body" itemprop="articleBody">
<h3 id="Reverse-Integer"><a href="#Reverse-Integer" class="headerlink" title="Reverse Integer"></a><a href="https://leetcode.com/problems/reverse-integer/" target="_blank" rel="noopener">Reverse Integer</a></h3><h4 id="Reverse-digits-of-an-integer"><a href="#Reverse-digits-of-an-integer" class="headerlink" title="Reverse digits of an integer."></a>Reverse digits of an integer.</h4><p>Example1: x = 123, return 321<br>Example2: x = -123, return -321</p>
<!--noindex-->
<div class="post-button">
<a class="btn" href="/2015/03/13/Reverse-Integer/#more" rel="contents">
Read more &raquo;
</a>
</div>
<!--/noindex-->
<p>redis中对于 set 其实有两种处理,对于元素均为整型,并且元素数目较少时,使用 intset 作为底层数据结构,否则使用 dict 作为底层数据结构,先看一下代码先</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> <span class="title">intset</span> &#123;</span></span><br><span class="line"> <span class="comment">// 编码方式</span></span><br><span class="line"> <span class="keyword">uint32_t</span> encoding;</span><br><span class="line"> <span class="comment">// 集合包含的元素数量</span></span><br><span class="line"> <span class="keyword">uint32_t</span> length;</span><br><span class="line"> <span class="comment">// 保存元素的数组</span></span><br><span class="line"> <span class="keyword">int8_t</span> contents[];</span><br><span class="line">&#125; intset;</span><br><span class="line"></span><br><span class="line"><span class="comment">/* Note that these encodings are ordered, so:</span></span><br><span class="line"><span class="comment"> * INTSET_ENC_INT16 &lt; INTSET_ENC_INT32 &lt; INTSET_ENC_INT64. */</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> INTSET_ENC_INT16 (sizeof(int16_t))</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> INTSET_ENC_INT32 (sizeof(int32_t))</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> INTSET_ENC_INT64 (sizeof(int64_t))</span></span><br></pre></td></tr></table></figure>
<p>一眼看,为啥整型还需要编码,然后 int8_t 怎么能存下大整形呢,带着这些疑问,我们一步步分析下去,这里的编码其实指的是这个整型集合里存的究竟是多大的整型,16 位,还是 32 位,还是 64 位,结构体下面的宏定义就是表示了 encoding 的可能取值,INTSET_ENC_INT16 表示每个元素用2个字节存储,INTSET_ENC_INT32 表示每个元素用4个字节存储,INTSET_ENC_INT64 表示每个元素用8个字节存储。因此,intset中存储的整数最多只能占用64bit。length 就是正常的表示集合中元素的数量。最奇怪的应该就是这个 contents 了,是个 int8_t 的数组,那放毛线数据啊,最小的都有 16 位,这里我在看代码和《redis 设计与实现》的时候也有点懵逼,后来查了下发现这是个比较取巧的用法,这里我用自己的理解表述一下,先看看 8,16,32,64 的关系,一眼看就知道都是 2 的 N 次,并且呈两倍关系,而且 8 位刚好一个字节,所以呢其实这里的contents 不是个常规意义上的 int8_t 类型的数组,而是个柔性数组。看下 wiki 的定义</p>
<blockquote>
<p>Flexible array members<a href="https://en.wikipedia.org/wiki/Flexible_array_member#cite_note-1" target="_blank" rel="noopener">1</a> were introduced in the <a href="https://en.wikipedia.org/wiki/C99" target="_blank" rel="noopener">C99</a> standard of the <a href="https://en.wikipedia.org/wiki/C_(programming_language)" target="_blank" rel="noopener">C programming language</a> (in particular, in section §6.7.2.1, item 16, page 103).<a href="https://en.wikipedia.org/wiki/Flexible_array_member#cite_note-2" target="_blank" rel="noopener">2</a> It is a member of a struct, which is an array without a given dimension. It must be the last member of such a struct and it must be accompanied by at least one other member, as in the following example:</p>
</blockquote>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">vectord</span> &#123;</span></span><br><span class="line"> <span class="keyword">size_t</span> len;</span><br><span class="line"> <span class="keyword">double</span> arr[]; <span class="comment">// the flexible array member must be last</span></span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure>
<p>在初始化这个 intset 的时候,这个contents数组是不占用空间的,后面的反正用到了申请,那么这里就有一个问题,给出了三种可能的 encoding 值,他们能随便换吗,显然不行,首先在 intset 中数据的存放是有序的,这个有部分原因是方便二分查找,然后存放数据其实随着数据的大小不同会有一个升级的过程,看下图<br><img data-src="https://i.loli.net/2020/01/10/qIc6HgP7wfCLipN.png" alt=""><br>新创建的intset只有一个header,总共8个字节。其中encoding = 2, length = 0, 类型都是uint32_t,各占 4 字节,添加15, 5两个元素之后,因为它们是比较小的整数,都能使用2个字节表示,所以encoding不变,值还是2,也就是默认的 <code>INTSET_ENC_INT16</code>,当添加32768的时候,它不再能用2个字节来表示了(2个字节能表达的数据范围是-215~215-1,而32768等于215,超出范围了),因此encoding必须升级到INTSET_ENC_INT32(值为4),即用4个字节表示一个元素。在添加每个元素的过程中,intset始终保持从小到大有序。与ziplist类似,intset也是按小端(little endian)模式存储的(参见维基百科词条<a href="https://en.wikipedia.org/wiki/Endianness" target="_blank" rel="noopener">Endianness</a>)。比如,在上图中intset添加完所有数据之后,表示encoding字段的4个字节应该解释成0x00000004,而第4个数据应该解释成0x00008000 = 32768</p>
</div>
@ -628,7 +441,7 @@
<article itemscope itemtype="http://schema.org/Article" class="post-block" lang="zh-Hans">
<link itemprop="mainEntityOfPage" href="https://nicksxs.me/2015/03/11/Reverse-Bits/">
<link itemprop="mainEntityOfPage" href="https://nicksxs.me/2020/01/04/redis%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%BB%8B%E7%BB%8D%E4%BA%8C/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="image" content="/uploads/avatar.jpg">
@ -642,7 +455,7 @@
<header class="post-header">
<h2 class="post-title" itemprop="name headline">
<a href="/2015/03/11/Reverse-Bits/" class="post-title-link" itemprop="url">Reverse Bits</a>
<a href="/2020/01/04/redis%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%BB%8B%E7%BB%8D%E4%BA%8C/" class="post-title-link" itemprop="url">redis数据结构介绍二-第二部分 跳表</a>
</h2>
<div class="post-meta">
@ -652,7 +465,7 @@
</span>
<span class="post-meta-item-text">Posted on</span>
<time title="Created: 2015-03-11 17:35:20" itemprop="dateCreated datePublished" datetime="2015-03-11T17:35:20+08:00">2015-03-11</time>
<time title="Created: 2020-01-04 00:03:05" itemprop="dateCreated datePublished" datetime="2020-01-04T00:03:05+08:00">2020-01-04</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
@ -667,220 +480,28 @@
</span>
<span class="post-meta-item-text">In</span>
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/leetcode/" itemprop="url" rel="index"><span itemprop="name">leetcode</span></a>
<a href="/categories/Redis/" itemprop="url" rel="index"><span itemprop="name">Redis</span></a>
</span>
</span>
<span id="/2015/03/11/Reverse-Bits/" class="post-meta-item leancloud_visitors" data-flag-title="Reverse Bits" title="Views">
<span class="post-meta-item-icon">
<i class="fa fa-eye"></i>
</span>
<span class="post-meta-item-text">Views: </span>
<span class="leancloud-visitors-count"></span>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-comment"></i>
</span>
<span class="post-meta-item-text">Disqus: </span>
<a title="disqus" href="/2015/03/11/Reverse-Bits/#disqus_thread" itemprop="discussionUrl">
<span class="post-comments-count disqus-comment-count" data-disqus-identifier="2015/03/11/Reverse-Bits/" itemprop="commentCount"></span>
</a>
</span>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<h3 id="Reverse-Bits"><a href="#Reverse-Bits" class="headerlink" title="Reverse Bits "></a><a href="https://leetcode.com/problems/reverse-bits/" target="_blank" rel="noopener">Reverse Bits </a></h3><h4 id="Reverse-bits-of-a-given-32-bits-unsigned-integer"><a href="#Reverse-bits-of-a-given-32-bits-unsigned-integer" class="headerlink" title="Reverse bits of a given 32 bits unsigned integer."></a>Reverse bits of a given 32 bits unsigned integer.</h4><p>For example, given input 43261596 (represented in binary as 00000010100101000001111010011100), return 964176192 (represented in binary as 00111001011110000010100101000000).</p>
<!--noindex-->
<div class="post-button">
<a class="btn" href="/2015/03/11/Reverse-Bits/#more" rel="contents">
Read more &raquo;
</a>
</div>
<!--/noindex-->
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</article>
<article itemscope itemtype="http://schema.org/Article" class="post-block" lang="zh-Hans">
<link itemprop="mainEntityOfPage" href="https://nicksxs.me/2015/03/11/Number-Of-1-Bits/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="image" content="/uploads/avatar.jpg">
<meta itemprop="name" content="Nicksxs">
<meta itemprop="description" content="learn from zero,技术博客,Nicksxs,史学森">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="Nicksxs's Blog">
</span>
<header class="post-header">
<h2 class="post-title" itemprop="name headline">
<a href="/2015/03/11/Number-Of-1-Bits/" class="post-title-link" itemprop="url">Number of 1 Bits</a>
</h2>
<div class="post-meta">
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar"></i>
</span>
<span class="post-meta-item-text">Posted on</span>
<time title="Created: 2015-03-11 17:02:58" itemprop="dateCreated datePublished" datetime="2015-03-11T17:02:58+08:00">2015-03-11</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar-check"></i>
,
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/Redis/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/" itemprop="url" rel="index"><span itemprop="name">数据结构</span></a>
</span>
<span class="post-meta-item-text">Edited on</span>
<time title="Modified: 2020-01-12 21:08:26" itemprop="dateModified" datetime="2020-01-12T21:08:26+08:00">2020-01-12</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-folder"></i>
</span>
<span class="post-meta-item-text">In</span>
,
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/leetcode/" itemprop="url" rel="index"><span itemprop="name">leetcode</span></a>
<a href="/categories/C/" itemprop="url" rel="index"><span itemprop="name">C</span></a>
</span>
</span>
<span id="/2015/03/11/Number-Of-1-Bits/" class="post-meta-item leancloud_visitors" data-flag-title="Number of 1 Bits" title="Views">
<span class="post-meta-item-icon">
<i class="fa fa-eye"></i>
</span>
<span class="post-meta-item-text">Views: </span>
<span class="leancloud-visitors-count"></span>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-comment"></i>
</span>
<span class="post-meta-item-text">Disqus: </span>
<a title="disqus" href="/2015/03/11/Number-Of-1-Bits/#disqus_thread" itemprop="discussionUrl">
<span class="post-comments-count disqus-comment-count" data-disqus-identifier="2015/03/11/Number-Of-1-Bits/" itemprop="commentCount"></span>
</a>
</span>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<h3 id="Number-of-1-Bits"><a href="#Number-of-1-Bits" class="headerlink" title="Number of 1 Bits "></a><a href="https://leetcode.com/problems/number-of-1-bits/" target="_blank" rel="noopener">Number of 1 Bits </a></h3><h4 id="Write-a-function-that-takes-an-unsigned-integer-and-returns-the-number-of-’1’-bits-it-has-also-known-as-the-Hamming-weight-For-example-the-32-bit-integer-‘11’-has-binary-representation-00000000000000000000000000001011-so-the-function-should-return-3"><a href="#Write-a-function-that-takes-an-unsigned-integer-and-returns-the-number-of-’1’-bits-it-has-also-known-as-the-Hamming-weight-For-example-the-32-bit-integer-‘11’-has-binary-representation-00000000000000000000000000001011-so-the-function-should-return-3" class="headerlink" title="Write a function that takes an unsigned integer and returns the number of ’1’ bits it has (also known as the Hamming weight). For example, the 32-bit integer ‘11’ has binary representation 00000000000000000000000000001011, so the function should return 3."></a>Write a function that takes an unsigned integer and returns the number of ’1’ bits it has (also known as the Hamming weight). For example, the 32-bit integer ‘11’ has binary representation <code>00000000000000000000000000001011</code>, so the function should return 3.</h4>
<!--noindex-->
<div class="post-button">
<a class="btn" href="/2015/03/11/Number-Of-1-Bits/#more" rel="contents">
Read more &raquo;
</a>
</div>
<!--/noindex-->
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</article>
<article itemscope itemtype="http://schema.org/Article" class="post-block" lang="zh-Hans">
<link itemprop="mainEntityOfPage" href="https://nicksxs.me/2015/01/16/pcre-intro-and-a-simple-package/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="image" content="/uploads/avatar.jpg">
<meta itemprop="name" content="Nicksxs">
<meta itemprop="description" content="learn from zero,技术博客,Nicksxs,史学森">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="Nicksxs's Blog">
</span>
<header class="post-header">
<h2 class="post-title" itemprop="name headline">
<a href="/2015/01/16/pcre-intro-and-a-simple-package/" class="post-title-link" itemprop="url">pcre-intro-and-a-simple-package</a>
</h2>
<div class="post-meta">
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar"></i>
</span>
<span class="post-meta-item-text">Posted on</span>
<time title="Created: 2015-01-16 14:30:20" itemprop="dateCreated datePublished" datetime="2015-01-16T14:30:20+08:00">2015-01-16</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar-check"></i>
,
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/Redis/%E6%BA%90%E7%A0%81/" itemprop="url" rel="index"><span itemprop="name">源码</span></a>
</span>
<span class="post-meta-item-text">Edited on</span>
<time title="Modified: 2020-01-12 21:08:26" itemprop="dateModified" datetime="2020-01-12T21:08:26+08:00">2020-01-12</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-folder"></i>
</span>
<span class="post-meta-item-text">In</span>
,
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/C/" itemprop="url" rel="index"><span itemprop="name">C++</span></a>
<a href="/categories/C/Redis/" itemprop="url" rel="index"><span itemprop="name">Redis</span></a>
</span>
</span>
<span id="/2015/01/16/pcre-intro-and-a-simple-package/" class="post-meta-item leancloud_visitors" data-flag-title="pcre-intro-and-a-simple-package" title="Views">
<span id="/2020/01/04/redis%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%BB%8B%E7%BB%8D%E4%BA%8C/" class="post-meta-item leancloud_visitors" data-flag-title="redis数据结构介绍二-第二部分 跳表" title="Views">
<span class="post-meta-item-icon">
<i class="fa fa-eye"></i>
</span>
@ -895,8 +516,8 @@
</span>
<span class="post-meta-item-text">Disqus: </span>
<a title="disqus" href="/2015/01/16/pcre-intro-and-a-simple-package/#disqus_thread" itemprop="discussionUrl">
<span class="post-comments-count disqus-comment-count" data-disqus-identifier="2015/01/16/pcre-intro-and-a-simple-package/" itemprop="commentCount"></span>
<a title="disqus" href="/2020/01/04/redis%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%BB%8B%E7%BB%8D%E4%BA%8C/#disqus_thread" itemprop="discussionUrl">
<span class="post-comments-count disqus-comment-count" data-disqus-identifier="2020/01/04/redis数据结构介绍二/" itemprop="commentCount"></span>
</a>
</span>
@ -911,18 +532,12 @@
<div class="post-body" itemprop="articleBody">
<h3 id="Pcre"><a href="#Pcre" class="headerlink" title="Pcre"></a><a href="http://www.pcre.org/" target="_blank" rel="noopener">Pcre</a></h3><blockquote>
<p>Perl Compatible Regular Expressions (PCRE) is a regular<br> expression C library inspired by the regular expression<br> capabilities in the Perl programming language, written<br> by Philip Hazel, starting in summer 1997.</p>
</blockquote>
<p>因为最近工作内容的一部分需要做字符串的识别处理,所以就顺便用上了之前在PHP中用过的正则,在C/C++中本身不包含正则库,这里使用的pcre,对MFC开发,在<a href="http://www.psyon.org/projects/pcre-win32/index.php" target="_blank" rel="noopener">这里</a>提供了静态链接库,在引入lib跟.h文件后即可使用。</p>
<!--noindex-->
<div class="post-button">
<a class="btn" href="/2015/01/16/pcre-intro-and-a-simple-package/#more" rel="contents">
Read more &raquo;
</a>
</div>
<!--/noindex-->
<h2 id="跳表-skiplist"><a href="#跳表-skiplist" class="headerlink" title="跳表 skiplist"></a>跳表 skiplist</h2><p>跳表是个在我们日常的代码中不太常用到的数据结构,相对来讲就没有像数组,链表,字典,散列,树等结构那么熟悉,所以就从头开始分析下,首先是链表,跳表跟链表都有个表字(太硬扯了我🤦‍♀️),注意这是个有序链表<br><img data-src="https://i.loli.net/2020/01/03/Og9i3pCIfxrMhja.png" alt=""><br>如上图,在这个链表里如果我要找到 23,是不是我需要从3,5,9开始一直往后找直到找到 23,也就是说时间复杂度是 O(N),N 的一次幂复杂度,那么我们来看看第二个<br><img data-src="https://i.loli.net/2020/01/03/81P2baupiedOmNf.png" alt=""><br>这个结构跟原先有点不一样,它给链表中偶数位的节点又加了一个指针把它们链接起来,这样子当我们要寻找 23 的时候就可以从原来的一个个往下找变成跳着找,先找到 5,然后是 10,接着是 19,然后是 28,这时候发现 28 比 23 大了,那我在退回到 19,然后从下一层原来的链表往前找,<br><img data-src="https://i.loli.net/2020/01/03/NBguAphilKjs2MO.png" alt=""><br>这里毛估估是不是前面的节点我就少找了一半,有那么点二分法的意思。<br>前面的其实是跳表的引子,真正的跳表其实不是这样,因为上面的其实有个比较大的问题,就是插入一个元素后需要调整每个元素的指针,在 redis 中的跳表其实是做了个随机层数的优化,因为沿着前面的例子,其实当数据量很大的时候,是不是层数越多,其查询效率越高,但是随着层数变多,要保持这种严格的层数规则其实也会增大处理复杂度,所以 redis 插入每个元素的时候都是使用随机的方式,看一眼代码</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* ZSETs use a specialized version of Skiplists */</span></span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> <span class="title">zskiplistNode</span> &#123;</span></span><br><span class="line"> sds ele;</span><br><span class="line"> <span class="keyword">double</span> score;</span><br><span class="line"> <span class="class"><span class="keyword">struct</span> <span class="title">zskiplistNode</span> *<span class="title">backward</span>;</span></span><br><span class="line"> <span class="class"><span class="keyword">struct</span> <span class="title">zskiplistLevel</span> &#123;</span></span><br><span class="line"> <span class="class"><span class="keyword">struct</span> <span class="title">zskiplistNode</span> *<span class="title">forward</span>;</span></span><br><span class="line"> <span class="keyword">unsigned</span> <span class="keyword">long</span> span;</span><br><span class="line"> &#125; level[];</span><br><span class="line">&#125; zskiplistNode;</span><br><span class="line"></span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> <span class="title">zskiplist</span> &#123;</span></span><br><span class="line"> <span class="class"><span class="keyword">struct</span> <span class="title">zskiplistNode</span> *<span class="title">header</span>, *<span class="title">tail</span>;</span></span><br><span class="line"> <span class="keyword">unsigned</span> <span class="keyword">long</span> length;</span><br><span class="line"> <span class="keyword">int</span> level;</span><br><span class="line">&#125; zskiplist;</span><br><span class="line"></span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> <span class="title">zset</span> &#123;</span></span><br><span class="line"> dict *dict;</span><br><span class="line"> zskiplist *zsl;</span><br><span class="line">&#125; zset;</span><br></pre></td></tr></table></figure>
<p>忘了说了,redis 是把 skiplist 跳表用在 zset 里,zset 是个有序的集合,可以看到 zskiplist 就是个跳表的结构,里面用 header 保存跳表的表头,tail 保存表尾,还有长度和最大层级,具体的跳表节点元素使用 zskiplistNode 表示,里面包含了 sds 类型的元素值,double 类型的分值,用来排序,一个 backward 后向指针和一个 zskiplistLevel 数组,每个 level 包含了一个前向指针,和一个 span,span 表示的是跳表前向指针的跨度,这里再补充一点,前面说了为了灵活这个跳表的新增修改,redis 使用了随机层高的方式插入新节点,但是如果所有节点都随机到很高的层级或者所有都很低的话,跳表的效率优势就会减小,所以 redis 使用了个小技巧,贴下代码</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">define</span> ZSKIPLIST_P 0.25 <span class="comment">/* Skiplist P = 1/4 */</span></span></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">zslRandomLevel</span><span class="params">(<span class="keyword">void</span>)</span> </span>&#123;</span><br><span class="line"> <span class="keyword">int</span> level = <span class="number">1</span>;</span><br><span class="line"> <span class="keyword">while</span> ((<span class="built_in">random</span>()&amp;<span class="number">0xFFFF</span>) &lt; (ZSKIPLIST_P * <span class="number">0xFFFF</span>))</span><br><span class="line"> level += <span class="number">1</span>;</span><br><span class="line"> <span class="keyword">return</span> (level&lt;ZSKIPLIST_MAXLEVEL) ? level : ZSKIPLIST_MAXLEVEL;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>
<p>当随机值跟0xFFFF进行与操作小于ZSKIPLIST_P * 0xFFFF时才会增大 level 的值,因此保持了一个相对递减的概率<br>可以简单分析下,当 random() 的值小于 0xFFFF 的 1/4,才会 level + 1,就意味着当有 1 - 1/4也就是3/4的概率是直接跳出,所以一层的概率是3/4,也就是 1-P,二层的概率是 P*(1-P),三层的概率是 P² * (1-P) 依次递推。</p>
</div>
@ -943,7 +558,7 @@
<article itemscope itemtype="http://schema.org/Article" class="post-block" lang="zh-Hans">
<link itemprop="mainEntityOfPage" href="https://nicksxs.me/2015/01/14/Two-Sum/">
<link itemprop="mainEntityOfPage" href="https://nicksxs.me/2019/12/26/redis%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%BB%8B%E7%BB%8D/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="image" content="/uploads/avatar.jpg">
@ -957,7 +572,7 @@
<header class="post-header">
<h2 class="post-title" itemprop="name headline">
<a href="/2015/01/14/Two-Sum/" class="post-title-link" itemprop="url">two sum</a>
<a href="/2019/12/26/redis%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%BB%8B%E7%BB%8D/" class="post-title-link" itemprop="url">redis数据结构介绍-第一部分 SDS,链表,字典</a>
</h2>
<div class="post-meta">
@ -967,7 +582,7 @@
</span>
<span class="post-meta-item-text">Posted on</span>
<time title="Created: 2015-01-14 15:39:31" itemprop="dateCreated datePublished" datetime="2015-01-14T15:39:31+08:00">2015-01-14</time>
<time title="Created: 2019-12-26 00:03:49" itemprop="dateCreated datePublished" datetime="2019-12-26T00:03:49+08:00">2019-12-26</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
@ -982,117 +597,28 @@
</span>
<span class="post-meta-item-text">In</span>
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/leetcode/" itemprop="url" rel="index"><span itemprop="name">leetcode</span></a>
<a href="/categories/Redis/" itemprop="url" rel="index"><span itemprop="name">Redis</span></a>
</span>
</span>
<span id="/2015/01/14/Two-Sum/" class="post-meta-item leancloud_visitors" data-flag-title="two sum" title="Views">
<span class="post-meta-item-icon">
<i class="fa fa-eye"></i>
</span>
<span class="post-meta-item-text">Views: </span>
<span class="leancloud-visitors-count"></span>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-comment"></i>
</span>
<span class="post-meta-item-text">Disqus: </span>
<a title="disqus" href="/2015/01/14/Two-Sum/#disqus_thread" itemprop="discussionUrl">
<span class="post-comments-count disqus-comment-count" data-disqus-identifier="2015/01/14/Two-Sum/" itemprop="commentCount"></span>
</a>
</span>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<h3 id="problem"><a href="#problem" class="headerlink" title="problem"></a>problem</h3><p>Given an array of integers, find two numbers such that they add up to a specific target number.</p>
<p>The function twoSum should return indices of the two numbers such that they add up to the target, where index1 must be less than index2. Please note that your returned answers (both index1 and index2) are not zero-based.</p>
<!--noindex-->
<div class="post-button">
<a class="btn" href="/2015/01/14/Two-Sum/#more" rel="contents">
Read more &raquo;
</a>
</div>
<!--/noindex-->
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</article>
<article itemscope itemtype="http://schema.org/Article" class="post-block" lang="zh-Hans">
<link itemprop="mainEntityOfPage" href="https://nicksxs.me/2015/01/04/Path-Sum/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="image" content="/uploads/avatar.jpg">
<meta itemprop="name" content="Nicksxs">
<meta itemprop="description" content="learn from zero,技术博客,Nicksxs,史学森">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="Nicksxs's Blog">
</span>
<header class="post-header">
<h2 class="post-title" itemprop="name headline">
<a href="/2015/01/04/Path-Sum/" class="post-title-link" itemprop="url">Path Sum</a>
</h2>
<div class="post-meta">
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar"></i>
</span>
<span class="post-meta-item-text">Posted on</span>
<time title="Created: 2015-01-04 15:44:10" itemprop="dateCreated datePublished" datetime="2015-01-04T15:44:10+08:00">2015-01-04</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar-check"></i>
,
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/Redis/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/" itemprop="url" rel="index"><span itemprop="name">数据结构</span></a>
</span>
<span class="post-meta-item-text">Edited on</span>
<time title="Modified: 2020-01-12 21:08:26" itemprop="dateModified" datetime="2020-01-12T21:08:26+08:00">2020-01-12</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-folder"></i>
</span>
<span class="post-meta-item-text">In</span>
,
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/C/" itemprop="url" rel="index"><span itemprop="name">C</span></a>
</span>
,
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/leetcode/" itemprop="url" rel="index"><span itemprop="name">leetcode</span></a>
<a href="/categories/Redis/%E6%BA%90%E7%A0%81/" itemprop="url" rel="index"><span itemprop="name">源码</span></a>
</span>
,
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/C/Redis/" itemprop="url" rel="index"><span itemprop="name">Redis</span></a>
</span>
</span>
<span id="/2015/01/04/Path-Sum/" class="post-meta-item leancloud_visitors" data-flag-title="Path Sum" title="Views">
<span id="/2019/12/26/redis%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%BB%8B%E7%BB%8D/" class="post-meta-item leancloud_visitors" data-flag-title="redis数据结构介绍-第一部分 SDS,链表,字典" title="Views">
<span class="post-meta-item-icon">
<i class="fa fa-eye"></i>
</span>
@ -1107,8 +633,8 @@
</span>
<span class="post-meta-item-text">Disqus: </span>
<a title="disqus" href="/2015/01/04/Path-Sum/#disqus_thread" itemprop="discussionUrl">
<span class="post-comments-count disqus-comment-count" data-disqus-identifier="2015/01/04/Path-Sum/" itemprop="commentCount"></span>
<a title="disqus" href="/2019/12/26/redis%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%BB%8B%E7%BB%8D/#disqus_thread" itemprop="discussionUrl">
<span class="post-comments-count disqus-comment-count" data-disqus-identifier="2019/12/26/redis数据结构介绍/" itemprop="commentCount"></span>
</a>
</span>
@ -1123,15 +649,17 @@
<div class="post-body" itemprop="articleBody">
<h3 id="problem"><a href="#problem" class="headerlink" title="problem"></a>problem</h3><p>Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all the values along the path equals the given sum.</p>
<!--noindex-->
<div class="post-button">
<a class="btn" href="/2015/01/04/Path-Sum/#more" rel="contents">
Read more &raquo;
</a>
</div>
<!--/noindex-->
<p>redis是现在服务端很常用的缓存中间件,其实原来还有<code>memcache</code>之类的竞品,但是现在貌似 redis 快一统江湖,这里当然不是在吹,只是个人角度的一个感觉,不权威只是主观感觉。<br>redis 主要有五种数据结构,<code>Strings</code><code>Lists</code><code>Sets</code><code>Hashes</code><code>Sorted Sets</code>,这五种数据结构先简单介绍下,<code>Strings</code>类型的其实就是我们最常用的 key-value,实际开发中也会用的最多;<code>Lists</code>是列表,这个有些会用来做队列,因为 redis 目前常用的版本支持丰富的列表操作;还有是<code>Sets</code>集合,这个主要的特点就是集合中元素不重复,可以用在有这类需求的场景里;<code>Hashes</code>是叫散列,类似于 Python 中的字典结构;还有就是<code>Sorted Sets</code>这个是个有序集合;一眼看这些其实没啥特别的,除了最后这个有序集合,不过去了解背后的实现方式还是比较有意思的。</p>
<h2 id="SDS-简单动态字符串"><a href="#SDS-简单动态字符串" class="headerlink" title="SDS 简单动态字符串"></a>SDS 简单动态字符串</h2><p>先从<code>Strings</code>开始说,了解过 C 语言的应该知道,C 语言中的字符串其实是个 <code>char[]</code> 字符数组,redis 也不例外,只是最开始的版本就对这个做了一丢丢的优化,而正是这一丢丢的优化,让这个 redis 的使用效率提升了数倍</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">sdshdr</span> &#123;</span></span><br><span class="line"> <span class="comment">// 字符串长度</span></span><br><span class="line"> <span class="keyword">int</span> len;</span><br><span class="line"> <span class="comment">// 字符串空余字符数</span></span><br><span class="line"> <span class="keyword">int</span> <span class="built_in">free</span>;</span><br><span class="line"> <span class="comment">// 字符串内容</span></span><br><span class="line"> <span class="keyword">char</span> buf[];</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure>
<p>这里引用了 redis 在 github 上最早的 2.2 版本的代码,代码路径是<code>https://github.com/antirez/redis/blob/2.2/src/sds.h</code>,可以看到这个结构体里只有仨元素,两个 int 型和一个 char 型数组,两个 int 型其实就是我说的优化,因为 C 语言本身的字符串数组,有两个问题,一个是要知道它实际已被占用的长度,需要去遍历这个数组,第二个就是比较容易踩坑的是遍历的时候要注意它有个以<code>\0</code>作为结尾的特点;通过上面的两个 int 型参数,一个是知道字符串目前的长度,一个是知道字符串还剩余多少位空间,这样子坐着两个操作从 <code>O(N)</code>简化到了<code>O(1)</code>了,还有第二个 free 还有个比较重要的作用就是能防止 C 字符串的溢出问题,在存储之前可以先判断 free 长度,如果长度不够就先扩容了,先介绍到这,这个系列可以写蛮多的,慢慢介绍吧</p>
<h2 id="链表"><a href="#链表" class="headerlink" title="链表"></a>链表</h2><p>链表是比较常见的数据结构了,但是因为 redis 是用 C 写的,所以在不依赖第三方库的情况下只能自己写一个了,redis 的链表是个有头的链表,而且是无环的,具体的结构我也找了 github 上最早版本的代码</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> <span class="title">listNode</span> &#123;</span></span><br><span class="line"> <span class="comment">// 前置节点</span></span><br><span class="line"> <span class="class"><span class="keyword">struct</span> <span class="title">listNode</span> *<span class="title">prev</span>;</span></span><br><span class="line"> <span class="comment">// 后置节点</span></span><br><span class="line"> <span class="class"><span class="keyword">struct</span> <span class="title">listNode</span> *<span class="title">next</span>;</span></span><br><span class="line"> <span class="comment">// 值</span></span><br><span class="line"> <span class="keyword">void</span> *value;</span><br><span class="line">&#125; listNode;</span><br><span class="line"></span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> <span class="title">list</span> &#123;</span></span><br><span class="line"> <span class="comment">// 链表表头</span></span><br><span class="line"> listNode *head;</span><br><span class="line"> <span class="comment">// 当前节点,也可以说是最后节点</span></span><br><span class="line"> listNode *tail;</span><br><span class="line"> <span class="comment">// 节点复制函数</span></span><br><span class="line"> <span class="keyword">void</span> *(*dup)(<span class="keyword">void</span> *ptr);</span><br><span class="line"> <span class="comment">// 节点值释放函数</span></span><br><span class="line"> <span class="keyword">void</span> (*<span class="built_in">free</span>)(<span class="keyword">void</span> *ptr);</span><br><span class="line"> <span class="comment">// 节点值比较函数</span></span><br><span class="line"> <span class="keyword">int</span> (*match)(<span class="keyword">void</span> *ptr, <span class="keyword">void</span> *key);</span><br><span class="line"> <span class="comment">// 链表包含的节点数量</span></span><br><span class="line"> <span class="keyword">unsigned</span> <span class="keyword">int</span> len;</span><br><span class="line">&#125; <span class="built_in">list</span>;</span><br></pre></td></tr></table></figure>
<p>代码地址是这个<code>https://github.com/antirez/redis/blob/2.2/src/adlist.h</code><br>可以看下节点是由listNode承载的,包括值和一个指向前节点跟一个指向后一节点的两个指针,然后值是 void 指针类型,所以可以承载不同类型的值<br>然后是 list结构用来承载一个链表,包含了表头,和表尾,复制函数,释放函数和比较函数,还有链表长度,因为包含了前两个节点,找到表尾节点跟表头都是 <code>O(1)</code>的时间复杂度,还有节点数量,其实这个跟 SDS 是同一个做法,就是空间换时间,这也是写代码里比较常见的做法,以此让一些高频的操作提速。</p>
<h2 id="字典"><a href="#字典" class="headerlink" title="字典"></a>字典</h2><p>字典也是个常用的数据结构,其实只是叫法不同,数据结构中叫 hash 散列,Java 中叫 Map,PHP 中是数组 array,Python 中也叫字典 dict,因为纯 C 语言本身不带这些数据结构,所以这也是个痛并快乐着的过程,享受 C 语言的高性能的同时也要接受它只提供了语言的基本功能的现实,各种轮子都需要自己造,redis 同样实现了自己的字典<br>下面来看看代码</p>
<figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> <span class="title">dictEntry</span> &#123;</span></span><br><span class="line"> <span class="keyword">void</span> *key;</span><br><span class="line"> <span class="keyword">void</span> *val;</span><br><span class="line"> <span class="class"><span class="keyword">struct</span> <span class="title">dictEntry</span> *<span class="title">next</span>;</span></span><br><span class="line">&#125; dictEntry;</span><br><span class="line"></span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> <span class="title">dictType</span> &#123;</span></span><br><span class="line"> <span class="function"><span class="keyword">unsigned</span> <span class="title">int</span> <span class="params">(*hashFunction)</span><span class="params">(<span class="keyword">const</span> <span class="keyword">void</span> *key)</span></span>;</span><br><span class="line"> <span class="keyword">void</span> *(*keyDup)(<span class="keyword">void</span> *privdata, <span class="keyword">const</span> <span class="keyword">void</span> *key);</span><br><span class="line"> <span class="keyword">void</span> *(*valDup)(<span class="keyword">void</span> *privdata, <span class="keyword">const</span> <span class="keyword">void</span> *obj);</span><br><span class="line"> <span class="keyword">int</span> (*keyCompare)(<span class="keyword">void</span> *privdata, <span class="keyword">const</span> <span class="keyword">void</span> *key1, <span class="keyword">const</span> <span class="keyword">void</span> *key2);</span><br><span class="line"> <span class="keyword">void</span> (*keyDestructor)(<span class="keyword">void</span> *privdata, <span class="keyword">void</span> *key);</span><br><span class="line"> <span class="keyword">void</span> (*valDestructor)(<span class="keyword">void</span> *privdata, <span class="keyword">void</span> *obj);</span><br><span class="line">&#125; dictType;</span><br><span class="line"></span><br><span class="line"><span class="comment">/* This is our hash table structure. Every dictionary has two of this as we</span></span><br><span class="line"><span class="comment"> * implement incremental rehashing, for the old to the new table. */</span></span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> <span class="title">dictht</span> &#123;</span></span><br><span class="line"> dictEntry **table;</span><br><span class="line"> <span class="keyword">unsigned</span> <span class="keyword">long</span> <span class="built_in">size</span>;</span><br><span class="line"> <span class="keyword">unsigned</span> <span class="keyword">long</span> sizemask;</span><br><span class="line"> <span class="keyword">unsigned</span> <span class="keyword">long</span> used;</span><br><span class="line">&#125; dictht;</span><br><span class="line"></span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> <span class="title">dict</span> &#123;</span></span><br><span class="line"> dictType *type;</span><br><span class="line"> <span class="keyword">void</span> *privdata;</span><br><span class="line"> dictht ht[<span class="number">2</span>];</span><br><span class="line"> <span class="keyword">int</span> rehashidx; <span class="comment">/* rehashing not in progress if rehashidx == -1 */</span></span><br><span class="line"> <span class="keyword">int</span> iterators; <span class="comment">/* number of iterators currently running */</span></span><br><span class="line">&#125; dict;</span><br></pre></td></tr></table></figure>
<p>看了下这个 2.2 版本的代码跟最新版的其实也差的不是很多,所以还是照旧用老代码,可以看到上面四个结构体中,其实只有三个是存储数据用的,dictType 是用来放操作函数的,那么三个存放数据的结构体分别是干嘛的,这时候感觉需要一个图来说明比较好,稍等,我去画个图~<br><img data-src="https://i.loli.net/2019/12/29/UL4AR1HSEKOh9Qm.png" alt=""><br>这个图看着应该比较清楚这些都是用来干嘛的了,dict 是我们的主体结构,它有一个指向 dictType 的指针,这里面包含了字典的操作函数,然后是一个私有数据指针,接下来是一个 dictht 的数组,包含两个dictht,这个就是用来存数据的了,然后是 rehashidx 表示重哈希的状态,当是-1 的时候表示当前没有重哈希,iterators 表示正在遍历的迭代器的数量。<br>首先说说为啥需要有两个 dictht,这是因为字典 dict 这个数据结构随着数据量的增减,会需要在中途做扩容或者缩容操作,如果只有一个的话,对它进行扩容缩容时会影响正常的访问和修改操作,或者说保证正常查询,修改的正确性会比较复杂,并且因为需要高效利用空间,不能一下子申请一个非常大的空间来存很少的数据。当 dict 中 dictht 中的数据量超过 size 的时候负载就超过了 1,就需要进行扩容,这里的其实跟 Java 中的 HashMap 比较类似,超过一定的负载之后进行扩容。这里为啥 size 会超过 1 呢,可能有部分不了解这类结构的同学会比较奇怪,其实就是上图中画的,在数据结构中对于散列的冲突有几类解决方法,比如转换成链表,二次散列,找下个空槽等,这里就使用了链表法,或者说拉链法。当一个新元素通过 hashFunction 得出的 key 跟 sizemask 取模之后的值相同了,那就将其放在原来的节点之前,变成链表挂在数组 dictht.table下面,放在原有节点前是考虑到可能会优先访问。<br>忘了说明下 dictht 跟 dictEntry 的关系了,dictht 就是个哈希表,它里面是个dictEntry 的二维数组,而 dictEntry 是个包含了 key-value 结构之外还有一个 next 指针,因此可以将哈希冲突的以链表的形式保存下来。<br>在重点说下重哈希,可能同样写 Java 的同学对这个比较有感觉,跟 HashMap 一样,会以 2 的 N 次方进行扩容,那么扩容的方法就会比较简单,每个键重哈希要不就在原来这个槽,要不就在原来的槽加原 dictht.size 的位置;然后是重头戏,具体是怎么做扩容呢,其实这里就把第二个 ht 用上了,其实这两个hashtable 的具体作用有点类似于 jvm 中的两个 survival 区,但是又不全一样,因为 redis 在扩容的时候是采用的渐进式地重哈希,什么叫渐进式的呢,就是它不是像 jvm 那种标记复制的模式直接将一个 eden 区和原来的 survival 区存活的对象复制到另一个 survival 区,而是在每一次添加,删除,查找或者更新操作时,都会额外的帮忙搬运一部分的原 dictht 中的数据,这里会根据 rehashidx 的值来判断,如果是-1 表示并没有在重哈希中,如果是 0 表示开始重哈希了,然后rehashidx 还会随着每次的帮忙搬运往上加,但全部被搬运完成后 rehashidx 又变回了-1,又可以扯到Java 中的 Concurrent HashMap, 他在扩容的时候也使用了类似的操作。</p>
</div>
@ -1152,7 +680,7 @@
<article itemscope itemtype="http://schema.org/Article" class="post-block" lang="zh-Hans">
<link itemprop="mainEntityOfPage" href="https://nicksxs.me/2014/12/30/Clone-Graph-Part-I/">
<link itemprop="mainEntityOfPage" href="https://nicksxs.me/2019/12/21/%E8%81%8A%E8%81%8AJava%E4%B8%AD%E7%9A%84%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="image" content="/uploads/avatar.jpg">
@ -1166,7 +694,7 @@
<header class="post-header">
<h2 class="post-title" itemprop="name headline">
<a href="/2014/12/30/Clone-Graph-Part-I/" class="post-title-link" itemprop="url">Clone Graph Part I</a>
<a href="/2019/12/21/%E8%81%8A%E8%81%8AJava%E4%B8%AD%E7%9A%84%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F/" class="post-title-link" itemprop="url">聊聊Java中的单例模式</a>
</h2>
<div class="post-meta">
@ -1176,14 +704,14 @@
</span>
<span class="post-meta-item-text">Posted on</span>
<time title="Created: 2014-12-30 16:50:01" itemprop="dateCreated datePublished" datetime="2014-12-30T16:50:01+08:00">2014-12-30</time>
<time title="Created: 2019-12-21 01:03:09" itemprop="dateCreated datePublished" datetime="2019-12-21T01:03:09+08:00">2019-12-21</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar-check"></i>
</span>
<span class="post-meta-item-text">Edited on</span>
<time title="Modified: 2020-01-12 21:08:26" itemprop="dateModified" datetime="2020-01-12T21:08:26+08:00">2020-01-12</time>
<time title="Modified: 2019-12-22 08:46:11" itemprop="dateModified" datetime="2019-12-22T08:46:11+08:00">2019-12-22</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
@ -1191,12 +719,20 @@
</span>
<span class="post-meta-item-text">In</span>
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/leetcode/" itemprop="url" rel="index"><span itemprop="name">leetcode</span></a>
<a href="/categories/Java/" itemprop="url" rel="index"><span itemprop="name">Java</span></a>
</span>
,
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/Java/Design-Patterns/" itemprop="url" rel="index"><span itemprop="name">Design Patterns</span></a>
</span>
,
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/Java/Singleton/" itemprop="url" rel="index"><span itemprop="name">Singleton</span></a>
</span>
</span>
<span id="/2014/12/30/Clone-Graph-Part-I/" class="post-meta-item leancloud_visitors" data-flag-title="Clone Graph Part I" title="Views">
<span id="/2019/12/21/%E8%81%8A%E8%81%8AJava%E4%B8%AD%E7%9A%84%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F/" class="post-meta-item leancloud_visitors" data-flag-title="聊聊Java中的单例模式" title="Views">
<span class="post-meta-item-icon">
<i class="fa fa-eye"></i>
</span>
@ -1211,8 +747,8 @@
</span>
<span class="post-meta-item-text">Disqus: </span>
<a title="disqus" href="/2014/12/30/Clone-Graph-Part-I/#disqus_thread" itemprop="discussionUrl">
<span class="post-comments-count disqus-comment-count" data-disqus-identifier="2014/12/30/Clone-Graph-Part-I/" itemprop="commentCount"></span>
<a title="disqus" href="/2019/12/21/%E8%81%8A%E8%81%8AJava%E4%B8%AD%E7%9A%84%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F/#disqus_thread" itemprop="discussionUrl">
<span class="post-comments-count disqus-comment-count" data-disqus-identifier="2019/12/21/聊聊Java中的单例模式/" itemprop="commentCount"></span>
</a>
</span>
@ -1227,15 +763,17 @@
<div class="post-body" itemprop="articleBody">
<h3 id="problem"><a href="#problem" class="headerlink" title="problem"></a>problem</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">Clone a graph. Input is a Node pointer. Return the Node pointer of the cloned graph.</span><br><span class="line"></span><br><span class="line">A graph is defined below:</span><br><span class="line">struct Node &#123;</span><br><span class="line">vector neighbors;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>
<!--noindex-->
<div class="post-button">
<a class="btn" href="/2014/12/30/Clone-Graph-Part-I/#more" rel="contents">
Read more &raquo;
</a>
</div>
<!--/noindex-->
<p>这是个 Java 面试的高频问题,我也遇到过,以往都是觉得这类题没意思,网上一搜一大堆,也不愿意记,其实说回来,主要还是没静下心来好好去理解,今天无意中看到一个课程,基本帮我把一些疑惑的点讲清楚了,首先单例是啥意思,这个其实是有范围一说,比如我起了个<code>Spring Boot</code>应用,在这个应用范围内,我的常规 bean 是单例的,意味着 getBean 的时候其实永远只会拿到那一个对象,那要怎么来写一个单例呢,首先就是传说中的饿汉模式,也是最简单的</p>
<h2 id="饿汉模式"><a href="#饿汉模式" class="headerlink" title="饿汉模式"></a>饿汉模式</h2><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Singleton1</span> </span>&#123;</span><br><span class="line"> <span class="comment">// 首先,将构造方法变成私有的</span></span><br><span class="line"> <span class="function"><span class="keyword">private</span> <span class="title">Singleton1</span><span class="params">()</span> </span>&#123;&#125;;</span><br><span class="line"> <span class="comment">// 创建私有静态实例,这样第一次使用的时候就会进行创建</span></span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">static</span> Singleton instance = <span class="keyword">new</span> Singleton1();</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 使用这个对象都是通过这个 getInstance 来获取</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> Singleton1 <span class="title">getInstance</span><span class="params">()</span> </span>&#123;</span><br><span class="line"> <span class="keyword">return</span> instance;</span><br><span class="line"> &#125;</span><br><span class="line"> <span class="comment">// 瞎写一个静态方法。这里想说的是,如果我们只是要调用 Singleton.getDate(...),</span></span><br><span class="line"> <span class="comment">// 本来是不想要生成 Singleton 实例的,不过没办法,已经生成了</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> Date <span class="title">getDate</span><span class="params">(String mode)</span> </span>&#123;<span class="keyword">return</span> <span class="keyword">new</span> Date();&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>
<p>上面借鉴了一些代码,其实这是最基本,也不会错的方法,但是正如其中<code>getDate</code>方法里说的问题,有时候并没有想那这个对象,但是因为我调用了这个类的静态方法,导致对象已经生成了,可能这也是饿汉模式名字的来由,不管三七二十一给你生成个单例就完事了,不管有没有用,但是这种个人觉得也没啥大问题,如果是面试的话最好说出来它的缺点</p>
<h2 id="饱汉模式"><a href="#饱汉模式" class="headerlink" title="饱汉模式"></a>饱汉模式</h2><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Singleton2</span> </span>&#123;</span><br><span class="line"> <span class="comment">// 首先,也是先堵死 new Singleton() 这条路,将构造方法变成私有</span></span><br><span class="line"> <span class="function"><span class="keyword">private</span> <span class="title">Singleton2</span><span class="params">()</span> </span>&#123;&#125;</span><br><span class="line"> <span class="comment">// 和饿汉模式相比,这边不需要先实例化出来,注意这里的 volatile,它是必须的</span></span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">volatile</span> Singleton2 instance = <span class="keyword">null</span>;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">int</span> m = <span class="number">9</span>;</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> Singleton <span class="title">getInstance</span><span class="params">()</span> </span>&#123;</span><br><span class="line"> <span class="keyword">if</span> (instance == <span class="keyword">null</span>) &#123;</span><br><span class="line"> <span class="comment">// 加锁</span></span><br><span class="line"> <span class="keyword">synchronized</span> (Singleton2<span class="class">.<span class="keyword">class</span>) </span>&#123;</span><br><span class="line"> <span class="comment">// 这一次判断也是必须的,不然会有并发问题</span></span><br><span class="line"> <span class="keyword">if</span> (instance == <span class="keyword">null</span>) &#123;</span><br><span class="line"> instance = <span class="keyword">new</span> Singleton2();</span><br><span class="line"> &#125;</span><br><span class="line"> &#125;</span><br><span class="line"> &#125;</span><br><span class="line"> <span class="keyword">return</span> instance;</span><br><span class="line"> &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>
<p>这里容易错的有三点,理解了其实就比较好记了</p>
<p>第一点,为啥不在 getInstance 上整个代码块加 <code>synchronized</code>,这个其实比较容易理解,就是锁的力度太大,性能太差了,这点其实也要去理解,可以举个夸张的例子,比如我一个电商的服务,如果为了避免一个人的订单出现问题,是不是可以从请求入口就把他锁住,到请求结束释放,那么里面做的事情都有保障,然而这显然不可能,因为我们想要这种竞态条件抢占资源的时间尽量减少,防止其他线程等待。<br>第二点,为啥<code>synchronized</code>之已经检查了 <code>instance == null</code>,还要在里面再检查一次,这个有个术语,叫 <code>double check lock</code>,但是为啥要这么做呢,其实很简单,想象当有两个线程,都过了第一步为空判断,这个时候只有一个线程能拿到这个锁,另一个线程就等待了,如果不再判断一次,那么第一个线程新建完对象释放锁之后,第二个线程又能拿到锁,再去创建一个对象。<br>第三点,为啥要<code>volatile</code>关键字,原先对它的理解是它修饰的变量在 JMM 中能及时将变量值写到主存中,但是它还有个很重要的作用,就是防止指令重排序,<code>instance = new Singleton();</code>这行代码其实在底层是分成三条指令执行的,第一条是在堆上申请了一块内存放这个对象,但是对象的字段啥的都还是默认值,第二条是设置对象的值,比如上面的 m 是 9,然后第三条是将这个对象和虚拟机栈上的指针建立引用关联,那么如果我不用<code>volatile</code>关键字,这三条指令就有可能出现重排,比如变成了 1-3-2 这种顺序,当执行完第二步时,有个线程来访问这个对象了,先判断是不是空,发现不是空的,就拿去直接用了,是不是就出现问题了,所以这个<code>volatile</code>也是不可缺少的</p>
<h2 id="嵌套类"><a href="#嵌套类" class="headerlink" title="嵌套类"></a>嵌套类</h2><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Singleton3</span> </span>&#123;</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">private</span> <span class="title">Singleton3</span><span class="params">()</span> </span>&#123;&#125;</span><br><span class="line"> <span class="comment">// 主要是使用了 嵌套类可以访问外部类的静态属性和静态方法 的特性</span></span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="class"><span class="keyword">class</span> <span class="title">Holder</span> </span>&#123;</span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">static</span> Singleton3 instance = <span class="keyword">new</span> Singleton3();</span><br><span class="line"> &#125;</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> Singleton3 <span class="title">getInstance</span><span class="params">()</span> </span>&#123;</span><br><span class="line"> <span class="keyword">return</span> Holder.instance;</span><br><span class="line"> &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>
<p>这个我个人感觉是饿汉模式的升级版,可以在调用<code>getInstance</code>的时候去实例化对象,也是比较推荐的</p>
<h2 id="枚举单例"><a href="#枚举单例" class="headerlink" title="枚举单例"></a>枚举单例</h2><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">enum</span> Singleton &#123;</span><br><span class="line"> INSTANCE;</span><br><span class="line"> </span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">doSomething</span><span class="params">()</span></span>&#123;</span><br><span class="line"> <span class="comment">//todo doSomething</span></span><br><span class="line"> &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>
<p>枚举很特殊,它在类加载的时候会初始化里面的所有的实例,而且 JVM 保证了它们不会再被实例化,所以它天生就是单例的。</p>
</div>
@ -1255,7 +793,7 @@
<nav class="pagination">
<a class="extend prev" rel="prev" href="/page/4/"><i class="fa fa-angle-left" aria-label="Previous page"></i></a><a class="page-number" href="/">1</a><span class="space">&hellip;</span><a class="page-number" href="/page/4/">4</a><span class="page-number current">5</span><a class="page-number" href="/page/6/">6</a><a class="extend next" rel="next" href="/page/6/"><i class="fa fa-angle-right" aria-label="Next page"></i></a>
<a class="extend prev" rel="prev" href="/page/4/"><i class="fa fa-angle-left" aria-label="Previous page"></i></a><a class="page-number" href="/">1</a><span class="space">&hellip;</span><a class="page-number" href="/page/4/">4</a><span class="page-number current">5</span><a class="page-number" href="/page/6/">6</a><span class="space">&hellip;</span><a class="page-number" href="/page/11/">11</a><a class="extend next" rel="next" href="/page/6/"><i class="fa fa-angle-right" aria-label="Next page"></i></a>
</nav>


+ 409
- 19
page/6/index.html
File diff suppressed because it is too large
View File


+ 1072
- 0
page/7/index.html
File diff suppressed because it is too large
View File


+ 1073
- 0
page/8/index.html
File diff suppressed because it is too large
View File


+ 1082
- 0
page/9/index.html
File diff suppressed because it is too large
View File


+ 14
- 14
sitemap.xml View File

@ -184,14 +184,14 @@
</url>
<url>
<loc>https://nicksxs.me/2015/01/14/Two-Sum/</loc>
<loc>https://nicksxs.me/2019/12/10/Redis-Part-1/</loc>
<lastmod>2020-01-12T13:08:27.015Z</lastmod>
</url>
<url>
<loc>https://nicksxs.me/2019/12/10/Redis-Part-1/</loc>
<loc>https://nicksxs.me/2015/01/14/Two-Sum/</loc>
<lastmod>2020-01-12T13:08:27.015Z</lastmod>
@ -219,14 +219,14 @@
</url>
<url>
<loc>https://nicksxs.me/2015/03/13/Reverse-Integer/</loc>
<loc>https://nicksxs.me/2015/04/14/Add-Two-Number/</loc>
<lastmod>2020-01-12T13:08:27.012Z</lastmod>
</url>
<url>
<loc>https://nicksxs.me/2015/04/14/Add-Two-Number/</loc>
<loc>https://nicksxs.me/2015/03/13/Reverse-Integer/</loc>
<lastmod>2020-01-12T13:08:27.012Z</lastmod>
@ -247,14 +247,14 @@
</url>
<url>
<loc>https://nicksxs.me/2017/05/09/ambari-summary/</loc>
<loc>https://nicksxs.me/2019/06/18/openresty/</loc>
<lastmod>2020-01-12T13:08:27.010Z</lastmod>
</url>
<url>
<loc>https://nicksxs.me/2019/06/18/openresty/</loc>
<loc>https://nicksxs.me/2017/05/09/ambari-summary/</loc>
<lastmod>2020-01-12T13:08:27.010Z</lastmod>
@ -296,14 +296,14 @@
</url>
<url>
<loc>https://nicksxs.me/2017/03/28/spark-little-tips/</loc>
<loc>https://nicksxs.me/2014/12/23/my-new-post/</loc>
<lastmod>2020-01-12T13:08:26.998Z</lastmod>
</url>
<url>
<loc>https://nicksxs.me/2014/12/23/my-new-post/</loc>
<loc>https://nicksxs.me/2017/03/28/spark-little-tips/</loc>
<lastmod>2020-01-12T13:08:26.998Z</lastmod>
@ -324,28 +324,28 @@
</url>
<url>
<loc>https://nicksxs.me/2016/10/12/summary-ranges-228/</loc>
<loc>https://nicksxs.me/2015/06/22/invert-binary-tree/</loc>
<lastmod>2020-01-12T13:08:26.994Z</lastmod>
</url>
<url>
<loc>https://nicksxs.me/2015/06/22/invert-binary-tree/</loc>
<loc>https://nicksxs.me/2016/10/12/summary-ranges-228/</loc>
<lastmod>2020-01-12T13:08:26.994Z</lastmod>
</url>
<url>
<loc>https://nicksxs.me/2017/04/25/rabbitmq-tips/</loc>
<loc>https://nicksxs.me/2015/01/04/Path-Sum/</loc>
<lastmod>2020-01-12T13:08:26.993Z</lastmod>
</url>
<url>
<loc>https://nicksxs.me/2015/01/04/Path-Sum/</loc>
<loc>https://nicksxs.me/2017/04/25/rabbitmq-tips/</loc>
<lastmod>2020-01-12T13:08:26.993Z</lastmod>
@ -359,14 +359,14 @@
</url>
<url>
<loc>https://nicksxs.me/2015/04/15/Leetcode-No-3/</loc>
<loc>https://nicksxs.me/2019/09/23/AbstractQueuedSynchronizer/</loc>
<lastmod>2020-01-12T13:08:26.991Z</lastmod>
</url>
<url>
<loc>https://nicksxs.me/2019/09/23/AbstractQueuedSynchronizer/</loc>
<loc>https://nicksxs.me/2015/04/15/Leetcode-No-3/</loc>
<lastmod>2020-01-12T13:08:26.991Z</lastmod>


+ 184
- 196
tags/c/index.html View File

@ -29,7 +29,7 @@
<meta name="description" content="learn from zero,技术博客,Nicksxs,史学森">
<meta property="og:type" content="website">
<meta property="og:title" content="Nicksxs&#39;s Blog">
<meta property="og:url" content="https://nicksxs.me/tags/c/index.html">
<meta property="og:url" content="https://nicksxs.me/tags/C/index.html">
<meta property="og:site_name" content="Nicksxs&#39;s Blog">
<meta property="og:description" content="learn from zero,技术博客,Nicksxs,史学森">
<meta property="article:author" content="Nicksxs">
@ -40,7 +40,7 @@
<meta property="article:tag" content="森哥">
<meta name="twitter:card" content="summary">
<link rel="canonical" href="https://nicksxs.me/tags/c/">
<link rel="canonical" href="https://nicksxs.me/tags/C/">
<script id="page-configurations">
@ -53,7 +53,7 @@
};
</script>
<title>Tag: c++ | Nicksxs's Blog</title>
<title>Tag: C | Nicksxs's Blog</title>
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-61358619-1"></script>
<script>
@ -207,14 +207,14 @@
<div class="post-block">
<div class="posts-collapse">
<div class="collection-title">
<h2 class="collection-header">c++
<h2 class="collection-header">C
<small>Tag</small>
</h2>
</div>
<div class="collection-year">
<span class="collection-header">2016</span>
<span class="collection-header">2019</span>
</div>
<article itemscope itemtype="http://schema.org/Article">
@ -222,198 +222,15 @@
<div class="post-meta">
<time itemprop="dateCreated"
datetime="2016-10-12T23:25:17+08:00"
content="2016-10-12">
10-12
datetime="2019-12-10T23:26:26+08:00"
content="2019-12-10">
12-10
</time>
</div>
<div class="post-title">
<a class="post-title-link" href="/2016/10/12/summary-ranges-228/" itemprop="url">
<span itemprop="name">summary-ranges-228</span>
</a>
</div>
</header>
</article>
<article itemscope itemtype="http://schema.org/Article">
<header class="post-header">
<div class="post-meta">
<time itemprop="dateCreated"
datetime="2016-10-11T22:04:28+08:00"
content="2016-10-11">
10-11
</time>
</div>
<div class="post-title">
<a class="post-title-link" href="/2016/10/11/minimum-size-subarray-sum-209/" itemprop="url">
<span itemprop="name">minimum-size-subarray-sum-209</span>
</a>
</div>
</header>
</article>
<article itemscope itemtype="http://schema.org/Article">
<header class="post-header">
<div class="post-meta">
<time itemprop="dateCreated"
datetime="2016-09-29T23:16:06+08:00"
content="2016-09-29">
09-29
</time>
</div>
<div class="post-title">
<a class="post-title-link" href="/2016/09/29/binary-watch/" itemprop="url">
<span itemprop="name">binary-watch</span>
</a>
</div>
</header>
</article>
<article itemscope itemtype="http://schema.org/Article">
<header class="post-header">
<div class="post-meta">
<time itemprop="dateCreated"
datetime="2016-08-14T21:33:24+08:00"
content="2016-08-14">
08-14
</time>
</div>
<div class="post-title">
<a class="post-title-link" href="/2016/08/14/34-Search-for-a-Range/" itemprop="url">
<span itemprop="name">34_Search_for_a_Range</span>
</a>
</div>
</header>
</article>
<div class="collection-year">
<span class="collection-header">2015</span>
</div>
<article itemscope itemtype="http://schema.org/Article">
<header class="post-header">
<div class="post-meta">
<time itemprop="dateCreated"
datetime="2015-06-22T10:29:44+08:00"
content="2015-06-22">
06-22
</time>
</div>
<div class="post-title">
<a class="post-title-link" href="/2015/06/22/invert-binary-tree/" itemprop="url">
<span itemprop="name">invert-binary-tree</span>
</a>
</div>
</header>
</article>
<article itemscope itemtype="http://schema.org/Article">
<header class="post-header">
<div class="post-meta">
<time itemprop="dateCreated"
datetime="2015-04-15T13:49:00+08:00"
content="2015-04-15">
04-15
</time>
</div>
<div class="post-title">
<a class="post-title-link" href="/2015/04/15/Leetcode-No-3/" itemprop="url">
<span itemprop="name">leetcode no.3</span>
</a>
</div>
</header>
</article>
<article itemscope itemtype="http://schema.org/Article">
<header class="post-header">
<div class="post-meta">
<time itemprop="dateCreated"
datetime="2015-04-14T17:40:10+08:00"
content="2015-04-14">
04-14
</time>
</div>
<div class="post-title">
<a class="post-title-link" href="/2015/04/14/Add-Two-Number/" itemprop="url">
<span itemprop="name">add-two-number</span>
</a>
</div>
</header>
</article>
<article itemscope itemtype="http://schema.org/Article">
<header class="post-header">
<div class="post-meta">
<time itemprop="dateCreated"
datetime="2015-03-13T17:22:20+08:00"
content="2015-03-13">
03-13
</time>
</div>
<div class="post-title">
<a class="post-title-link" href="/2015/03/13/Reverse-Integer/" itemprop="url">
<span itemprop="name">Reverse Integer</span>
</a>
</div>
</header>
</article>
<article itemscope itemtype="http://schema.org/Article">
<header class="post-header">
<div class="post-meta">
<time itemprop="dateCreated"
datetime="2015-03-11T17:35:20+08:00"
content="2015-03-11">
03-11
</time>
</div>
<div class="post-title">
<a class="post-title-link" href="/2015/03/11/Reverse-Bits/" itemprop="url">
<span itemprop="name">Reverse Bits</span>
</a>
</div>
</header>
</article>
<article itemscope itemtype="http://schema.org/Article">
<header class="post-header">
<div class="post-meta">
<time itemprop="dateCreated"
datetime="2015-03-11T17:02:58+08:00"
content="2015-03-11">
03-11
</time>
</div>
<div class="post-title">
<a class="post-title-link" href="/2015/03/11/Number-Of-1-Bits/" itemprop="url">
<span itemprop="name">Number of 1 Bits</span>
<a class="post-title-link" href="/2019/12/10/Redis-Part-1/" itemprop="url">
<span itemprop="name">Redis_分布式锁</span>
</a>
</div>
@ -427,9 +244,6 @@
<nav class="pagination">
<span class="page-number current">1</span><a class="page-number" href="/tags/c/page/2/">2</a><a class="extend next" rel="next" href="/tags/c/page/2/"><i class="fa fa-angle-right" aria-label="Next page"></i></a>
</nav>
@ -763,6 +577,180 @@
<script src="//cdn.jsdelivr.net/npm/quicklink@1/dist/quicklink.umd.js"></script>
<script>
window.addEventListener('load', () => {
quicklink({
timeout : 3000,
priority: true,
ignores : [uri => uri.includes('#'),uri => uri === 'https://nicksxs.me/tags/C/',]
});
});
</script>
<script>
function loadCount() {
var d = document, s = d.createElement('script');
s.src = 'https://nicksxs.disqus.com/count.js';
s.id = 'dsq-count-scr';
(d.head || d.body).appendChild(s);
}
// defer loading until the whole page loading is completed
window.addEventListener('load', loadCount, false);
</script>
</body>
</html>
</span>
</span>
</div>
<script>
(function() {
function leancloudSelector(url) {
url = encodeURI(url);
return document.getElementById(url).querySelector('.leancloud-visitors-count');
}
function addCount(Counter) {
var visitors = document.querySelector('.leancloud_visitors');
var url = decodeURI(visitors.id);
var title = visitors.dataset.flagTitle;
Counter('get', '/classes/Counter?where=' + encodeURIComponent(JSON.stringify({ url })))
.then(response => response.json())
.then(({ results }) => {
if (results.length > 0) {
var counter = results[0];
leancloudSelector(url).innerText = counter.time + 1;
Counter('put', '/classes/Counter/' + counter.objectId, { time: { '__op': 'Increment', 'amount': 1 } })
.catch(error => {
console.error('Failed to save visitor count', error);
});
} else {
leancloudSelector(url).innerText = 'Counter not initialized! More info at console err msg.';
console.error('ATTENTION! LeanCloud counter has security bug, see how to solve it here: https://github.com/theme-next/hexo-leancloud-counter-security. \n However, you can still use LeanCloud without security, by setting `security` option to `false`.');
}
})
.catch(error => {
console.error('LeanCloud Counter Error', error);
});
}
function showTime(Counter) {
var visitors = document.querySelectorAll('.leancloud_visitors');
var entries = [...visitors].map(element => {
return decodeURI(element.id);
});
Counter('get', '/classes/Counter?where=' + encodeURIComponent(JSON.stringify({ url: { '$in': entries } })))
.then(response => response.json())
.then(({ results }) => {
for (let url of entries) {
let target = results.find(item => item.url === url);
leancloudSelector(url).innerText = target ? target.time : 0;
}
})
.catch(error => {
console.error('LeanCloud Counter Error', error);
});
}
let { app_id, app_key, server_url } = {"enable":true,"app_id":"ysza182Vghlqjdt7QiwGLLJy-gzGzoHsz","app_key":"s9GDqbn7gnGGkusf66YRVccw","server_url":"https://leancloud.cn","security":true};
function fetchData(api_server) {
var Counter = (method, url, data) => {
return fetch(`${api_server}/1.1${url}`, {
method,
headers: {
'X-LC-Id' : app_id,
'X-LC-Key' : app_key,
'Content-Type': 'application/json',
},
body: JSON.stringify(data)
});
};
if (CONFIG.page.isPost) {
if (CONFIG.hostname !== location.hostname) return;
addCount(Counter);
} else if (document.querySelectorAll('.post-title-link').length >= 1) {
showTime(Counter);
}
}
let api_server = app_id.slice(-9) !== '-MdYXbMMI' ? server_url : `https://${app_id.slice(0, 8).toLowerCase()}.api.lncldglobal.com`;
if (api_server) {
fetchData(api_server);
} else {
fetch('https://app-router.leancloud.cn/2/route?appId=' + app_id)
.then(response => response.json())
.then(({ api_server }) => {
fetchData('https://' + api_server);
});
}
})();
</script>
</div>
</footer>
</div>
<script src="/lib/anime.min.js"></script>
<script src="//cdn.jsdelivr.net/npm/jquery@3/dist/jquery.min.js"></script>
<script src="//cdn.jsdelivr.net/gh/fancyapps/fancybox@3/dist/jquery.fancybox.min.js"></script>
<script src="//cdn.jsdelivr.net/npm/lozad@1/dist/lozad.min.js"></script>
<script src="/lib/velocity/velocity.min.js"></script>
<script src="/lib/velocity/velocity.ui.min.js"></script>
<script src="/js/utils.js"></script>
<script src="/js/motion.js"></script>
<script src="/js/schemes/pisces.js"></script>
<script src="/js/next-boot.js"></script>
<script>
(function(){
var bp = document.createElement('script');
var curProtocol = window.location.protocol.split(':')[0];
bp.src = (curProtocol === 'https') ? 'https://zz.bdstatic.com/linksubmit/push.js' : 'http://push.zhanzhang.baidu.com/push.js';
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(bp, s);
})();
</script>
<script src="//cdn.jsdelivr.net/npm/quicklink@1/dist/quicklink.umd.js"></script>
<script>
window.addEventListener('load', () => {


Loading…
Cancel
Save