leveldb源码分析21.html 93 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739
  1. <!DOCTYPE HTML>
  2. <html lang="" >
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
  6. <title>leveldb源码分析21 · 高性能服务器开发 技术专栏</title>
  7. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  8. <meta name="description" content="">
  9. <meta name="generator" content="GitBook 3.2.3">
  10. <meta name="author" content="easy_coder">
  11. <link rel="stylesheet" href="../../gitbook/style.css">
  12. <link rel="stylesheet" href="../../gitbook/gitbook-plugin-chapter-fold/chapter-fold.css">
  13. <link rel="stylesheet" href="../../gitbook/gitbook-plugin-search-pro/search.css">
  14. <link rel="stylesheet" href="../../gitbook/gitbook-plugin-splitter/splitter.css">
  15. <link rel="stylesheet" href="../../gitbook/gitbook-plugin-back-to-top-button/plugin.css">
  16. <link rel="stylesheet" href="../../gitbook/gitbook-plugin-prism/prism.css">
  17. <link rel="stylesheet" href="../../gitbook/gitbook-plugin-tbfed-pagefooter/footer.css">
  18. <link rel="stylesheet" href="../../gitbook/gitbook-plugin-code/plugin.css">
  19. <link rel="stylesheet" href="../../gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css">
  20. <link rel="stylesheet" href="../../gitbook/gitbook-plugin-fontsettings/website.css">
  21. <link rel="stylesheet" href="../../gitbook/gitbook-plugin-theme-fexa/fexa.css">
  22. <meta name="HandheldFriendly" content="true"/>
  23. <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
  24. <meta name="apple-mobile-web-app-capable" content="yes">
  25. <meta name="apple-mobile-web-app-status-bar-style" content="black">
  26. <link rel="apple-touch-icon-precomposed" sizes="152x152" href="../../gitbook/images/apple-touch-icon-precomposed-152.png">
  27. <link rel="shortcut icon" href="../../gitbook/images/favicon.ico" type="image/x-icon">
  28. <link rel="next" href="leveldb源码分析22.html" />
  29. <link rel="prev" href="leveldb源码分析20.html" />
  30. </head>
  31. <body>
  32. <div class="book">
  33. <div class="header-inner">
  34. <!-- LOGO -->
  35. <div class="logo"></div>
  36. <span class="title"></span>
  37. <!-- Search -->
  38. <div id="book-search-input" role="search">
  39. <input type="text" placeholder="Type to search" />
  40. </div>
  41. <!-- Nav -->
  42. <ul class="header-nav">
  43. </ul>
  44. </div>
  45. <div class="book-summary">
  46. <div class="book-summary-title">文档目录</div>
  47. <nav role="navigation">
  48. <ul class="summary">
  49. <li class="header">Part I</li>
  50. <li class="chapter " data-level="1.1" data-path="../../">
  51. <a href="../../">
  52. Introduction
  53. </a>
  54. </li>
  55. <li class="chapter " data-level="1.2" data-path="../C++必知必会的知识点/">
  56. <a href="../C++必知必会的知识点/">
  57. C++必知必会的知识点
  58. </a>
  59. <ul class="articles">
  60. <li class="chapter " data-level="1.2.1" data-path="../C++必知必会的知识点/如何成为一名合格的CC++开发者?.html">
  61. <a href="../C++必知必会的知识点/如何成为一名合格的CC++开发者?.html">
  62. 如何成为一名合格的C/C++开发者?
  63. </a>
  64. </li>
  65. <li class="chapter " data-level="1.2.2" data-path="../C++必知必会的知识点/不定参数函数实现var_arg系列的宏.html">
  66. <a href="../C++必知必会的知识点/不定参数函数实现var_arg系列的宏.html">
  67. 不定参数函数实现var_arg系列的宏
  68. </a>
  69. </li>
  70. <li class="chapter " data-level="1.2.3" data-path="../C++必知必会的知识点/你一定要搞明白的C函数调用方式与栈原理.html">
  71. <a href="../C++必知必会的知识点/你一定要搞明白的C函数调用方式与栈原理.html">
  72. 你一定要搞明白的C函数调用方式与栈原理
  73. </a>
  74. </li>
  75. <li class="chapter " data-level="1.2.4" data-path="../C++必知必会的知识点/深入理解CC++中的指针.html">
  76. <a href="../C++必知必会的知识点/深入理解CC++中的指针.html">
  77. 深入理解C/C++中的指针
  78. </a>
  79. </li>
  80. <li class="chapter " data-level="1.2.5" data-path="../C++必知必会的知识点/详解C++11中的智能指针.html">
  81. <a href="../C++必知必会的知识点/详解C++11中的智能指针.html">
  82. 详解C++11中的智能指针
  83. </a>
  84. </li>
  85. <li class="chapter " data-level="1.2.6" data-path="../C++必知必会的知识点/C++17结构化绑定.html">
  86. <a href="../C++必知必会的知识点/C++17结构化绑定.html">
  87. C++17结构化绑定
  88. </a>
  89. </li>
  90. <li class="chapter " data-level="1.2.7" data-path="../C++必知必会的知识点/C++必须掌握的pimpl惯用法.html">
  91. <a href="../C++必知必会的知识点/C++必须掌握的pimpl惯用法.html">
  92. C++必须掌握的pimpl惯用法
  93. </a>
  94. </li>
  95. <li class="chapter " data-level="1.2.8" data-path="../C++必知必会的知识点/用VisualStudio调试Linux程序.html">
  96. <a href="../C++必知必会的知识点/用VisualStudio调试Linux程序.html">
  97. 用Visual Studio调试Linux程序
  98. </a>
  99. </li>
  100. <li class="chapter " data-level="1.2.9" data-path="../C++必知必会的知识点/如何使用VisualStudio管理和阅读开源项目代码.html">
  101. <a href="../C++必知必会的知识点/如何使用VisualStudio管理和阅读开源项目代码.html">
  102. 如何使用Visual Studio管理和阅读开源项目代码
  103. </a>
  104. </li>
  105. <li class="chapter " data-level="1.2.10" data-path="../C++必知必会的知识点/利用cmake工具生成VisualStudio工程文件.html">
  106. <a href="../C++必知必会的知识点/利用cmake工具生成VisualStudio工程文件.html">
  107. 利用cmake工具生成Visual Studio工程文件
  108. </a>
  109. </li>
  110. </ul>
  111. </li>
  112. <li class="chapter " data-level="1.3" data-path="../多线程/">
  113. <a href="../多线程/">
  114. 多线程
  115. </a>
  116. <ul class="articles">
  117. <li class="chapter " data-level="1.3.1" data-path="../多线程/后台C++开发你一定要知道的条件变量.html">
  118. <a href="../多线程/后台C++开发你一定要知道的条件变量.html">
  119. 后台C++开发你一定要知道的条件变量
  120. </a>
  121. </li>
  122. <li class="chapter " data-level="1.3.2" data-path="../多线程/整型变量赋值是原子操作吗?.html">
  123. <a href="../多线程/整型变量赋值是原子操作吗?.html">
  124. 整型变量赋值是原子操作吗?
  125. </a>
  126. </li>
  127. </ul>
  128. </li>
  129. <li class="divider"></li>
  130. <li class="chapter " data-level="2.1" data-path="../网络编程/">
  131. <a href="../网络编程/">
  132. 网络编程
  133. </a>
  134. <ul class="articles">
  135. <li class="chapter " data-level="2.1.1" data-path="../网络编程/bind函数重难点解析.html">
  136. <a href="../网络编程/bind函数重难点解析.html">
  137. bind 函数重难点解析
  138. </a>
  139. </li>
  140. <li class="chapter " data-level="2.1.2" data-path="../网络编程/connect函数在阻塞和非阻塞模式下的行为.html">
  141. <a href="../网络编程/connect函数在阻塞和非阻塞模式下的行为.html">
  142. connect 函数在阻塞和非阻塞模式下的行为
  143. </a>
  144. </li>
  145. <li class="chapter " data-level="2.1.3" data-path="../网络编程/select函数重难点解析.html">
  146. <a href="../网络编程/select函数重难点解析.html">
  147. select 函数重难点解析
  148. </a>
  149. </li>
  150. <li class="chapter " data-level="2.1.4" data-path="../网络编程/Linuxepoll模型(含LT模式和ET模式详解).html">
  151. <a href="../网络编程/Linuxepoll模型(含LT模式和ET模式详解).html">
  152. Linux epoll 模型(含LT 模式和 ET 模式详解)
  153. </a>
  154. </li>
  155. <li class="chapter " data-level="2.1.5" data-path="../网络编程/socket的阻塞模式和非阻塞模式.html">
  156. <a href="../网络编程/socket的阻塞模式和非阻塞模式.html">
  157. socket 的阻塞模式和非阻塞模式
  158. </a>
  159. </li>
  160. <li class="chapter " data-level="2.1.6" data-path="../网络编程/非阻塞模式下send和recv函数的返回值.html">
  161. <a href="../网络编程/非阻塞模式下send和recv函数的返回值.html">
  162. 非阻塞模式下 send 和 recv 函数的返回值
  163. </a>
  164. </li>
  165. <li class="chapter " data-level="2.1.7" data-path="../网络编程/服务器开发通信协议设计介绍.html">
  166. <a href="../网络编程/服务器开发通信协议设计介绍.html">
  167. 服务器开发通信协议设计介绍
  168. </a>
  169. </li>
  170. <li class="chapter " data-level="2.1.8" data-path="../网络编程/TCP协议如何解决粘包、半包问题.html">
  171. <a href="../网络编程/TCP协议如何解决粘包、半包问题.html">
  172. TCP 协议如何解决粘包、半包问题
  173. </a>
  174. </li>
  175. <li class="chapter " data-level="2.1.9" data-path="../网络编程/网络通信中收发数据的正确姿势.html">
  176. <a href="../网络编程/网络通信中收发数据的正确姿势.html">
  177. 网络通信中收发数据的正确姿势
  178. </a>
  179. </li>
  180. <li class="chapter " data-level="2.1.10" data-path="../网络编程/服务器端发数据时,如果对端一直不收,怎么办?.html">
  181. <a href="../网络编程/服务器端发数据时,如果对端一直不收,怎么办?.html">
  182. 服务器端发数据时,如果对端一直不收,怎么办?
  183. </a>
  184. </li>
  185. </ul>
  186. </li>
  187. <li class="divider"></li>
  188. <li class="chapter " data-level="3.1" data-path="../程序员必知必会的网络命令/">
  189. <a href="../程序员必知必会的网络命令/">
  190. 程序员必知必会的网络命令
  191. </a>
  192. <ul class="articles">
  193. <li class="chapter " data-level="3.1.1" data-path="../程序员必知必会的网络命令/利用telnet命令发电子邮件.html">
  194. <a href="../程序员必知必会的网络命令/利用telnet命令发电子邮件.html">
  195. 利用telnet命令发电子邮件
  196. </a>
  197. </li>
  198. <li class="chapter " data-level="3.1.2" data-path="../程序员必知必会的网络命令/做Java或者C++开发都应该知道的lsof命令.html">
  199. <a href="../程序员必知必会的网络命令/做Java或者C++开发都应该知道的lsof命令.html">
  200. 做Java或者C++开发都应该知道的lsof命令
  201. </a>
  202. </li>
  203. <li class="chapter " data-level="3.1.3" data-path="../程序员必知必会的网络命令/Linux网络故障排查的瑞士军刀.html">
  204. <a href="../程序员必知必会的网络命令/Linux网络故障排查的瑞士军刀.html">
  205. Linux网络故障排查的瑞士军刀nc命令
  206. </a>
  207. </li>
  208. <li class="chapter " data-level="3.1.4" data-path="../程序员必知必会的网络命令/Linuxtcpdump使用介绍.html">
  209. <a href="../程序员必知必会的网络命令/Linuxtcpdump使用介绍.html">
  210. Linux tcpdump使用详解
  211. </a>
  212. </li>
  213. <li class="chapter " data-level="3.1.5" data-path="../程序员必知必会的网络命令/从抓包的角度分析connect函数的连接过程.html">
  214. <a href="../程序员必知必会的网络命令/从抓包的角度分析connect函数的连接过程.html">
  215. 从抓包的角度分析connect函数的连接过程
  216. </a>
  217. </li>
  218. <li class="chapter " data-level="3.1.6" data-path="../程序员必知必会的网络命令/服务器开发中网络数据分析与故障排查经验漫谈.html">
  219. <a href="../程序员必知必会的网络命令/服务器开发中网络数据分析与故障排查经验漫谈.html">
  220. 服务器开发中网络数据分析与故障排查经验漫谈
  221. </a>
  222. </li>
  223. </ul>
  224. </li>
  225. <li class="header">Part II</li>
  226. <li class="chapter " data-level="4.1" data-path="../高性能服务器框架设计/">
  227. <a href="../高性能服务器框架设计/">
  228. 高性能服务器框架设计
  229. </a>
  230. <ul class="articles">
  231. <li class="chapter " data-level="4.1.1" data-path="../高性能服务器框架设计/主线程与工作线程的分工.html">
  232. <a href="../高性能服务器框架设计/主线程与工作线程的分工.html">
  233. 主线程与工作线程的分工
  234. </a>
  235. </li>
  236. <li class="chapter " data-level="4.1.2" data-path="../高性能服务器框架设计/Reactor模式.html">
  237. <a href="../高性能服务器框架设计/Reactor模式.html">
  238. Reactor模式
  239. </a>
  240. </li>
  241. <li class="chapter " data-level="4.1.3" data-path="../高性能服务器框架设计/实例:一个服务器程序的架构介绍.html">
  242. <a href="../高性能服务器框架设计/实例:一个服务器程序的架构介绍.html">
  243. 实例:一个服务器程序的架构介绍
  244. </a>
  245. </li>
  246. <li class="chapter " data-level="4.1.4" data-path="../高性能服务器框架设计/错误码系统的设计.html">
  247. <a href="../高性能服务器框架设计/错误码系统的设计.html">
  248. 错误码系统的设计
  249. </a>
  250. </li>
  251. <li class="chapter " data-level="4.1.5" data-path="../高性能服务器框架设计/日志系统的设计.html">
  252. <a href="../高性能服务器框架设计/日志系统的设计.html">
  253. 日志系统的设计
  254. </a>
  255. </li>
  256. <li class="chapter " data-level="4.1.6" data-path="../高性能服务器框架设计/如何设计断线自动重连机制.html">
  257. <a href="../高性能服务器框架设计/如何设计断线自动重连机制.html">
  258. 如何设计断线自动重连机制
  259. </a>
  260. </li>
  261. <li class="chapter " data-level="4.1.7" data-path="../高性能服务器框架设计/心跳包机制设计详解.html">
  262. <a href="../高性能服务器框架设计/心跳包机制设计详解.html">
  263. 心跳包机制设计详解
  264. </a>
  265. </li>
  266. <li class="chapter " data-level="4.1.8" data-path="../高性能服务器框架设计/业务数据处理一定要单独开线程吗.html">
  267. <a href="../高性能服务器框架设计/业务数据处理一定要单独开线程吗.html">
  268. 业务数据处理一定要单独开线程吗
  269. </a>
  270. </li>
  271. <li class="chapter " data-level="4.1.9" data-path="../高性能服务器框架设计/C++高性能服务器网络框架设计细节.html">
  272. <a href="../高性能服务器框架设计/C++高性能服务器网络框架设计细节.html">
  273. C++ 高性能服务器网络框架设计细节
  274. </a>
  275. </li>
  276. </ul>
  277. </li>
  278. <li class="divider"></li>
  279. <li class="chapter " data-level="5.1" data-path="../服务器开发案例实战/">
  280. <a href="../服务器开发案例实战/">
  281. 服务器开发案例实战
  282. </a>
  283. <ul class="articles">
  284. <li class="chapter " data-level="5.1.1" data-path="../服务器开发案例实战/从零实现一个http服务器.html">
  285. <a href="../服务器开发案例实战/从零实现一个http服务器.html">
  286. 从零实现一个http服务器
  287. </a>
  288. </li>
  289. <li class="chapter " data-level="5.1.2" data-path="../服务器开发案例实战/从零实现一款12306刷票软件.html">
  290. <a href="../服务器开发案例实战/从零实现一款12306刷票软件.html">
  291. 从零实现一款12306刷票软件
  292. </a>
  293. </li>
  294. <li class="chapter " data-level="5.1.3" data-path="../服务器开发案例实战/从零实现一个邮件收发客户端.html">
  295. <a href="../服务器开发案例实战/从零实现一个邮件收发客户端.html">
  296. 从零实现一个邮件收发客户端
  297. </a>
  298. </li>
  299. <li class="chapter " data-level="5.1.4" data-path="../服务器开发案例实战/从零开发一个WebSocket服务器.html">
  300. <a href="../服务器开发案例实战/从零开发一个WebSocket服务器.html">
  301. 从零开发一个WebSocket服务器
  302. </a>
  303. </li>
  304. <li class="chapter " data-level="5.1.5" data-path="../服务器开发案例实战/1从一款多人联机实时对战游戏开始.html">
  305. <a href="../服务器开发案例实战/1从一款多人联机实时对战游戏开始.html">
  306. 从零学习开源项目系列(一) 从一款多人联机实时对战游戏开始
  307. </a>
  308. </li>
  309. <li class="chapter " data-level="5.1.6" data-path="../服务器开发案例实战/2最后一战概况.html">
  310. <a href="../服务器开发案例实战/2最后一战概况.html">
  311. 从零学习开源项目系列(二) 最后一战概况
  312. </a>
  313. </li>
  314. <li class="chapter " data-level="5.1.7" data-path="../服务器开发案例实战/3CSBattleMgr服务源码研究.html">
  315. <a href="../服务器开发案例实战/3CSBattleMgr服务源码研究.html">
  316. 从零学习开源项目系列(三) CSBattleMgr服务源码研究
  317. </a>
  318. </li>
  319. <li class="chapter " data-level="5.1.8" data-path="../服务器开发案例实战/4LogServer源码探究.html">
  320. <a href="../服务器开发案例实战/4LogServer源码探究.html">
  321. 从零学习开源项目系列(四)LogServer源码探究
  322. </a>
  323. </li>
  324. </ul>
  325. </li>
  326. <li class="header">Part III</li>
  327. <li class="chapter " data-level="6.1" data-path="../TeamTalk源码解析/">
  328. <a href="../TeamTalk源码解析/">
  329. TeamTalk IM源码分析
  330. </a>
  331. <ul class="articles">
  332. <li class="chapter " data-level="6.1.1" data-path="../TeamTalk源码解析/01TeamTalk介绍.html">
  333. <a href="../TeamTalk源码解析/01TeamTalk介绍.html">
  334. 01 TeamTalk介绍
  335. </a>
  336. </li>
  337. <li class="chapter " data-level="6.1.2" data-path="../TeamTalk源码解析/02服务器端的程序的编译与部署.html">
  338. <a href="../TeamTalk源码解析/02服务器端的程序的编译与部署.html">
  339. 02 服务器端的程序的编译与部署
  340. </a>
  341. </li>
  342. <li class="chapter " data-level="6.1.3" data-path="../TeamTalk源码解析/03服务器端的程序架构介绍.html">
  343. <a href="../TeamTalk源码解析/03服务器端的程序架构介绍.html">
  344. 03 服务器端的程序架构介绍
  345. </a>
  346. </li>
  347. <li class="chapter " data-level="6.1.4" data-path="../TeamTalk源码解析/04服务器端db_proxy_server源码分析.html">
  348. <a href="../TeamTalk源码解析/04服务器端db_proxy_server源码分析.html">
  349. 04 服务器端db_proxy_server源码分析
  350. </a>
  351. </li>
  352. <li class="chapter " data-level="6.1.5" data-path="../TeamTalk源码解析/05服务器端msg_server源码分析.html">
  353. <a href="../TeamTalk源码解析/05服务器端msg_server源码分析.html">
  354. 05 服务器端msg_server源码分析
  355. </a>
  356. </li>
  357. <li class="chapter " data-level="6.1.6" data-path="../TeamTalk源码解析/06服务器端login_server源码分析.html">
  358. <a href="../TeamTalk源码解析/06服务器端login_server源码分析.html">
  359. 06 服务器端login_server源码分析
  360. </a>
  361. </li>
  362. <li class="chapter " data-level="6.1.7" data-path="../TeamTalk源码解析/07服务器端msfs源码分析.html">
  363. <a href="../TeamTalk源码解析/07服务器端msfs源码分析.html">
  364. 07 服务器端msfs源码分析
  365. </a>
  366. </li>
  367. <li class="chapter " data-level="6.1.8" data-path="../TeamTalk源码解析/08服务器端file_server源码分析.html">
  368. <a href="../TeamTalk源码解析/08服务器端file_server源码分析.html">
  369. 08 服务器端file_server源码分析
  370. </a>
  371. </li>
  372. <li class="chapter " data-level="6.1.9" data-path="../TeamTalk源码解析/09服务器端route_server源码分析.html">
  373. <a href="../TeamTalk源码解析/09服务器端route_server源码分析.html">
  374. 09 服务器端route_server源码分析
  375. </a>
  376. </li>
  377. <li class="chapter " data-level="6.1.10" data-path="../TeamTalk源码解析/10开放一个TeamTalk测试服务器地址和几个测试账号.html">
  378. <a href="../TeamTalk源码解析/10开放一个TeamTalk测试服务器地址和几个测试账号.html">
  379. 10 开放一个TeamTalk测试服务器地址和几个测试账号
  380. </a>
  381. </li>
  382. <li class="chapter " data-level="6.1.11" data-path="../TeamTalk源码解析/11pc客户端源码分析.html">
  383. <a href="../TeamTalk源码解析/11pc客户端源码分析.html">
  384. 11 pc客户端源码分析
  385. </a>
  386. </li>
  387. </ul>
  388. </li>
  389. <li class="divider"></li>
  390. <li class="chapter " data-level="7.1" data-path="../libevent源码深度剖析/">
  391. <a href="../libevent源码深度剖析/">
  392. libevent源码深度剖析
  393. </a>
  394. <ul class="articles">
  395. <li class="chapter " data-level="7.1.1" data-path="../libevent源码深度剖析/libevent源码深度剖析01.html">
  396. <a href="../libevent源码深度剖析/libevent源码深度剖析01.html">
  397. libevent源码深度剖析01
  398. </a>
  399. </li>
  400. <li class="chapter " data-level="7.1.2" data-path="../libevent源码深度剖析/libevent源码深度剖析02.html">
  401. <a href="../libevent源码深度剖析/libevent源码深度剖析02.html">
  402. libevent源码深度剖析02
  403. </a>
  404. </li>
  405. <li class="chapter " data-level="7.1.3" data-path="../libevent源码深度剖析/libevent源码深度剖析03.html">
  406. <a href="../libevent源码深度剖析/libevent源码深度剖析03.html">
  407. libevent源码深度剖析03
  408. </a>
  409. </li>
  410. <li class="chapter " data-level="7.1.4" data-path="../libevent源码深度剖析/libevent源码深度剖析04.html">
  411. <a href="../libevent源码深度剖析/libevent源码深度剖析04.html">
  412. libevent源码深度剖析04
  413. </a>
  414. </li>
  415. <li class="chapter " data-level="7.1.5" data-path="../libevent源码深度剖析/libevent源码深度剖析05.html">
  416. <a href="../libevent源码深度剖析/libevent源码深度剖析05.html">
  417. libevent源码深度剖析05
  418. </a>
  419. </li>
  420. <li class="chapter " data-level="7.1.6" data-path="../libevent源码深度剖析/libevent源码深度剖析06.html">
  421. <a href="../libevent源码深度剖析/libevent源码深度剖析06.html">
  422. libevent源码深度剖析06
  423. </a>
  424. </li>
  425. <li class="chapter " data-level="7.1.7" data-path="../libevent源码深度剖析/libevent源码深度剖析07.html">
  426. <a href="../libevent源码深度剖析/libevent源码深度剖析07.html">
  427. libevent源码深度剖析07
  428. </a>
  429. </li>
  430. <li class="chapter " data-level="7.1.8" data-path="../libevent源码深度剖析/libevent源码深度剖析08.html">
  431. <a href="../libevent源码深度剖析/libevent源码深度剖析08.html">
  432. libevent源码深度剖析08
  433. </a>
  434. </li>
  435. <li class="chapter " data-level="7.1.9" data-path="../libevent源码深度剖析/libevent源码深度剖析09.html">
  436. <a href="../libevent源码深度剖析/libevent源码深度剖析09.html">
  437. libevent源码深度剖析09
  438. </a>
  439. </li>
  440. <li class="chapter " data-level="7.1.10" data-path="../libevent源码深度剖析/libevent源码深度剖析10.html">
  441. <a href="../libevent源码深度剖析/libevent源码深度剖析10.html">
  442. libevent源码深度剖析10
  443. </a>
  444. </li>
  445. <li class="chapter " data-level="7.1.11" data-path="../libevent源码深度剖析/libevent源码深度剖析11.html">
  446. <a href="../libevent源码深度剖析/libevent源码深度剖析11.html">
  447. libevent源码深度剖析11
  448. </a>
  449. </li>
  450. <li class="chapter " data-level="7.1.12" data-path="../libevent源码深度剖析/libevent源码深度剖析12.html">
  451. <a href="../libevent源码深度剖析/libevent源码深度剖析12.html">
  452. libevent源码深度剖析12
  453. </a>
  454. </li>
  455. <li class="chapter " data-level="7.1.13" data-path="../libevent源码深度剖析/libevent源码深度剖析13.html">
  456. <a href="../libevent源码深度剖析/libevent源码深度剖析13.html">
  457. libevent源码深度剖析13
  458. </a>
  459. </li>
  460. </ul>
  461. </li>
  462. <li class="chapter " data-level="7.2" data-path="./">
  463. <a href="./">
  464. leveldb源码分析
  465. </a>
  466. <ul class="articles">
  467. <li class="chapter " data-level="7.2.1" data-path="leveldb源码分析1.html">
  468. <a href="leveldb源码分析1.html">
  469. leveldb源码分析1
  470. </a>
  471. </li>
  472. <li class="chapter " data-level="7.2.2" data-path="leveldb源码分析2.html">
  473. <a href="leveldb源码分析2.html">
  474. leveldb源码分析2
  475. </a>
  476. </li>
  477. <li class="chapter " data-level="7.2.3" data-path="leveldb源码分析3.html">
  478. <a href="leveldb源码分析3.html">
  479. leveldb源码分析3
  480. </a>
  481. </li>
  482. <li class="chapter " data-level="7.2.4" data-path="leveldb源码分析4.html">
  483. <a href="leveldb源码分析4.html">
  484. leveldb源码分析4
  485. </a>
  486. </li>
  487. <li class="chapter " data-level="7.2.5" data-path="leveldb源码分析5.html">
  488. <a href="leveldb源码分析5.html">
  489. leveldb源码分析5
  490. </a>
  491. </li>
  492. <li class="chapter " data-level="7.2.6" data-path="leveldb源码分析6.html">
  493. <a href="leveldb源码分析6.html">
  494. leveldb源码分析6
  495. </a>
  496. </li>
  497. <li class="chapter " data-level="7.2.7" data-path="leveldb源码分析7.html">
  498. <a href="leveldb源码分析7.html">
  499. leveldb源码分析7
  500. </a>
  501. </li>
  502. <li class="chapter " data-level="7.2.8" data-path="leveldb源码分析8.html">
  503. <a href="leveldb源码分析8.html">
  504. leveldb源码分析8
  505. </a>
  506. </li>
  507. <li class="chapter " data-level="7.2.9" data-path="leveldb源码分析9.html">
  508. <a href="leveldb源码分析9.html">
  509. leveldb源码分析9
  510. </a>
  511. </li>
  512. <li class="chapter " data-level="7.2.10" data-path="leveldb源码分析10.html">
  513. <a href="leveldb源码分析10.html">
  514. leveldb源码分析10
  515. </a>
  516. </li>
  517. <li class="chapter " data-level="7.2.11" data-path="leveldb源码分析11.html">
  518. <a href="leveldb源码分析11.html">
  519. leveldb源码分析11
  520. </a>
  521. </li>
  522. <li class="chapter " data-level="7.2.12" data-path="leveldb源码分析12.html">
  523. <a href="leveldb源码分析12.html">
  524. leveldb源码分析12
  525. </a>
  526. </li>
  527. <li class="chapter " data-level="7.2.13" data-path="leveldb源码分析13.html">
  528. <a href="leveldb源码分析13.html">
  529. leveldb源码分析13
  530. </a>
  531. </li>
  532. <li class="chapter " data-level="7.2.14" data-path="leveldb源码分析14.html">
  533. <a href="leveldb源码分析14.html">
  534. leveldb源码分析14
  535. </a>
  536. </li>
  537. <li class="chapter " data-level="7.2.15" data-path="leveldb源码分析15.html">
  538. <a href="leveldb源码分析15.html">
  539. leveldb源码分析15
  540. </a>
  541. </li>
  542. <li class="chapter " data-level="7.2.16" data-path="leveldb源码分析16.html">
  543. <a href="leveldb源码分析16.html">
  544. leveldb源码分析16
  545. </a>
  546. </li>
  547. <li class="chapter " data-level="7.2.17" data-path="leveldb源码分析17.html">
  548. <a href="leveldb源码分析17.html">
  549. leveldb源码分析17
  550. </a>
  551. </li>
  552. <li class="chapter " data-level="7.2.18" data-path="leveldb源码分析18.html">
  553. <a href="leveldb源码分析18.html">
  554. leveldb源码分析18
  555. </a>
  556. </li>
  557. <li class="chapter " data-level="7.2.19" data-path="leveldb源码分析19.html">
  558. <a href="leveldb源码分析19.html">
  559. leveldb源码分析19
  560. </a>
  561. </li>
  562. <li class="chapter " data-level="7.2.20" data-path="leveldb源码分析20.html">
  563. <a href="leveldb源码分析20.html">
  564. leveldb源码分析20
  565. </a>
  566. </li>
  567. <li class="chapter active" data-level="7.2.21" data-path="leveldb源码分析21.html">
  568. <a href="leveldb源码分析21.html">
  569. leveldb源码分析21
  570. </a>
  571. </li>
  572. <li class="chapter " data-level="7.2.22" data-path="leveldb源码分析22.html">
  573. <a href="leveldb源码分析22.html">
  574. leveldb源码分析22
  575. </a>
  576. </li>
  577. </ul>
  578. </li>
  579. <li class="divider"></li>
  580. <li class="chapter " data-level="8.1" data-path="../Memcached源码分析/">
  581. <a href="../Memcached源码分析/">
  582. Memcached源码分析
  583. </a>
  584. <ul class="articles">
  585. <li class="chapter " data-level="8.1.1" data-path="../Memcached源码分析/00服务器资源调整.html">
  586. <a href="../Memcached源码分析/00服务器资源调整.html">
  587. 00 服务器资源调整
  588. </a>
  589. </li>
  590. <li class="chapter " data-level="8.1.2" data-path="../Memcached源码分析/01初始化参数解析.html">
  591. <a href="../Memcached源码分析/01初始化参数解析.html">
  592. 01 初始化参数解析
  593. </a>
  594. </li>
  595. <li class="chapter " data-level="8.1.3" data-path="../Memcached源码分析/02网络监听的建立.html">
  596. <a href="../Memcached源码分析/02网络监听的建立.html">
  597. 02 网络监听的建立
  598. </a>
  599. </li>
  600. <li class="chapter " data-level="8.1.4" data-path="../Memcached源码分析/03网络连接建立.html">
  601. <a href="../Memcached源码分析/03网络连接建立.html">
  602. 03 网络连接建立
  603. </a>
  604. </li>
  605. <li class="chapter " data-level="8.1.5" data-path="../Memcached源码分析/04内存初始化.html">
  606. <a href="../Memcached源码分析/04内存初始化.html">
  607. 04 内存初始化
  608. </a>
  609. </li>
  610. <li class="chapter " data-level="8.1.6" data-path="../Memcached源码分析/05资源初始化.html">
  611. <a href="../Memcached源码分析/05资源初始化.html">
  612. 05 资源初始化
  613. </a>
  614. </li>
  615. <li class="chapter " data-level="8.1.7" data-path="../Memcached源码分析/06get过程.html">
  616. <a href="../Memcached源码分析/06get过程.html">
  617. 06 get过程
  618. </a>
  619. </li>
  620. <li class="chapter " data-level="8.1.8" data-path="../Memcached源码分析/07cas属性.html">
  621. <a href="../Memcached源码分析/07cas属性.html">
  622. 07 cas属性
  623. </a>
  624. </li>
  625. <li class="chapter " data-level="8.1.9" data-path="../Memcached源码分析/08内存池.html">
  626. <a href="../Memcached源码分析/08内存池.html">
  627. 08 内存池
  628. </a>
  629. </li>
  630. <li class="chapter " data-level="8.1.10" data-path="../Memcached源码分析/09连接队列.html">
  631. <a href="../Memcached源码分析/09连接队列.html">
  632. 09 连接队列
  633. </a>
  634. </li>
  635. <li class="chapter " data-level="8.1.11" data-path="../Memcached源码分析/10Hash表操作.html">
  636. <a href="../Memcached源码分析/10Hash表操作.html">
  637. 10 Hash表操作
  638. </a>
  639. </li>
  640. <li class="chapter " data-level="8.1.12" data-path="../Memcached源码分析/12set操作.html">
  641. <a href="../Memcached源码分析/12set操作.html">
  642. 12 set操作
  643. </a>
  644. </li>
  645. <li class="chapter " data-level="8.1.13" data-path="../Memcached源码分析/13do_item_alloc操作.html">
  646. <a href="../Memcached源码分析/13do_item_alloc操作.html">
  647. 13 do_item_alloc操作
  648. </a>
  649. </li>
  650. <li class="chapter " data-level="8.1.14" data-path="../Memcached源码分析/14item结构.html">
  651. <a href="../Memcached源码分析/14item结构.html">
  652. 14 item结构
  653. </a>
  654. </li>
  655. <li class="chapter " data-level="8.1.15" data-path="../Memcached源码分析/15Hash表扩容.html">
  656. <a href="../Memcached源码分析/15Hash表扩容.html">
  657. 15 Hash表扩容
  658. </a>
  659. </li>
  660. <li class="chapter " data-level="8.1.16" data-path="../Memcached源码分析/16线程交互.html">
  661. <a href="../Memcached源码分析/16线程交互.html">
  662. 16 线程交互
  663. </a>
  664. </li>
  665. <li class="chapter " data-level="8.1.17" data-path="../Memcached源码分析/17状态机.html">
  666. <a href="../Memcached源码分析/17状态机.html">
  667. 17 状态机
  668. </a>
  669. </li>
  670. </ul>
  671. </li>
  672. <li class="divider"></li>
  673. <li class="chapter " data-level="9.1" data-path="../游戏开发专题/">
  674. <a href="../游戏开发专题/">
  675. 游戏开发专题
  676. </a>
  677. <ul class="articles">
  678. <li class="chapter " data-level="9.1.1" data-path="../游戏开发专题/1游戏服务器开发的基本体系与服务器端开发的一些建议.html">
  679. <a href="../游戏开发专题/1游戏服务器开发的基本体系与服务器端开发的一些建议.html">
  680. 1 游戏服务器开发的基本体系与服务器端开发的一些建议
  681. </a>
  682. </li>
  683. <li class="chapter " data-level="9.1.2" data-path="../游戏开发专题/2网络游戏服务器开发框架设计介绍.html">
  684. <a href="../游戏开发专题/2网络游戏服务器开发框架设计介绍.html">
  685. 2 网络游戏服务器开发框架设计介绍
  686. </a>
  687. </li>
  688. <li class="chapter " data-level="9.1.3" data-path="../游戏开发专题/3游戏后端开发需要掌握的知识.html">
  689. <a href="../游戏开发专题/3游戏后端开发需要掌握的知识.html">
  690. 3 游戏后端开发需要掌握的知识
  691. </a>
  692. </li>
  693. <li class="chapter " data-level="9.1.4" data-path="../游戏开发专题/4关于游戏服务端架构的整理.html">
  694. <a href="../游戏开发专题/4关于游戏服务端架构的整理.html">
  695. 4 关于游戏服务端架构的整理
  696. </a>
  697. </li>
  698. <li class="chapter " data-level="9.1.5" data-path="../游戏开发专题/5各类游戏对应的服务端架构.html">
  699. <a href="../游戏开发专题/5各类游戏对应的服务端架构.html">
  700. 5 各类游戏对应的服务端架构
  701. </a>
  702. </li>
  703. <li class="chapter " data-level="9.1.6" data-path="../游戏开发专题/6从腾讯QQgame高性能服务器集群架构看“分而治之”与“自治”等分布式架构设计原则.html">
  704. <a href="../游戏开发专题/6从腾讯QQgame高性能服务器集群架构看“分而治之”与“自治”等分布式架构设计原则.html">
  705. 6 从腾讯QQgame高性能服务器集群架构看“分而治之”与“自治”等分布式架构设计原则
  706. </a>
  707. </li>
  708. <li class="chapter " data-level="9.1.7" data-path="../游戏开发专题/7QQ游戏百万人同时在线服务器架构实现.html">
  709. <a href="../游戏开发专题/7QQ游戏百万人同时在线服务器架构实现.html">
  710. 7 QQ游戏百万人同时在线服务器架构实现
  711. </a>
  712. </li>
  713. <li class="chapter " data-level="9.1.8" data-path="../游戏开发专题/8大型多人在线游戏服务器架构设计.html">
  714. <a href="../游戏开发专题/8大型多人在线游戏服务器架构设计.html">
  715. 8 大型多人在线游戏服务器架构设计
  716. </a>
  717. </li>
  718. <li class="chapter " data-level="9.1.9" data-path="../游戏开发专题/9百万用户级游戏服务器架构设计.html">
  719. <a href="../游戏开发专题/9百万用户级游戏服务器架构设计.html">
  720. 9 百万用户级游戏服务器架构设计
  721. </a>
  722. </li>
  723. <li class="chapter " data-level="9.1.10" data-path="../游戏开发专题/10十万在线的WebGame的数据库设计思路.html">
  724. <a href="../游戏开发专题/10十万在线的WebGame的数据库设计思路.html">
  725. 10 十万在线的WebGame的数据库设计思路
  726. </a>
  727. </li>
  728. <li class="chapter " data-level="9.1.11" data-path="../游戏开发专题/11一种高性能网络游戏服务器架构设计.html">
  729. <a href="../游戏开发专题/11一种高性能网络游戏服务器架构设计.html">
  730. 11 一种高性能网络游戏服务器架构设计
  731. </a>
  732. </li>
  733. <li class="chapter " data-level="9.1.12" data-path="../游戏开发专题/12经典游戏服务器端架构概述.html">
  734. <a href="../游戏开发专题/12经典游戏服务器端架构概述.html">
  735. 12 经典游戏服务器端架构概述
  736. </a>
  737. </li>
  738. <li class="chapter " data-level="9.1.13" data-path="../游戏开发专题/13游戏跨服架构进化之路.html">
  739. <a href="../游戏开发专题/13游戏跨服架构进化之路.html">
  740. 13 游戏跨服架构进化之路
  741. </a>
  742. </li>
  743. </ul>
  744. </li>
  745. <li class="header">Part IV</li>
  746. <li class="chapter " data-level="10.1" data-path="../程序员面试题精讲/">
  747. <a href="../程序员面试题精讲/">
  748. 程序员面试题精讲
  749. </a>
  750. <ul class="articles">
  751. <li class="chapter " data-level="10.1.1" data-path="../程序员面试题精讲/腾讯后台开发实习生技能要求.html">
  752. <a href="../程序员面试题精讲/腾讯后台开发实习生技能要求.html">
  753. 腾讯后台开发实习生技能要求
  754. </a>
  755. </li>
  756. <li class="chapter " data-level="10.1.2" data-path="../程序员面试题精讲/聊聊如何拿大厂的offer.html">
  757. <a href="../程序员面试题精讲/聊聊如何拿大厂的offer.html">
  758. 聊聊如何拿大厂的 offer
  759. </a>
  760. </li>
  761. <li class="chapter " data-level="10.1.3" data-path="../程序员面试题精讲/网络通信题目集锦.html">
  762. <a href="../程序员面试题精讲/网络通信题目集锦.html">
  763. 网络通信题目集锦
  764. </a>
  765. </li>
  766. <li class="chapter " data-level="10.1.4" data-path="../程序员面试题精讲/我面试后端开发经理的经历.html">
  767. <a href="../程序员面试题精讲/我面试后端开发经理的经历.html">
  768. 我面试后端开发经理的经历
  769. </a>
  770. </li>
  771. <li class="chapter " data-level="10.1.5" data-path="../程序员面试题精讲/LinuxCC++后端开发面试问哪些问题.html">
  772. <a href="../程序员面试题精讲/LinuxCC++后端开发面试问哪些问题.html">
  773. Linux C/C++后端开发面试问哪些问题
  774. </a>
  775. </li>
  776. </ul>
  777. </li>
  778. <li class="chapter " data-level="10.2" data-path="../职业规划/">
  779. <a href="../职业规划/">
  780. 职业规划
  781. </a>
  782. <ul class="articles">
  783. <li class="chapter " data-level="10.2.1" data-path="../职业规划/给工作4年迷茫的程序员们的一点建议.html">
  784. <a href="../职业规划/给工作4年迷茫的程序员们的一点建议.html">
  785. 给工作 4 年迷茫的程序员们的一点建议
  786. </a>
  787. </li>
  788. <li class="chapter " data-level="10.2.2" data-path="../职业规划/聊聊技术人员的常见的职业问题.html">
  789. <a href="../职业规划/聊聊技术人员的常见的职业问题.html">
  790. 聊聊技术人员的常见的职业问题
  791. </a>
  792. </li>
  793. <li class="chapter " data-level="10.2.3" data-path="../职业规划/写给那些傻傻想做服务器开发的朋友.html">
  794. <a href="../职业规划/写给那些傻傻想做服务器开发的朋友.html">
  795. 写给那些傻傻想做服务器开发的朋友
  796. </a>
  797. </li>
  798. </ul>
  799. </li>
  800. <li class="chapter " data-level="10.3" data-path="../自我提升与开源代码/">
  801. <a href="../自我提升与开源代码/">
  802. 自我提升与开源代码
  803. </a>
  804. <ul class="articles">
  805. <li class="chapter " data-level="10.3.1" data-path="../自我提升与开源代码/2020年好好读一读开源代码吧.html">
  806. <a href="../自我提升与开源代码/2020年好好读一读开源代码吧.html">
  807. 2020 年好好读一读开源代码吧
  808. </a>
  809. </li>
  810. </ul>
  811. </li>
  812. <li class="chapter " data-level="10.4" data-path="../后端开发相关的书籍/">
  813. <a href="../后端开发相关的书籍/">
  814. 后端开发相关的书籍
  815. </a>
  816. <ul class="articles">
  817. <li class="chapter " data-level="10.4.1" data-path="../后端开发相关的书籍/后台开发应该读的书.html">
  818. <a href="../后端开发相关的书籍/后台开发应该读的书.html">
  819. 后台开发应该读的书
  820. </a>
  821. </li>
  822. </ul>
  823. </li>
  824. <li class="chapter " data-level="10.5" data-path="../程序员的简历/">
  825. <a href="../程序员的简历/">
  826. 程序员的简历
  827. </a>
  828. <ul class="articles">
  829. <li class="chapter " data-level="10.5.1" data-path="../程序员的简历/程序员如何写简历.html">
  830. <a href="../程序员的简历/程序员如何写简历.html">
  831. 程序员如何写简历
  832. </a>
  833. </li>
  834. </ul>
  835. </li>
  836. <li class="chapter " data-level="10.6" data-path="../程序员的薪资与年终奖那些事儿/">
  837. <a href="../程序员的薪资与年终奖那些事儿/">
  838. 程序员的薪资与年终奖那些事儿
  839. </a>
  840. <ul class="articles">
  841. <li class="chapter " data-level="10.6.1" data-path="../程序员的薪资与年终奖那些事儿/技术面试与HR谈薪资技巧.html">
  842. <a href="../程序员的薪资与年终奖那些事儿/技术面试与HR谈薪资技巧.html">
  843. 技术面试与HR谈薪资技巧
  844. </a>
  845. </li>
  846. <li class="chapter " data-level="10.6.2" data-path="../程序员的薪资与年终奖那些事儿/聊一聊程序员如何增加收入.html">
  847. <a href="../程序员的薪资与年终奖那些事儿/聊一聊程序员如何增加收入.html">
  848. 聊一聊程序员如何增加收入
  849. </a>
  850. </li>
  851. <li class="chapter " data-level="10.6.3" data-path="../程序员的薪资与年终奖那些事儿/谈一谈年终奖.html">
  852. <a href="../程序员的薪资与年终奖那些事儿/谈一谈年终奖.html">
  853. 谈一谈年终奖
  854. </a>
  855. </li>
  856. </ul>
  857. </li>
  858. <li class="chapter " data-level="10.7" data-path="../程序员的烦心事/">
  859. <a href="../程序员的烦心事/">
  860. 程序员的烦心事
  861. </a>
  862. <ul class="articles">
  863. <li class="chapter " data-level="10.7.1" data-path="../程序员的烦心事/拒绝了一家公司的offer后,他们的副总和hr总监同时打电话来询问拒绝原因并极力要求加入,我该不该去?.html">
  864. <a href="../程序员的烦心事/拒绝了一家公司的offer后,他们的副总和hr总监同时打电话来询问拒绝原因并极力要求加入,我该不该去?.html">
  865. 拒绝了一家公司的offer后,他们的副总和hr总监同时打电话来询问拒绝原因并极力要求加入,我该不该去?
  866. </a>
  867. </li>
  868. <li class="chapter " data-level="10.7.2" data-path="../程序员的烦心事/我是一名程序员,结婚时女友要求我用两年的工资作为彩礼,我该不该答应?.html">
  869. <a href="../程序员的烦心事/我是一名程序员,结婚时女友要求我用两年的工资作为彩礼,我该不该答应?.html">
  870. 我是一名程序员,结婚时女友要求我用两年的工资作为彩礼,我该不该答应?
  871. </a>
  872. </li>
  873. </ul>
  874. </li>
  875. <li class="chapter " data-level="10.8" data-path="../作者的故事/">
  876. <a href="../作者的故事/">
  877. 作者的故事
  878. </a>
  879. <ul class="articles">
  880. <li class="chapter " data-level="10.8.1" data-path="../作者的故事/我的2019.html">
  881. <a href="../作者的故事/我的2019.html">
  882. 我的 2019
  883. </a>
  884. </li>
  885. <li class="chapter " data-level="10.8.2" data-path="../作者的故事/我是如何年薪五十万的.html">
  886. <a href="../作者的故事/我是如何年薪五十万的.html">
  887. 我是如何年薪五十万的
  888. </a>
  889. </li>
  890. </ul>
  891. </li>
  892. <li class="divider"></li>
  893. <li>
  894. <a href="https://www.gitbook.com" target="blank" class="gitbook-link">
  895. Published with GitBook
  896. </a>
  897. </li>
  898. </ul>
  899. </nav>
  900. </div>
  901. <!-- Content nav -->
  902. <div class="book-anchor">
  903. <div class="book-anchor-title">在这篇文章中:</div>
  904. <div class="book-anchor-body">
  905. </div>
  906. </div>
  907. <div class="book-body">
  908. <div class="body-inner">
  909. <div class="book-header" role="navigation">
  910. <!-- Title -->
  911. <h1>
  912. <i class="fa fa-circle-o-notch fa-spin"></i>
  913. <a href="../.." >leveldb源码分析21</a>
  914. </h1>
  915. </div>
  916. <div class="page-wrapper" tabindex="-1" role="main">
  917. <div class="page-inner">
  918. <div id="book-search-results">
  919. <div class="search-noresults">
  920. <section class="normal markdown-section">
  921. <div id="anchor-navigation-ex-navbar"><i class="fa fa-navicon"></i><ul><li><span class="title-icon "></span><a href="#leveldb&#x6E90;&#x7801;&#x5206;&#x6790;21"><b></b>leveldb&#x6E90;&#x7801;&#x5206;&#x6790;21</a></li><ul><li><span class="title-icon "></span><a href="#14-db&#x7684;&#x67E5;&#x8BE2;&#x4E0E;&#x904D;&#x5386;&#x4E4B;1"><b></b>14 DB&#x7684;&#x67E5;&#x8BE2;&#x4E0E;&#x904D;&#x5386;&#x4E4B;1</a></li><ul><li><span class="title-icon "></span><a href="#141-get"><b></b>14.1 Get()</a></li><li><span class="title-icon "></span><a href="#142-newiterator"><b></b>14.2 NewIterator()</a></li><li><span class="title-icon "></span><a href="#143-mergingiterator"><b></b>14.3 MergingIterator</a></li></ul></ul></ul></div><h1 id="leveldb&#x6E90;&#x7801;&#x5206;&#x6790;21"><a name="leveldb&#x6E90;&#x7801;&#x5206;&#x6790;21" class="anchor-navigation-ex-anchor" href="#leveldb&#x6E90;&#x7801;&#x5206;&#x6790;21"><i class="fa fa-link" aria-hidden="true"></i></a>leveldb&#x6E90;&#x7801;&#x5206;&#x6790;21</h1>
  922. <p>&#x672C;&#x7CFB;&#x5217;&#x300A;leveldb&#x6E90;&#x7801;&#x5206;&#x6790;&#x300B;&#x5171;&#x6709;22&#x7BC7;&#x6587;&#x7AE0;&#xFF0C;&#x8FD9;&#x662F;&#x7B2C;&#x4E8C;&#x5341;&#x4E00;&#x7BC7;</p>
  923. <h2 id="14-db&#x7684;&#x67E5;&#x8BE2;&#x4E0E;&#x904D;&#x5386;&#x4E4B;1"><a name="14-db&#x7684;&#x67E5;&#x8BE2;&#x4E0E;&#x904D;&#x5386;&#x4E4B;1" class="anchor-navigation-ex-anchor" href="#14-db&#x7684;&#x67E5;&#x8BE2;&#x4E0E;&#x904D;&#x5386;&#x4E4B;1"><i class="fa fa-link" aria-hidden="true"></i></a>14 DB&#x7684;&#x67E5;&#x8BE2;&#x4E0E;&#x904D;&#x5386;&#x4E4B;1</h2>
  924. <p>&#x5206;&#x6790;&#x5B8C;&#x5982;&#x4F55;&#x6253;&#x5F00;&#x548C;&#x5173;&#x95ED;db&#xFF0C;&#x672C;&#x7AE0;&#x5C31;&#x7EE7;&#x7EED;&#x5206;&#x6790;&#x5982;&#x4F55;<strong>&#x4ECE;db&#x4E2D;&#x6839;&#x636E;key&#x67E5;&#x8BE2;value</strong>&#xFF0C;&#x4EE5;&#x53CA;<strong>&#x904D;&#x5386;&#x6574;&#x4E2A;db</strong>&#x3002;</p>
  925. <h3 id="141-get"><a name="141-get" class="anchor-navigation-ex-anchor" href="#141-get"><i class="fa fa-link" aria-hidden="true"></i></a>14.1 Get()</h3>
  926. <p>&#x51FD;&#x6570;&#x58F0;&#x660E;&#xFF1A;<strong>StatusGet(const ReadOptions&amp; options, const Slice&amp; key, std::string* value)</strong>
  927. &#x4ECE;DB&#x4E2D;&#x67E5;&#x8BE2;key &#x5BF9;&#x5E94;&#x7684;value&#xFF0C;&#x53C2;&#x6570;@options&#x6307;&#x5B9A;&#x8BFB;&#x53D6;&#x64CD;&#x4F5C;&#x7684;&#x9009;&#x9879;&#xFF0C;&#x5178;&#x578B;&#x7684;&#x5982;snapshot&#x53F7;&#xFF0C;&#x4ECE;&#x6307;&#x5B9A;&#x7684;&#x5FEB;&#x7167;&#x4E2D;&#x8BFB;&#x53D6;&#x3002;&#x5FEB;&#x7167;&#x672C;&#x8D28;&#x4E0A;&#x5C31;&#x662F;&#x4E00;&#x4E2A;sequence&#x53F7;&#xFF0C;&#x540E;&#x9762;&#x5C06;&#x5355;&#x72EC;&#x5728;&#x5FEB;&#x7167;&#x4E00;&#x7AE0;&#x4E2D;&#x5206;&#x6790;&#x3002;
  928. &#x4E0B;&#x9762;&#x5C31;&#x6765;&#x5206;&#x6790;&#x4E0B;&#x51FD;&#x6570;&#x903B;&#x8F91;&#xFF1A;</p>
  929. <pre class="language-"><code>// S1 &#x9501;mutex&#xFF0C;&#x9632;&#x6B62;&#x5E76;&#x53D1;&#xFF0C;&#x5982;&#x679C;&#x6307;&#x5B9A;option&#x5219;&#x5C1D;&#x8BD5;&#x83B7;&#x53D6;snapshot&#xFF1B;&#x7136;&#x540E;&#x589E;&#x52A0;MemTable&#x7684;&#x5F15;&#x7528;&#x503C;&#x3002;
  930. MutexLock l(&amp;mutex_);
  931. SequenceNumber snapshot;
  932. if (options.snapshot != NULL)
  933. snapshot = reinterpret_cast<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>const</span> <span class="token attr-name">SnapshotImpl*</span><span class="token punctuation">&gt;</span></span>(options.snapshot)-&gt;number_;
  934. else snapshot = versions_-&gt;LastSequence(); // &#x53D6;&#x5F53;&#x524D;&#x7248;&#x672C;&#x7684;&#x6700;&#x540E;Sequence
  935. MemTable *mem = mem_, *imm = imm_;
  936. Version* current = versions_-&gt;current();
  937. mem-&gt;Ref();
  938. if (imm != NULL) imm-&gt;Ref();
  939. current-&gt;Ref();
  940. // S2 &#x4ECE;sstable&#x6587;&#x4EF6;&#x548C;MemTable&#x4E2D;&#x8BFB;&#x53D6;&#x65F6;&#xFF0C;&#x91CA;&#x653E;&#x9501;mutex&#xFF1B;&#x4E4B;&#x540E;&#x518D;&#x6B21;&#x9501;mutex&#x3002;
  941. bool have_stat_update = false;
  942. Version::GetStats stats;
  943. {
  944. mutex_.Unlock();
  945. // &#x5148;&#x4ECE;memtable&#x4E2D;&#x67E5;&#x8BE2;&#xFF0C;&#x518D;&#x4ECE;immutable memtable&#x4E2D;&#x67E5;&#x8BE2;
  946. LookupKey lkey(key, snapshot);
  947. if (mem-&gt;Get(lkey, value, &amp;s)) {
  948. }
  949. else if (imm != NULL &amp;&amp; imm-&gt;Get(lkey, value, &amp;s)) {
  950. }
  951. else { // &#x9700;&#x8981;&#x4ECE;sstable&#x6587;&#x4EF6;&#x4E2D;&#x67E5;&#x8BE2;
  952. s = current-&gt;Get(options, lkey, value, &amp;stats);
  953. have_stat_update = true; // &#x8BB0;&#x5F55;&#x4E4B;&#xFF0C;&#x7528;&#x4E8E;compaction
  954. }
  955. mutex_.Lock();
  956. }
  957. // S3 &#x5982;&#x679C;&#x662F;&#x4ECE;sstable&#x6587;&#x4EF6;&#x67E5;&#x8BE2;&#x51FA;&#x6765;&#x7684;&#xFF0C;&#x68C0;&#x67E5;&#x662F;&#x5426;&#x9700;&#x8981;&#x505A;compaction&#x3002;&#x6700;&#x540E;&#x628A;MemTable&#x7684;&#x5F15;&#x7528;&#x8BA1;&#x6570;&#x51CF;1&#x3002;
  958. if (have_stat_update &amp;&#xA4;t-&gt;UpdateStats(stats)) {
  959. MaybeScheduleCompaction();
  960. }
  961. mem-&gt;Unref();
  962. if (imm != NULL)imm-&gt;Unref();
  963. current-&gt;Unref();
  964. </code></pre><p>&#x67E5;&#x8BE2;&#x662F;&#x6BD4;&#x8F83;&#x7B80;&#x5355;&#x7684;&#x64CD;&#x4F5C;&#xFF0C;UpdateStats&#x5728;&#x524D;&#x9762;Version&#x4E00;&#x8282;&#x5DF2;&#x7ECF;&#x5206;&#x6790;&#x8FC7;&#x3002;</p>
  965. <h3 id="142-newiterator"><a name="142-newiterator" class="anchor-navigation-ex-anchor" href="#142-newiterator"><i class="fa fa-link" aria-hidden="true"></i></a>14.2 NewIterator()</h3>
  966. <p>&#x51FD;&#x6570;&#x58F0;&#x660E;&#xFF1A;<strong>Iterator*NewIterator(const ReadOptions&amp; options)</strong>
  967. &#x901A;&#x8FC7;&#x8BE5;&#x51FD;&#x6570;&#x751F;&#x4EA7;&#x4E86;&#x4E00;&#x4E2A;Iterator<em>&#x5BF9;&#x8C61;&#xFF0C;&#x8C03;&#x7528;&#x8FD9;&#x5C31;&#x53EF;&#x4EE5;&#x57FA;&#x4E8E;&#x8BE5;&#x5BF9;&#x8C61;&#x904D;&#x5386;db&#x5185;&#x5BB9;&#x4E86;&#x3002;
  968. &#x51FD;&#x6570;&#x5F88;&#x7B80;&#x5355;&#xFF0C;&#x8C03;&#x7528;&#x4E24;&#x4E2A;&#x51FD;&#x6570;&#x521B;&#x5EFA;&#x4E86;&#x4E00;&#x4E2A;&#x4E8C;&#x7EA7;<em>*Iterator</em></em>&#x3002;</p>
  969. <pre class="language-"><code>Iterator* DBImpl::NewIterator(const ReadOptions&amp; options) {
  970. SequenceNumber latest_snapshot;
  971. Iterator* internal_iter = NewInternalIterator(options, &amp;latest_snapshot);
  972. returnNewDBIterator(&amp;dbname_, env_, user_comparator(), internal_iter,
  973. (options.snapshot != NULL
  974. ? reinterpret_cast<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>constSnapshotImpl*</span><span class="token punctuation">&gt;</span></span>(options.snapshot)-&gt;number_
  975. : latest_snapshot));
  976. }
  977. </code></pre><p>&#x5176;&#x4E2D;&#xFF0C;&#x51FD;&#x6570;NewDBIterator&#x76F4;&#x63A5;&#x8FD4;&#x56DE;&#x4E86;&#x4E00;&#x4E2A;<strong>DBIter</strong>&#x6307;&#x9488;</p>
  978. <pre class="language-"><code>Iterator* NewDBIterator(const std::string* dbname, Env* env,
  979. const Comparator*user_key_comparator, Iterator* internal_iter,
  980. const SequenceNumber&amp; sequence) {
  981. return new DBIter(dbname, env, user_key_comparator, internal_iter, sequence);
  982. }
  983. </code></pre><p>&#x51FD;&#x6570;NewInternalIterator&#x6709;&#x4E00;&#x4E9B;&#x5904;&#x7406;&#x903B;&#x8F91;&#xFF0C;&#x5C31;&#x662F;&#x6536;&#x96C6;&#x6240;&#x6709;&#x80FD;&#x7528;&#x5230;&#x7684;iterator&#xFF0C;&#x751F;&#x4EA7;&#x4E00;&#x4E2A;Merging Iterator&#x3002;&#x8FD9;&#x5305;&#x62EC;MemTable&#xFF0C;Immutable MemTable&#xFF0C;&#x4EE5;&#x53CA;&#x5404;sstable&#x3002;</p>
  984. <pre class="language-"><code>Iterator* DBImpl::NewInternalIterator(const ReadOptions&amp; options,
  985. SequenceNumber*latest_snapshot) {
  986. IterState* cleanup = newIterState;
  987. mutex_.Lock();
  988. // &#x6839;&#x636E;last sequence&#x8BBE;&#x7F6E;lastest snapshot&#xFF0C;&#x5E76;&#x6536;&#x96C6;&#x6240;&#x6709;&#x7684;&#x5B50;iterator
  989. *latest_snapshot = versions_-&gt;LastSequence();
  990. std::vector<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Iterator*</span><span class="token punctuation">&gt;</span></span>list;
  991. list.push_back(mem_-&gt;NewIterator()); // &gt;memtable
  992. mem_-&gt;Ref();
  993. if (imm_ != NULL) {
  994. list.push_back(imm_-&gt;NewIterator()); // &gt;immutablememtable
  995. imm_-&gt;Ref();
  996. }
  997. versions_-&gt;current()-&gt;AddIterators(options, &amp;list); // &gt;current&#x7684;&#x6240;&#x6709;sstable
  998. Iterator* internal_iter = NewMergingIterator(&amp;internal_comparator_, &amp;list[0], list.size());
  999. versions_-&gt;current()-&gt;Ref();
  1000. // &#x6CE8;&#x518C;&#x6E05;&#x7406;&#x673A;&#x5236;
  1001. cleanup-&gt;mu = &amp;mutex_;
  1002. cleanup-&gt;mem = mem_;
  1003. cleanup-&gt;imm = imm_;
  1004. cleanup-&gt;version = versions_-&gt;current();
  1005. internal_iter-&gt;RegisterCleanup(CleanupIteratorState, cleanup, NULL);
  1006. mutex_.Unlock();
  1007. return internal_iter;
  1008. }
  1009. </code></pre><p>&#x8FD9;&#x4E2A;&#x6E05;&#x7406;&#x51FD;&#x6570;CleanupIteratorState&#x662F;&#x5F88;&#x7B80;&#x5355;&#x7684;&#xFF0C;&#x5BF9;&#x6CE8;&#x518C;&#x7684;&#x5BF9;&#x8C61;&#x505A;&#x4E00;&#x4E0B;Unref&#x64CD;&#x4F5C;&#x5373;&#x53EF;&#x3002;</p>
  1010. <pre class="language-"><code>static void CleanupIteratorState(void* arg1, void* arg2) {
  1011. IterState* state = reinterpret_cast<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>IterState*</span><span class="token punctuation">&gt;</span></span>(arg1);
  1012. state-&gt;mu-&gt;Lock();
  1013. state-&gt;mem-&gt;Unref();
  1014. if (state-&gt;imm != NULL)state-&gt;imm-&gt;Unref();
  1015. state-&gt;version-&gt;Unref();
  1016. state-&gt;mu-&gt;Unlock();
  1017. delete state;
  1018. }
  1019. </code></pre><p>&#x53EF;&#x89C1;&#x5BF9;&#x4E8E;db&#x7684;&#x904D;&#x5386;&#x4F9D;&#x8D56;&#x4E8E;DBIter&#x548C;Merging Iterator&#x8FD9;&#x4E24;&#x4E2A;&#x8FED;&#x4EE3;&#x5668;&#xFF0C;&#x5B83;&#x4EEC;&#x90FD;&#x662F;Iterator&#x63A5;&#x53E3;&#x7684;&#x5B9E;&#x73B0;&#x5B50;&#x7C7B;&#x3002;</p>
  1020. <h3 id="143-mergingiterator"><a name="143-mergingiterator" class="anchor-navigation-ex-anchor" href="#143-mergingiterator"><i class="fa fa-link" aria-hidden="true"></i></a>14.3 MergingIterator</h3>
  1021. <p>MergingIterator&#x662F;&#x4E00;&#x4E2A;&#x5408;&#x5E76;&#x8FED;&#x4EE3;&#x5668;&#xFF0C;&#x5B83;&#x5185;&#x90E8;&#x4F7F;&#x7528;&#x4E86;&#x4E00;&#x7EC4;&#x81EA;Iterator&#xFF0C;&#x4FDD;&#x5B58;&#x5728;&#x5176;&#x6210;&#x5458;&#x6570;&#x7EC4;children_&#x4E2D;&#x3002;&#x5982;&#x4E0A;&#x9762;&#x7684;&#x51FD;&#x6570;NewInternalIterator&#xFF0C;&#x5305;&#x62EC;memtable&#xFF0C;immutable memtable&#xFF0C;&#x4EE5;&#x53CA;&#x5404;sstable&#x6587;&#x4EF6;&#xFF1B;&#x5B83;&#x6240;&#x505A;&#x7684;&#x5C31;&#x662F;&#x6839;&#x636E;&#x8C03;&#x7528;&#x8005;&#x6307;&#x5B9A;&#x7684;key&#x548C;sequence&#xFF0C;&#x4ECE;&#x8FD9;&#x4E9B;Iterator&#x4E2D;&#x627E;&#x5230;&#x5408;&#x9002;&#x7684;&#x8BB0;&#x5F55;&#x3002;
  1022. &#x5728;&#x5206;&#x6790;&#x5176;Iterator&#x63A5;&#x53E3;&#x4E4B;&#x524D;&#xFF0C;&#x5148;&#x6765;&#x770B;&#x770B;&#x4E24;&#x4E2A;&#x8F85;&#x52A9;&#x51FD;&#x6570;FindSmallest&#x548C;FindLargest&#x3002;FindSmallest<strong>&#x4ECE;0&#x5F00;&#x59CB;&#x5411;&#x540E;&#x904D;&#x5386;&#x5185;&#x90E8;Iterator&#x6570;&#x7EC4;</strong>&#xFF0C;&#x627E;&#x5230;key&#x6700;&#x5C0F;&#x7684;Iterator&#xFF0C;&#x5E76;&#x8BBE;&#x7F6E;&#x5230;current<em>&#xFF1B;FindLargest&#x4ECE;<strong>&#x6700;&#x540E;&#x4E00;&#x4E2A;&#x5411;&#x524D;&#x904D;&#x5386;&#x5185;&#x90E8;Iterator&#x6570;&#x7EC4;</strong>&#xFF0C;&#x627E;&#x5230;key&#x6700;&#x5927;&#x7684;Iterator&#xFF0C;&#x5E76;&#x8BBE;&#x7F6E;&#x5230;current</em>&#xFF1B;
  1023. MergingIterator&#x8FD8;&#x5B9A;&#x4E49;&#x4E86;&#x4E24;&#x4E2A;&#x79FB;&#x52A8;&#x65B9;&#x5411;&#xFF1A;kForward&#xFF0C;&#x5411;&#x524D;&#x79FB;&#x52A8;&#xFF1B;kReverse&#xFF0C;&#x5411;&#x540E;&#x79FB;&#x52A8;&#x3002; </p>
  1024. <h4 id="1431-get&#x7CFB;&#x63A5;&#x53E3;"><a name="1431-get&#x7CFB;&#x63A5;&#x53E3;" class="anchor-navigation-ex-anchor" href="#1431-get&#x7CFB;&#x63A5;&#x53E3;"><i class="fa fa-link" aria-hidden="true"></i></a>14.3.1 Get&#x7CFB;&#x63A5;&#x53E3;</h4>
  1025. <p>&#x4E0B;&#x9762;&#x5C31;&#x628A;&#x5176;&#x63A5;&#x53E3;&#x62D6;&#x51FA;&#x6765;&#x4E00;&#x4E2A;&#x4E00;&#x4E2A;&#x5206;&#x6790;&#xFF0C;&#x9996;&#x5148;&#x662F;&#x7B80;&#x5355;&#x63A5;&#x53E3;&#xFF0C;key&#x548C;value&#x90FD;&#x662F;&#x8FD4;&#x56DE;current<em>&#x7684;&#x503C;&#xFF0C;current</em>&#x662F;&#x5F53;&#x524D;seek&#x5230;&#x7684;Iterator&#x4F4D;&#x7F6E;&#x3002;</p>
  1026. <pre class="language-"><code>virtual Slice key() const {
  1027. assert(Valid());
  1028. return current_-&gt;key();
  1029. }
  1030. virtual Slice value() const {
  1031. assert(Valid());
  1032. return current_-&gt;value();
  1033. }
  1034. virtual Status status() const {
  1035. Status status;
  1036. for (int i = 0; i &lt; n_; i++) { // &#x53EA;&#x6709;&#x6240;&#x6709;&#x5185;&#x90E8;Iterator&#x90FD;ok&#x65F6;&#xFF0C;&#x624D;&#x8FD4;&#x56DE;ok
  1037. status = children_[i].status();
  1038. if (!status.ok()) break;
  1039. }
  1040. return status;
  1041. }
  1042. </code></pre><h4 id="1432-seek&#x7CFB;&#x63A5;&#x53E3;"><a name="1432-seek&#x7CFB;&#x63A5;&#x53E3;" class="anchor-navigation-ex-anchor" href="#1432-seek&#x7CFB;&#x63A5;&#x53E3;"><i class="fa fa-link" aria-hidden="true"></i></a>14.3.2 Seek&#x7CFB;&#x63A5;&#x53E3;</h4>
  1043. <p>&#x7136;&#x540E;&#x662F;&#x51E0;&#x4E2A;seek&#x7CFB;&#x7684;&#x51FD;&#x6570;&#xFF0C;&#x4E5F;&#x6BD4;&#x8F83;&#x7B80;&#x5355;&#xFF0C;&#x90FD;&#x662F;&#x4F9D;&#x6B21;&#x8C03;&#x7528;&#x5185;&#x90E8;Iterator&#x7684;seek&#x7CFB;&#x51FD;&#x6570;&#x3002;&#x7136;&#x540E;&#x505A;merge&#xFF0C;&#x5BF9;&#x4E8E;Seek&#x548C;SeekToFirst&#x90FD;&#x8C03;&#x7528;FindSmallest&#xFF1B;&#x5BF9;&#x4E8E;SeekToLast&#x8C03;&#x7528;FindLargest&#x3002;</p>
  1044. <pre class="language-"><code>virtual void SeekToFirst() {
  1045. for (int i = 0; i &lt; n_; i++) children_[i].SeekToFirst();
  1046. FindSmallest();
  1047. direction_ = kForward;
  1048. }
  1049. virtual void SeekToLast() {
  1050. for (int i = 0; i &lt; n_; i++) children_[i].SeekToLast();
  1051. FindLargest();
  1052. direction_ = kReverse;
  1053. }
  1054. virtual void Seek(constSlice&amp; target) {
  1055. for (int i = 0; i &lt; n_; i++) children_[i].Seek(target);
  1056. FindSmallest();
  1057. direction_ = kForward;
  1058. }
  1059. </code></pre><h4 id="1433-&#x9010;&#x6B65;&#x79FB;&#x52A8;"><a name="1433-&#x9010;&#x6B65;&#x79FB;&#x52A8;" class="anchor-navigation-ex-anchor" href="#1433-&#x9010;&#x6B65;&#x79FB;&#x52A8;"><i class="fa fa-link" aria-hidden="true"></i></a>14.3.3 &#x9010;&#x6B65;&#x79FB;&#x52A8;</h4>
  1060. <p>&#x6700;&#x540E;&#x5C31;&#x662F;Next&#x548C;Prev&#x51FD;&#x6570;&#xFF0C;&#x5B8C;&#x6210;&#x8FED;&#x4EE3;&#x904D;&#x5386;&#x3002;&#x8FD9;&#x53EF;&#x80FD;&#x4F1A;&#x6709;&#x70B9;&#x7ED5;&#x3002;&#x4E0B;&#x9762;&#x5206;&#x522B;&#x6765;&#x8BF4;&#x660E;&#x3002;
  1061. &#x9996;&#x5148;&#xFF0C;&#x5728;Next&#x79FB;&#x52A8;&#x65F6;&#xFF0C;&#x5982;&#x679C;&#x5F53;&#x524D;direction&#x4E0D;&#x662F;kForward&#x7684;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x4E0A;&#x4E00;&#x6B21;&#x8C03;&#x7528;&#x4E86;Prev&#x6216;&#x8005;SeekToLast&#x51FD;&#x6570;&#xFF0C;&#x5C31;&#x9700;&#x8981;&#x5148;&#x8C03;&#x6574;&#x9664;current&#x4E4B;&#x5916;&#x7684;&#x6240;&#x6709;iterator&#xFF0C;&#x4E3A;&#x4EC0;&#x4E48;&#x8981;&#x505A;&#x8FD9;&#x79CD;&#x8C03;&#x6574;&#x5462;&#xFF1F;&#x5570;&#x55E6;&#x4E00;&#x70B9;&#xFF0C;&#x8003;&#x8651;&#x5982;&#x4E0B;&#x7684;&#x573A;&#x666F;&#xFF0C;&#x5982;&#x56FE;14.3-1&#x6240;&#x793A;&#x3002;</p>
  1062. <p><img src="../imgs/leveldb19.webp" alt=""></p>
  1063. <p>&#x56FE;14.3-1 Next&#x7684;&#x79FB;&#x52A8;</p>
  1064. <p>&#x5F53;&#x524D;direction&#x4E3A;kReverse&#xFF0C;&#x5E76;&#x4E14;&#x6709;&#xFF1A;<strong>Current = memtable Iterator</strong>&#x3002;&#x5404;Iterator&#x4F4D;&#x7F6E;&#x4E3A;&#xFF1A;{memtable, stable 0, sstable1} ={ key3:1:1, key2:3:1, key2:1:1}&#xFF0C;&#x8FD9;&#x7B26;&#x5408;prev&#x64CD;&#x4F5C;&#x7684;largest key&#x8981;&#x6C42;&#x3002;
  1065. &#x6CE8;&#xFF1A;&#x9700;&#x8981;&#x8BF4;&#x660E;&#x4E0B;&#xFF0C;&#x5BF9;&#x4E8E;&#x6BCF;&#x4E2A;update&#x64CD;&#x4F5C;&#xFF0C;leveldb&#x90FD;&#x4F1A;&#x8D4B;&#x4E88;&#x4E00;&#x4E2A;&#x5168;&#x5C40;&#x552F;&#x4E00;&#x7684;sequence&#x53F7;&#xFF0C;&#x4E14;&#x662F;&#x9012;&#x589E;&#x7684;&#x3002;&#x4F8B;&#x5B50;&#x4E2D;&#x7684;sequence&#x53F7;&#x53EF;&#x7406;&#x89E3;&#x4E3A;&#x6BCF;&#x4E2A;key&#x7684;&#x76F8;&#x5BF9;&#x503C;&#xFF0C;&#x540E;&#x9762;&#x4E5F;&#x662F;&#x5982;&#x6B64;&#x3002;
  1066. &#x63A5;&#x4E0B;&#x6765;&#x6211;&#x4EEC;&#x6765;&#x5206;&#x6790;Prev&#x79FB;&#x52A8;&#x7684;&#x64CD;&#x4F5C;&#x3002;
  1067. &#x7B2C;&#x4E00;&#x6B21;Prev&#xFF0C;current(memtable iterator)&#x79FB;&#x52A8;&#x5230;key1:3:0&#x4E0A;&#xFF0C;3&#x8005;&#x4E2D;&#x6700;&#x5927;&#x8005;&#x53D8;&#x6210;sstable0&#xFF1B;&#x56E0;&#x6B64;current&#x4FEE;&#x6539;&#x4E3A;sstable0&#xFF1B;
  1068. &#x7B2C;&#x4E8C;&#x6B21;Prev&#xFF0C;current(sstable0 Iterator)&#x79FB;&#x52A8;&#x5230;key1:2:1&#x4E0A;&#xFF0C;3&#x8005;&#x4E2D;&#x6700;&#x5927;&#x8005;&#x53D8;&#x6210;sstable1&#xFF1B;&#x56E0;&#x6B64;current&#x4FEE;&#x6539;&#x4E3A;sstable1:
  1069. &#x6B64;&#x65F6;&#x5404;Iterator&#x7684;&#x4F4D;&#x7F6E;&#x4E3A;{memtable, sstable 0, sstable1} = { key1:3:0, key1:2:1, key2:2:1}&#xFF0C;&#x5E76;&#x4E14;current=sstable1&#x3002;
  1070. &#x63A5;&#x4E0B;&#x6765;&#x518D;&#x8C03;&#x7528;Next&#xFF0C;&#x663E;&#x7136;&#x5F53;&#x524D;Key()&#x4E3A;key2:2:1&#xFF0C;&#x7EFC;&#x5408;&#x8003;&#x8651;3&#x4E2A;iterator&#xFF0C;&#x4E24;&#x6B21;Next()&#x7684;&#x8C03;&#x7528;&#x7ED3;&#x679C;&#x5E94;&#x8BE5;&#x662F;key2:1:1&#x548C;key3:1:1&#x3002;&#x800C;memtable&#x548C;sstable0&#x6307;&#x5411;&#x7684;key&#x5374;&#x662F;key1:3:0&#x548C;key1:2:1&#xFF0C;&#x8FD9;&#x65F6;&#x5C31;&#x9700;&#x8981;&#x8C03;&#x6574;memtable&#x548C;sstable0&#x4E86;&#xFF0C;&#x4F7F;&#x4ED6;&#x4EEC;&#x90FD;&#x5B9A;&#x4F4D;&#x5230;Key()&#x4E4B;&#x540E;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;key3:1:1&#x548C;key2:3:1&#x4E0A;&#x3002;
  1071. &#x7136;&#x540E;current(current1)Next&#x79FB;&#x52A8;&#x5230;key2:1:1&#x4E0A;&#x3002;&#x8FD9;&#x5C31;&#x662F;Next&#x65F6;&#x7684;&#x8C03;&#x6574;&#x903B;&#x8F91;&#xFF0C;&#x540C;&#x7406;&#xFF0C;&#x5BF9;&#x4E8E;Prev&#x4E5F;&#x6709;&#x76F8;&#x540C;&#x7684;&#x8C03;&#x6574;&#x903B;&#x8F91;&#x3002;&#x4EE3;&#x7801;&#x5982;&#x4E0B;&#xFF1A;</p>
  1072. <pre class="language-"><code>virtual void Next() {
  1073. assert(Valid());
  1074. // &#x786E;&#x4FDD;&#x6240;&#x6709;&#x7684;&#x5B50;Iterator&#x90FD;&#x5B9A;&#x4F4D;&#x5728;key()&#x4E4B;&#x540E;.
  1075. // &#x5982;&#x679C;&#x6211;&#x4EEC;&#x5728;&#x6B63;&#x5411;&#x79FB;&#x52A8;&#xFF0C;&#x5BF9;&#x4E8E;&#x9664;current_&#x5916;&#x7684;&#x6240;&#x6709;&#x5B50;Iterator&#x8FD9;&#x70B9;&#x5DF2;&#x7136;&#x6210;&#x7ACB;
  1076. // &#x56E0;&#x4E3A;current_&#x662F;&#x6700;&#x5C0F;&#x7684;&#x5B50;Iterator&#xFF0C;&#x5E76;&#x4E14;key() = current_-&gt;key()&#x3002;
  1077. // &#x5426;&#x5219;&#xFF0C;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x660E;&#x786E;&#x8BBE;&#x7F6E;&#x5176;&#x5B83;&#x7684;&#x5B50;Iterator
  1078. if (direction_ != kForward) {
  1079. for (int i = 0; i &lt; n_; i++) { // &#x628A;&#x6240;&#x6709;current&#x4E4B;&#x5916;&#x7684;Iterator&#x5B9A;&#x4F4D;&#x5230;key()&#x4E4B;&#x540E;
  1080. IteratorWrapper* child = &amp;children_[i];
  1081. if (child != current_) {
  1082. child-&gt;Seek(key());
  1083. if (child-&gt;Valid() &amp;&amp; comparator_-&gt;Compare(key(), child-&gt;key()) == 0)
  1084. child-&gt;Next(); // key&#x7B49;&#x4E8E;current_-&gt;key()&#x7684;&#xFF0C;&#x518D;&#x5411;&#x540E;&#x79FB;&#x52A8;&#x4E00;&#x4F4D;
  1085. }
  1086. }
  1087. direction_ = kForward;
  1088. }
  1089. // current&#x4E5F;&#x5411;&#x540E;&#x79FB;&#x4E00;&#x4F4D;&#xFF0C;&#x7136;&#x540E;&#x518D;&#x67E5;&#x627E;key&#x6700;&#x5C0F;&#x7684;Iterator
  1090. current_-&gt;Next();
  1091. FindSmallest();
  1092. }
  1093. virtual void Prev() {
  1094. assert(Valid());
  1095. // &#x786E;&#x4FDD;&#x6240;&#x6709;&#x7684;&#x5B50;Iterator&#x90FD;&#x5B9A;&#x4F4D;&#x5728;key()&#x4E4B;&#x524D;.
  1096. // &#x5982;&#x679C;&#x6211;&#x4EEC;&#x5728;&#x9006;&#x5411;&#x79FB;&#x52A8;&#xFF0C;&#x5BF9;&#x4E8E;&#x9664;current_&#x5916;&#x7684;&#x6240;&#x6709;&#x5B50;Iterator&#x8FD9;&#x70B9;&#x5DF2;&#x7136;&#x6210;&#x7ACB;
  1097. // &#x56E0;&#x4E3A;current_&#x662F;&#x6700;&#x5927;&#x7684;&#xFF0C;&#x5E76;&#x4E14;key() = current_-&gt;key()
  1098. // &#x5426;&#x5219;&#xFF0C;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x660E;&#x786E;&#x8BBE;&#x7F6E;&#x5176;&#x5B83;&#x7684;&#x5B50;Iterator
  1099. if (direction_ != kReverse) {
  1100. for (int i = 0; i &lt; n_; i++) {
  1101. IteratorWrapper* child = &amp;children_[i];
  1102. if (child != current_) {
  1103. child-&gt;Seek(key());
  1104. if (child-&gt;Valid()) {
  1105. // child&#x4F4D;&#x4E8E;&gt;=key()&#x7684;&#x7B2C;&#x4E00;&#x4E2A;entry&#x4E0A;&#xFF0C;prev&#x79FB;&#x52A8;&#x4E00;&#x4F4D;&#x5230;<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>key()</span>
  1106. <span class="token attr-name">child-</span><span class="token punctuation">&gt;</span></span>Prev();
  1107. }
  1108. else { // child&#x6240;&#x6709;&#x7684;entry&#x90FD; &lt; key()&#xFF0C;&#x76F4;&#x63A5;seek&#x5230;last&#x5373;&#x53EF;
  1109. child-&gt;SeekToLast();
  1110. }
  1111. }
  1112. }
  1113. direction_ = kReverse;
  1114. }
  1115. //current&#x4E5F;&#x5411;&#x524D;&#x79FB;&#x4E00;&#x4F4D;&#xFF0C;&#x7136;&#x540E;&#x518D;&#x67E5;&#x627E;key&#x6700;&#x5927;&#x7684;Iterator
  1116. current_-&gt;Prev();
  1117. FindLargest();
  1118. }
  1119. </code></pre><p>&#x8FD9;&#x5C31;&#x662F;MergingIterator&#x7684;&#x5168;&#x90E8;&#x4EE3;&#x7801;&#x903B;&#x8F91;&#x4E86;&#xFF0C;&#x6BCF;&#x6B21;Next&#x6216;&#x8005;Prev&#x79FB;&#x52A8;&#x65F6;&#xFF0C;&#x90FD;&#x8981;&#x91CD;&#x65B0;&#x904D;&#x5386;&#x6240;&#x6709;&#x7684;&#x5B50;Iterator&#x4EE5;&#x627E;&#x5230;key&#x6700;&#x5C0F;&#x6216;&#x6700;&#x5927;&#x7684;Iterator&#x4F5C;&#x4E3A;current_&#x3002;&#x8FD9;&#x5C31;&#x662F;merge&#x7684;&#x8BED;&#x4E49;&#x6240;&#x5728;&#x4E86;&#x3002;
  1120. &#x4F46;&#x662F;&#x5B83;&#x6CA1;&#x6709;&#x8003;&#x8651;&#x5230;&#x5220;&#x9664;&#x6807;&#x8BB0;&#x7B49;&#x95EE;&#x9898;&#xFF0C;&#x56E0;&#x6B64;&#x76F4;&#x63A5;&#x4F7F;&#x7528;MergingIterator&#x662F;&#x4E0D;&#x80FD;&#x6B63;&#x786E;&#x7684;&#x904D;&#x5386;DB&#x7684;&#xFF0C;&#x8FD9;&#x4E9B;&#x95EE;&#x9898;&#x7559;&#x5F85;&#x7ED9;DBIter&#x6765;&#x89E3;&#x51B3;&#x3002;</p>
  1121. <footer class="page-footer"><span class="copyright">&#x5982;&#x9700;&#x4E0B;&#x8F7D;&#x672C;&#x7AD9;&#x5168;&#x90E8;&#x6280;&#x672F;&#x6587;&#x7AE0;&#xFF0C;&#x53EF;&#x4EE5;&#x5728;&#x3010;&#x9AD8;&#x6027;&#x80FD;&#x670D;&#x52A1;&#x5668;&#x5F00;&#x53D1;&#x3011;&#x516C;&#x4F17;&#x53F7;&#x56DE;&#x590D;&#x5173;&#x952E;&#x5B57;&#x201C;&#x6587;&#x7AE0;&#x4E0B;&#x8F7D;&#x201D;&#x5373;&#x53EF;&#x3002;</span><span class="footer-modification">&#x6700;&#x8FD1;&#x66F4;&#x65B0;&#x65F6;&#x95F4;&#xFF1A;
  1122. 2020-10-03 13:51:42
  1123. </span></footer>
  1124. <script>console.log("plugin-popup....");document.onclick = function(e){ e.target.tagName === "IMG" && window.open(e.target.src,e.target.src)}</script><style>img{cursor:pointer}</style>
  1125. </section>
  1126. </div>
  1127. <div class="search-results">
  1128. <div class="has-results">
  1129. <h1 class="search-results-title"><span class='search-results-count'></span> results matching "<span class='search-query'></span>"</h1>
  1130. <ul class="search-results-list"></ul>
  1131. </div>
  1132. <div class="no-results">
  1133. <h1 class="search-results-title">No results matching "<span class='search-query'></span>"</h1>
  1134. </div>
  1135. </div>
  1136. </div>
  1137. </div>
  1138. </div>
  1139. </div>
  1140. <a href="leveldb源码分析20.html" class="navigation navigation-prev " aria-label="Previous page: leveldb源码分析20">
  1141. <i class="fa fa-angle-left"></i>
  1142. </a>
  1143. <a href="leveldb源码分析22.html" class="navigation navigation-next " aria-label="Next page: leveldb源码分析22">
  1144. <i class="fa fa-angle-right"></i>
  1145. </a>
  1146. </div>
  1147. <script>
  1148. var gitbook = gitbook || [];
  1149. gitbook.push(function() {
  1150. gitbook.page.hasChanged({"page":{"title":"leveldb源码分析21","level":"7.2.21","depth":2,"next":{"title":"leveldb源码分析22","level":"7.2.22","depth":2,"path":"articles/leveldb源码分析/leveldb源码分析22.md","ref":"articles/leveldb源码分析/leveldb源码分析22.md","articles":[]},"previous":{"title":"leveldb源码分析20","level":"7.2.20","depth":2,"path":"articles/leveldb源码分析/leveldb源码分析20.md","ref":"articles/leveldb源码分析/leveldb源码分析20.md","articles":[]},"dir":"ltr"},"config":{"plugins":["chapter-fold","-lunr","-search","search-pro","splitter","popup","back-to-top-button","hide-element","prism","-highlight","tbfed-pagefooter","code","anchor-navigation-ex","theme-fexa","livereload"],"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"pluginsConfig":{"tbfed-pagefooter":{"copyright":"如需下载本站全部技术文章,可以在【高性能服务器开发】公众号回复关键字“文章下载”即可。","modify_label":"最近更新时间:","modify_format":"YYYY-MM-DD HH:mm:ss"},"chapter-fold":{},"prism":{},"livereload":{},"splitter":{},"search-pro":{},"popup":{},"theme-fexa":{"search-placeholder":"输入关键字搜索","logo":"./logo.png","favicon":"./favicon.ico"},"code":{"copyButtons":true},"hide-element":{"elements":[".gitbook-link"]},"fontsettings":{"theme":"white","family":"sans","size":2},"anchor-navigation-ex":{"showLevel":false,"associatedWithSummary":true,"mode":"float","showGoTop":false,"printLog":false,"multipleH1":true,"float":{"floatIcon":"fa fa-navicon","showLevelIcon":false,"level1Icon":"","level2Icon":"","level3Icon":""},"pageTop":{"showLevelIcon":false,"level1Icon":"","level2Icon":"","level3Icon":""}},"back-to-top-button":{},"sharing":{"facebook":true,"twitter":true,"google":false,"weibo":false,"instapaper":false,"vk":false,"all":["facebook","google","twitter","weibo","instapaper"]},"theme-default":{"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"showLevel":false}},"theme":"default","author":"easy_coder","pdf":{"pageBreaksBefore":"/","headerTemplate":null,"paperSize":"a4","margin":{"right":62,"left":62,"top":36,"bottom":36},"fontSize":12,"fontFamily":"Arial","footerTemplate":null,"chapterMark":"pagebreak","pageNumbers":false},"structure":{"langs":"LANGS.md","readme":"README.md","glossary":"GLOSSARY.md","summary":"SUMMARY.md"},"isbn":"","variables":{},"title":"高性能服务器开发 技术专栏","links":{},"gitbook":"*","description":"","theme-default":{"showLevel":true},"extension":null},"file":{"path":"articles/leveldb源码分析/leveldb源码分析21.md","mtime":"2020-10-03T05:51:42.834Z","type":"markdown"},"gitbook":{"version":"3.2.3","time":"2020-10-09T15:31:57.905Z"},"basePath":"../..","book":{"language":""}});
  1151. });
  1152. </script>
  1153. </div>
  1154. <script src="../../gitbook/gitbook.js"></script>
  1155. <script src="../../gitbook/theme.js"></script>
  1156. <script src="../../gitbook/gitbook-plugin-chapter-fold/chapter-fold.js"></script>
  1157. <script src="../../gitbook/gitbook-plugin-search-pro/jquery.mark.min.js"></script>
  1158. <script src="../../gitbook/gitbook-plugin-search-pro/search.js"></script>
  1159. <script src="../../gitbook/gitbook-plugin-splitter/splitter.js"></script>
  1160. <script src="../../gitbook/gitbook-plugin-back-to-top-button/plugin.js"></script>
  1161. <script src="../../gitbook/gitbook-plugin-hide-element/plugin.js"></script>
  1162. <script src="../../gitbook/gitbook-plugin-code/plugin.js"></script>
  1163. <script src="../../gitbook/gitbook-plugin-livereload/plugin.js"></script>
  1164. <script src="../../gitbook/gitbook-plugin-sharing/buttons.js"></script>
  1165. <script src="../../gitbook/gitbook-plugin-fontsettings/fontsettings.js"></script>
  1166. <script src="../../gitbook/gitbook-plugin-theme-fexa/fexa.js"></script>
  1167. </body>
  1168. </html>