leveldb源码分析16.html 107 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877
  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源码分析16 · 高性能服务器开发 技术专栏</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源码分析17.html" />
  29. <link rel="prev" href="leveldb源码分析15.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 active" 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 " 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源码分析16</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;16"><b></b>Leveldb&#x6E90;&#x7801;&#x5206;&#x6790;16</a></li><ul><li><span class="title-icon "></span><a href="#10version&#x5206;&#x6790;&#x4E4B;&#x4E00;"><b></b>10.Version&#x5206;&#x6790;&#x4E4B;&#x4E00;</a></li><ul><li><span class="title-icon "></span><a href="#101-version&#x63A5;&#x53E3;"><b></b>10.1 Version&#x63A5;&#x53E3;</a></li><li><span class="title-icon "></span><a href="#102-versionadditerators"><b></b>10.2 Version::AddIterators()</a></li><li><span class="title-icon "></span><a href="#103-versionlevelfilenumiterator&#x7C7B;"><b></b>10.3 Version::LevelFileNumIterator&#x7C7B;</a></li><li><span class="title-icon "></span><a href="#104-versionget"><b></b>10.4 Version::Get()</a></li></ul></ul></ul></div><h1 id="leveldb&#x6E90;&#x7801;&#x5206;&#x6790;16"><a name="leveldb&#x6E90;&#x7801;&#x5206;&#x6790;16" class="anchor-navigation-ex-anchor" href="#leveldb&#x6E90;&#x7801;&#x5206;&#x6790;16"><i class="fa fa-link" aria-hidden="true"></i></a>Leveldb&#x6E90;&#x7801;&#x5206;&#x6790;16</h1>
  922. <p>&#x672C;&#x7CFB;&#x5217;&#x300A;leveldb&#x6E90;&#x7801;&#x5206;&#x6790;&#x300B;&#x5171;&#x6709;22&#x7BC7;&#x6587;&#x7AE0;&#xFF0C;&#x8FD9;&#x662F;&#x7B2C;&#x5341;&#x516D;&#x7BC7;</p>
  923. <h2 id="10version&#x5206;&#x6790;&#x4E4B;&#x4E00;"><a name="10version&#x5206;&#x6790;&#x4E4B;&#x4E00;" class="anchor-navigation-ex-anchor" href="#10version&#x5206;&#x6790;&#x4E4B;&#x4E00;"><i class="fa fa-link" aria-hidden="true"></i></a>10.Version&#x5206;&#x6790;&#x4E4B;&#x4E00;</h2>
  924. <p>&#x5148;&#x6765;<strong>&#x5206;&#x6790;leveldb&#x5BF9;&#x5355;&#x7248;&#x672C;&#x7684;sstable&#x6587;&#x4EF6;&#x7BA1;&#x7406;</strong>&#xFF0C;&#x4E3B;&#x8981;&#x96C6;&#x4E2D;&#x5728;Version&#x7C7B;&#x4E2D;&#x3002;&#x524D;&#x9762;&#x7684;10.4&#x8282;&#x5DF2;&#x7ECF;&#x8BF4;&#x660E;&#x4E86;Version&#x7C7B;&#x7684;&#x529F;&#x80FD;&#x548C;&#x6210;&#x5458;&#xFF0C;&#x8FD9;&#x91CC;&#x5206;&#x6790;&#x5176;&#x51FD;&#x6570;&#x63A5;&#x53E3;&#x548C;&#x4EE3;&#x7801;&#x5B9E;&#x73B0;&#x3002;
  925. <strong>Version&#x4E0D;&#x4F1A;&#x4FEE;&#x6539;&#x5176;&#x7BA1;&#x7406;&#x7684;sstable&#x6587;&#x4EF6;&#xFF0C;&#x53EA;&#x6709;&#x8BFB;&#x53D6;&#x64CD;&#x4F5C;&#x3002;</strong></p>
  926. <h3 id="101-version&#x63A5;&#x53E3;"><a name="101-version&#x63A5;&#x53E3;" class="anchor-navigation-ex-anchor" href="#101-version&#x63A5;&#x53E3;"><i class="fa fa-link" aria-hidden="true"></i></a>10.1 Version&#x63A5;&#x53E3;</h3>
  927. <p>&#x5148;&#x6765;&#x770B;&#x770B;Version&#x7C7B;&#x7684;&#x63A5;&#x53E3;&#x51FD;&#x6570;&#xFF0C;&#x63A5;&#x4E0B;&#x6765;&#x518D;&#x4E00;&#x4E00;&#x5206;&#x6790;&#x3002;</p>
  928. <pre class="language-"><code>// &#x8FFD;&#x52A0;&#x4E00;&#x7CFB;&#x5217;iterator&#x5230; @*iters&#x4E2D;&#xFF0C;
  929. //&#x5C06;&#x5728;merge&#x5230;&#x4E00;&#x8D77;&#x65F6;&#x751F;&#x6210;&#x8BE5;Version&#x7684;&#x5185;&#x5BB9;
  930. // &#x8981;&#x6C42;: Version&#x5DF2;&#x7ECF;&#x4FDD;&#x5B58;&#x4E86;(&#x89C1;VersionSet::SaveTo)
  931. void AddIterators(constReadOptions&amp;,
  932. 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>* iters);
  933. // &#x7ED9;&#x5B9A;@key&#x67E5;&#x627E;value&#xFF0C;&#x5982;&#x679C;&#x627E;&#x5230;&#x4FDD;&#x5B58;&#x5728;@*val&#x5E76;&#x8FD4;&#x56DE;OK&#x3002;
  934. // &#x5426;&#x5219;&#x8FD4;&#x56DE;non-OK&#xFF0C;&#x8BBE;&#x7F6E;@ *stats.
  935. // &#x8981;&#x6C42;&#xFF1A;&#x6CA1;&#x6709;hold lock
  936. struct GetStats {
  937. FileMetaData* seek_file;
  938. int seek_file_level;
  939. };
  940. Status Get(constReadOptions&amp;, const LookupKey&amp; key,
  941. std::string* val,GetStats* stats);
  942. // &#x628A;@stats&#x52A0;&#x5165;&#x5230;&#x5F53;&#x524D;&#x72B6;&#x6001;&#x4E2D;&#xFF0C;&#x5982;&#x679C;&#x9700;&#x8981;&#x89E6;&#x53D1;&#x65B0;&#x7684;compaction&#x8FD4;&#x56DE;true
  943. // &#x8981;&#x6C42;&#xFF1A;hold lock
  944. bool UpdateStats(constGetStats&amp; stats);
  945. void GetOverlappingInputs(intlevel,
  946. const InternalKey*begin, // NULL &#x6307;&#x5728;&#x6240;&#x6709;key&#x4E4B;&#x524D;
  947. const InternalKey* end, // NULL&#x6307;&#x5728;&#x6240;&#x6709;key&#x4E4B;&#x540E;
  948. std::vector<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>FileMetaData*</span><span class="token punctuation">&gt;</span></span>* inputs);
  949. // &#x5982;&#x679C;&#x6307;&#x5B9A;level&#x4E2D;&#x7684;&#x67D0;&#x4E9B;&#x6587;&#x4EF6;&#x548C;[*smallest_user_key,*largest_user_key]
  950. //&#x6709;&#x91CD;&#x5408;&#x5C31;&#x8FD4;&#x56DE;true&#x3002;
  951. // @smallest_user_key==NULL&#x8868;&#x793A;&#x6BD4;DB&#x4E2D;&#x6240;&#x6709;key&#x90FD;&#x5C0F;&#x7684;key.
  952. // @largest_user_key==NULL&#x8868;&#x793A;&#x6BD4;DB&#x4E2D;&#x6240;&#x6709;key&#x90FD;&#x5927;&#x7684;key.
  953. bool OverlapInLevel(int level,const Slice*smallest_user_key,
  954. const Slice* largest_user_key);
  955. // &#x8FD4;&#x56DE;&#x6211;&#x4EEC;&#x5E94;&#x8BE5;&#x5728;&#x54EA;&#x4E2A;level&#x4E0A;&#x653E;&#x7F6E;&#x65B0;&#x7684;memtable compaction&#xFF0C;
  956. // &#x8BE5;compaction&#x8986;&#x76D6;&#x4E86;&#x8303;&#x56F4;[smallest_user_key,largest_user_key].
  957. int PickLevelForMemTableOutput(const Slice&amp; smallest_user_key,
  958. const Slice&amp; largest_user_key);
  959. // &#x6307;&#x5B9A;level&#x7684;sstable&#x4E2A;&#x6570;
  960. int NumFiles(int level) const {return files_[level].size();
  961. </code></pre><h3 id="102-versionadditerators"><a name="102-versionadditerators" class="anchor-navigation-ex-anchor" href="#102-versionadditerators"><i class="fa fa-link" aria-hidden="true"></i></a>10.2 Version::AddIterators()</h3>
  962. <p>&#x8BE5;&#x51FD;&#x6570;&#x6700;&#x7EC8;&#x5728;DB::NewIterators()&#x63A5;&#x53E3;&#x4E2D;&#x88AB;&#x8C03;&#x7528;&#xFF0C;&#x8C03;&#x7528;&#x5C42;&#x6B21;&#x4E3A;&#xFF1A;
  963. <code>DBImpl::NewIterator()-&gt;DBImpl::NewInternalIterator()-&gt;Version::AddIterators()</code>&#x3002;
  964. &#x51FD;&#x6570;&#x529F;&#x80FD;&#x662F;&#x4E3A;&#x8BE5;Version&#x4E2D;&#x7684;&#x6240;&#x6709;sstable&#x90FD;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;Two Level Iterator&#xFF0C;&#x4EE5;&#x904D;&#x5386;sstable&#x7684;&#x5185;&#x5BB9;&#x3002;</p>
  965. <ul>
  966. <li>&#x5BF9;&#x4E8E;<strong>level=0</strong>&#x7EA7;&#x522B;&#x7684;sstable&#x6587;&#x4EF6;&#xFF0C;&#x76F4;&#x63A5;&#x901A;&#x8FC7;TableCache::NewIterator()&#x63A5;&#x53E3;&#x521B;&#x5EFA;&#xFF0C;&#x8FD9;&#x4F1A;&#x76F4;&#x63A5;&#x8F7D;&#x5165;sstable&#x6587;&#x4EF6;&#x5230;&#x5185;&#x5B58;cache&#x4E2D;&#x3002;</li>
  967. <li>&#x5BF9;&#x4E8E;<strong>level&gt;0</strong>&#x7EA7;&#x522B;&#x7684;sstable&#x6587;&#x4EF6;&#xFF0C;&#x901A;&#x8FC7;&#x51FD;&#x6570;NewTwoLevelIterator()&#x521B;&#x5EFA;&#x4E00;&#x4E2A;TwoLevelIterator&#xFF0C;&#x8FD9;&#x5C31;&#x4F7F;&#x7528;&#x4E86;lazy open&#x7684;&#x673A;&#x5236;&#x3002;</li>
  968. </ul>
  969. <p>&#x4E0B;&#x9762;&#x6765;&#x5206;&#x6790;&#x51FD;&#x6570;&#x4EE3;&#x7801;&#xFF1A;</p>
  970. <h4 id="s1-&#x5BF9;&#x4E8E;level0&#x7EA7;&#x522B;&#x7684;sstable&#x6587;&#x4EF6;&#xFF0C;&#x76F4;&#x63A5;&#x88C5;&#x5165;cache&#xFF0C;level0&#x7684;sstable&#x6587;&#x4EF6;&#x53EF;&#x80FD;&#x6709;&#x91CD;&#x5408;&#xFF0C;&#x9700;&#x8981;merge&#x3002;"><a name="s1-&#x5BF9;&#x4E8E;level0&#x7EA7;&#x522B;&#x7684;sstable&#x6587;&#x4EF6;&#xFF0C;&#x76F4;&#x63A5;&#x88C5;&#x5165;cache&#xFF0C;level0&#x7684;sstable&#x6587;&#x4EF6;&#x53EF;&#x80FD;&#x6709;&#x91CD;&#x5408;&#xFF0C;&#x9700;&#x8981;merge&#x3002;" class="anchor-navigation-ex-anchor" href="#s1-&#x5BF9;&#x4E8E;level0&#x7EA7;&#x522B;&#x7684;sstable&#x6587;&#x4EF6;&#xFF0C;&#x76F4;&#x63A5;&#x88C5;&#x5165;cache&#xFF0C;level0&#x7684;sstable&#x6587;&#x4EF6;&#x53EF;&#x80FD;&#x6709;&#x91CD;&#x5408;&#xFF0C;&#x9700;&#x8981;merge&#x3002;"><i class="fa fa-link" aria-hidden="true"></i></a>S1 &#x5BF9;&#x4E8E;level=0&#x7EA7;&#x522B;&#x7684;sstable&#x6587;&#x4EF6;&#xFF0C;&#x76F4;&#x63A5;&#x88C5;&#x5165;cache&#xFF0C;level0&#x7684;sstable&#x6587;&#x4EF6;&#x53EF;&#x80FD;&#x6709;&#x91CD;&#x5408;&#xFF0C;&#x9700;&#x8981;merge&#x3002;</h4>
  971. <pre class="language-"><code>for (size_t i = 0; i <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>files_[0].size();</span> <span class="token attr-name">i++)</span> <span class="token attr-name">{</span>
  972. <span class="token attr-name">iters-</span><span class="token punctuation">&gt;</span></span>push_back(vset_-&gt;table_cache_-&gt;NewIterator(// versionset::table_cache_
  973. options,files_[0][i]-&gt;number, files_[0][i]-&gt;file_size));
  974. }
  975. </code></pre><h4 id="s2-&#x5BF9;&#x4E8E;level0&#x7EA7;&#x522B;&#x7684;sstable&#x6587;&#x4EF6;&#xFF0C;lazy-open&#x673A;&#x5236;&#xFF0C;&#x5B83;&#x4EEC;&#x4E0D;&#x4F1A;&#x6709;&#x91CD;&#x53E0;&#x3002;"><a name="s2-&#x5BF9;&#x4E8E;level0&#x7EA7;&#x522B;&#x7684;sstable&#x6587;&#x4EF6;&#xFF0C;lazy-open&#x673A;&#x5236;&#xFF0C;&#x5B83;&#x4EEC;&#x4E0D;&#x4F1A;&#x6709;&#x91CD;&#x53E0;&#x3002;" class="anchor-navigation-ex-anchor" href="#s2-&#x5BF9;&#x4E8E;level0&#x7EA7;&#x522B;&#x7684;sstable&#x6587;&#x4EF6;&#xFF0C;lazy-open&#x673A;&#x5236;&#xFF0C;&#x5B83;&#x4EEC;&#x4E0D;&#x4F1A;&#x6709;&#x91CD;&#x53E0;&#x3002;"><i class="fa fa-link" aria-hidden="true"></i></a>S2 &#x5BF9;&#x4E8E;level&gt;0&#x7EA7;&#x522B;&#x7684;sstable&#x6587;&#x4EF6;&#xFF0C;lazy open&#x673A;&#x5236;&#xFF0C;&#x5B83;&#x4EEC;&#x4E0D;&#x4F1A;&#x6709;&#x91CD;&#x53E0;&#x3002;</h4>
  976. <pre class="language-"><code>for (int ll = 1; ll <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token namespace">config:</span>:kNumLevels;</span> <span class="token attr-name">ll++)</span> <span class="token attr-name">{</span>
  977. <span class="token attr-name">if(!files_[ll].empty())</span> <span class="token attr-name">iters-</span><span class="token punctuation">&gt;</span></span>push_back(NewConcatenatingIterator(options,level));
  978. }
  979. </code></pre><p>&#x51FD;&#x6570;NewConcatenatingIterator()&#x76F4;&#x63A5;&#x8FD4;&#x56DE;&#x4E00;&#x4E2A;TwoLevelIterator&#x5BF9;&#x8C61;&#xFF1A;</p>
  980. <pre class="language-"><code>return NewTwoLevelIterator(new LevelFileNumIterator(vset_-&gt;icmp_,&amp;files_[level]),
  981. &amp;GetFileIterator,vset_-&gt;table_cache_, options);
  982. </code></pre><ul>
  983. <li>&#x5176;&#x7B2C;&#x4E00;&#x7EA7;iterator&#x662F;&#x4E00;&#x4E2A;LevelFileNumIterator</li>
  984. <li>&#x7B2C;&#x4E8C;&#x7EA7;&#x7684;&#x8FED;&#x4EE3;&#x51FD;&#x6570;&#x662F;GetFileIterator</li>
  985. </ul>
  986. <p>&#x4E0B;&#x9762;&#x5C31;&#x6765;&#x5206;&#x522B;&#x5206;&#x6790;&#x4E4B;&#x3002;
  987. GetFileIterator&#x662F;&#x4E00;&#x4E2A;&#x9759;&#x6001;&#x51FD;&#x6570;&#xFF0C;&#x5F88;&#x7B80;&#x5355;&#xFF0C;&#x76F4;&#x63A5;&#x8FD4;&#x56DE;TableCache::NewIterator()&#x3002;&#x51FD;&#x6570;&#x58F0;&#x660E;&#x4E3A;&#xFF1A;</p>
  988. <pre class="language-"><code>static Iterator* GetFileIterator(void* arg,const ReadOptions&amp; options, constSlice&amp; file_value)
  989. TableCache* cache =reinterpret_cast<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>TableCache*</span><span class="token punctuation">&gt;</span></span>(arg);
  990. if (file_value.size() != 16) { // &#x9519;&#x8BEF;
  991. return NewErrorIterator(Status::Corruption(&quot;xxx&quot;));
  992. } else {
  993. return cache-&gt;NewIterator(options,
  994. DecodeFixed64(file_value.data()), // filenumber
  995. DecodeFixed64(file_value.data() + 8)); // filesize
  996. }
  997. </code></pre><p>&#x8FD9;&#x91CC;&#x7684;<strong>file_value</strong>&#x662F;&#x53D6;&#x81EA;&#x4E8E;LevelFileNumIterator&#x7684;value&#xFF0C;&#x5B83;&#x7684;value()&#x51FD;&#x6570;&#x628A;file number&#x548C;size&#x4EE5;Fixed 8byte&#x7684;&#x65B9;&#x5F0F;&#x538B;&#x7F29;&#x6210;&#x4E00;&#x4E2A;Slice&#x5BF9;&#x8C61;&#x5E76;&#x8FD4;&#x56DE;&#x3002;</p>
  998. <h3 id="103-versionlevelfilenumiterator&#x7C7B;"><a name="103-versionlevelfilenumiterator&#x7C7B;" class="anchor-navigation-ex-anchor" href="#103-versionlevelfilenumiterator&#x7C7B;"><i class="fa fa-link" aria-hidden="true"></i></a>10.3 Version::LevelFileNumIterator&#x7C7B;</h3>
  999. <p>&#x8FD9;&#x4E5F;&#x662F;&#x4E00;&#x4E2A;&#x7EE7;&#x627F;&#x8005;Iterator&#x7684;&#x5B50;&#x7C7B;&#xFF0C;&#x4E00;&#x4E2A;&#x5185;&#x90E8;Iterator&#x3002;</p>
  1000. <p><strong>&#x7ED9;&#x5B9A;&#x4E00;&#x4E2A;version/level&#x5BF9;</strong>&#xFF0C;&#x751F;&#x6210;&#x8BE5;level&#x5185;&#x7684;&#x6587;&#x4EF6;&#x4FE1;&#x606F;&#x3002;</p>
  1001. <p><strong>&#x5BF9;&#x4E8E;&#x7ED9;&#x5B9A;&#x7684;entry</strong>&#xFF1A;</p>
  1002. <ul>
  1003. <li>key()&#x8FD4;&#x56DE;&#x7684;&#x662F;&#x6587;&#x4EF6;&#x4E2D;&#x6240;&#x5305;&#x542B;&#x7684;&#x6700;&#x5927;&#x7684;key&#xFF1B;</li>
  1004. <li>value()&#x8FD4;&#x56DE;&#x7684;&#x662F;|file number(8 bytes)|file size(8 bytes)|&#x4E32;&#xFF1B;</li>
  1005. <li>&#x5B83;&#x7684;&#x6784;&#x9020;&#x51FD;&#x6570;&#x63A5;&#x53D7;&#x4E24;&#x4E2A;&#x53C2;&#x6570;&#xFF1A;InternalKeyComparator&amp;&#xFF0C;&#x7528;&#x4E8E;key&#x7684;&#x6BD4;&#x8F83;&#xFF1B;</li>
  1006. <li>vector<filemetadata*>*&#xFF0C;&#x6307;&#x5411;version&#x7684;&#x6240;&#x6709;sstable&#x6587;&#x4EF6;&#x5217;&#x8868;&#x3002;</filemetadata*></li>
  1007. </ul>
  1008. <pre class="language-"><code>LevelFileNumIterator(const InternalKeyComparator&amp; icmp,
  1009. const std::vector<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>FileMetaData*</span><span class="token punctuation">&gt;</span></span>* flist)
  1010. : icmp_(icmp), flist_(flist),index_(flist-&gt;size()) {} // Marks as invalid
  1011. </code></pre><p>&#x6765;&#x770B;&#x770B;&#x5176;&#x63A5;&#x53E3;&#x5B9E;&#x73B0;&#xFF0C;&#x4E0D;&#x9650;&#x5570;&#x55E6;&#xFF0C;&#x5168;&#x90E8;&#x90FD;&#x5217;&#x51FA;&#x6765;&#x3002;</p>
  1012. <p>Valid&#x51FD;&#x6570;&#x3001;SeekToxx&#x548C;Next/Prev&#x51FD;&#x6570;&#x90FD;&#x5F88;&#x7B80;&#x5355;&#xFF0C;&#x6BD5;&#x7ADF;&#x5BB9;&#x5668;&#x662F;&#x4E00;&#x4E2A;vector&#x3002;Seek&#x51FD;&#x6570;&#x8C03;&#x7528;&#x4E86;FindFile&#xFF0C;&#x8FD9;&#x4E2A;&#x51FD;&#x6570;&#x540E;&#x9762;&#x4F1A;&#x5206;&#x6790;&#x3002;</p>
  1013. <pre class="language-"><code>virtual void Seek(constSlice&amp; target) { index_ = FindFile(icmp_, *flist_, target);}
  1014. virtual void SeekToFirst() {index_ = 0; }
  1015. virtual void SeekToLast() {index_ = flist_-&gt;empty() ? 0 : flist_-&gt;size() - 1;}
  1016. virtual void Next() {
  1017. assert(Valid());
  1018. index_++;
  1019. }
  1020. virtual void Prev() {
  1021. assert(Valid());
  1022. if (index_ == 0) index_ =flist_-&gt;size(); // Marks as invalid
  1023. else index_--;
  1024. }
  1025. Slice key() const {
  1026. assert(Valid());
  1027. return(*flist_)[index_]-&gt;largest.Encode(); // &#x8FD4;&#x56DE;&#x5F53;&#x524D;sstable&#x5305;&#x542B;&#x7684;largest key
  1028. }
  1029. Slice value() const { // &#x6839;&#x636E;|number|size|&#x7684;&#x683C;&#x5F0F;Fixed int&#x538B;&#x7F29;
  1030. assert(Valid());
  1031. EncodeFixed64(value_buf_,(*flist_)[index_]-&gt;number);
  1032. EncodeFixed64(value_buf_+8,(*flist_)[index_]-&gt;file_size);
  1033. return Slice(value_buf_,sizeof(value_buf_));
  1034. }
  1035. </code></pre><p>&#x6765;&#x770B;FindFile&#xFF0C;&#x8FD9;&#x5176;&#x5B9E;&#x662F;&#x4E00;&#x4E2A;&#x4E8C;&#x5206;&#x67E5;&#x627E;&#x51FD;&#x6570;&#xFF0C;&#x56E0;&#x4E3A;&#x4F20;&#x5165;&#x7684;sstable&#x6587;&#x4EF6;&#x5217;&#x8868;&#x662F;&#x6709;&#x5E8F;&#x7684;&#xFF0C;&#x56E0;&#x6B64;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x4E8C;&#x5206;&#x67E5;&#x627E;&#x7B97;&#x6CD5;&#x3002;&#x5C31;&#x4E0D;&#x518D;&#x5217;&#x51FA;&#x4EE3;&#x7801;&#x4E86;&#x3002;</p>
  1036. <h3 id="104-versionget"><a name="104-versionget" class="anchor-navigation-ex-anchor" href="#104-versionget"><i class="fa fa-link" aria-hidden="true"></i></a>10.4 Version::Get()</h3>
  1037. <p>&#x67E5;&#x627E;&#x51FD;&#x6570;&#xFF0C;&#x76F4;&#x63A5;&#x5728;DBImpl::Get()&#x4E2D;&#x88AB;&#x8C03;&#x7528;&#xFF0C;&#x51FD;&#x6570;&#x539F;&#x578B;&#x4E3A;&#xFF1A;</p>
  1038. <pre class="language-"><code>Status Version::Get(const ReadOptions&amp; options, constLookupKey&amp; k, std::string* value, GetStats* stats)
  1039. </code></pre><p><strong>&#x5982;&#x679C;&#x672C;&#x6B21;Get&#x4E0D;&#x6B62;seek&#x4E86;&#x4E00;&#x4E2A;&#x6587;&#x4EF6;</strong>&#xFF08;&#x4EC5;&#x4F1A;&#x53D1;&#x751F;&#x5728;level 0&#x7684;&#x60C5;&#x51B5;&#xFF09;&#xFF0C;&#x5C31;&#x5C06;&#x641C;&#x7D22;&#x7684;&#x7B2C;&#x4E00;&#x4E2A;&#x6587;&#x4EF6;&#x4FDD;&#x5B58;&#x5728;stats&#x4E2D;&#x3002;<strong>&#x5982;&#x679C;stat&#x6709;&#x6570;&#x636E;&#x8FD4;&#x56DE;</strong>&#xFF0C;&#x8868;&#x660E;&#x672C;&#x6B21;&#x8BFB;&#x53D6;&#x5728;&#x641C;&#x7D22;&#x5230;&#x5305;&#x542B;key&#x7684;sstable&#x6587;&#x4EF6;&#x4E4B;&#x524D;&#xFF0C;&#x8FD8;&#x505A;&#x4E86;&#x5176;&#x5B83;&#x65E0;&#x8C13;&#x7684;&#x641C;&#x7D22;&#x3002;&#x8FD9;&#x4E2A;&#x7ED3;&#x679C;&#x5C06;&#x7528;&#x5728;UpdateStats()&#x4E2D;&#x3002;
  1040. &#x8FD9;&#x4E2A;&#x51FD;&#x6570;&#x903B;&#x8F91;&#x8FD8;&#x662F;&#x6709;&#x4E9B;&#x590D;&#x6742;&#x7684;&#xFF0C;&#x6765;&#x770B;&#x770B;&#x4EE3;&#x7801;&#x3002;</p>
  1041. <h4 id="s1-&#x9996;&#x5148;&#xFF0C;&#x53D6;&#x5F97;&#x5FC5;&#x8981;&#x7684;&#x4FE1;&#x606F;&#xFF0C;&#x521D;&#x59CB;&#x5316;&#x51E0;&#x4E2A;&#x4E34;&#x65F6;&#x53D8;&#x91CF;"><a name="s1-&#x9996;&#x5148;&#xFF0C;&#x53D6;&#x5F97;&#x5FC5;&#x8981;&#x7684;&#x4FE1;&#x606F;&#xFF0C;&#x521D;&#x59CB;&#x5316;&#x51E0;&#x4E2A;&#x4E34;&#x65F6;&#x53D8;&#x91CF;" class="anchor-navigation-ex-anchor" href="#s1-&#x9996;&#x5148;&#xFF0C;&#x53D6;&#x5F97;&#x5FC5;&#x8981;&#x7684;&#x4FE1;&#x606F;&#xFF0C;&#x521D;&#x59CB;&#x5316;&#x51E0;&#x4E2A;&#x4E34;&#x65F6;&#x53D8;&#x91CF;"><i class="fa fa-link" aria-hidden="true"></i></a>S1 &#x9996;&#x5148;&#xFF0C;&#x53D6;&#x5F97;&#x5FC5;&#x8981;&#x7684;&#x4FE1;&#x606F;&#xFF0C;&#x521D;&#x59CB;&#x5316;&#x51E0;&#x4E2A;&#x4E34;&#x65F6;&#x53D8;&#x91CF;</h4>
  1042. <pre class="language-"><code>Slice ikey = k.internal_key();
  1043. Slice user_key = k.user_key();
  1044. const Comparator* ucmp =vset_-&gt;icmp_.user_comparator();
  1045. Status s;
  1046. stats-&gt;seek_file = NULL;
  1047. stats-&gt;seek_file_level = -1;
  1048. FileMetaData* last_file_read =NULL; // &#x5728;&#x627E;&#x5230;&gt;1&#x4E2A;&#x6587;&#x4EF6;&#x65F6;&#xFF0C;&#x8BFB;&#x53D6;&#x65F6;&#x8BB0;&#x5F55;&#x4E0A;&#x4E00;&#x4E2A;
  1049. int last_file_read_level = -1; // &#x8FD9;&#x4EC5;&#x53D1;&#x751F;&#x5728;level 0&#x7684;&#x60C5;&#x51B5;&#x4E0B;
  1050. std::vector<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>FileMetaData*</span><span class="token punctuation">&gt;</span></span>tmp;
  1051. FileMetaData* tmp2;
  1052. </code></pre><h4 id="s2-&#x4ECE;0&#x5F00;&#x59CB;&#x904D;&#x5386;&#x6240;&#x6709;&#x7684;level&#xFF0C;&#x4F9D;&#x6B21;&#x67E5;&#x627E;&#x3002;&#x56E0;&#x4E3A;entry&#x4E0D;&#x4F1A;&#x8DE8;&#x8D8A;level&#xFF0C;&#x56E0;&#x6B64;&#x5982;&#x679C;&#x5728;&#x67D0;&#x4E2A;level&#x4E2D;&#x627E;&#x5230;&#x4E86;entry&#xFF0C;&#x90A3;&#x4E48;&#x5C31;&#x65E0;&#x9700;&#x5728;&#x540E;&#x9762;&#x7684;level&#x4E2D;&#x67E5;&#x627E;&#x4E86;&#x3002;"><a name="s2-&#x4ECE;0&#x5F00;&#x59CB;&#x904D;&#x5386;&#x6240;&#x6709;&#x7684;level&#xFF0C;&#x4F9D;&#x6B21;&#x67E5;&#x627E;&#x3002;&#x56E0;&#x4E3A;entry&#x4E0D;&#x4F1A;&#x8DE8;&#x8D8A;level&#xFF0C;&#x56E0;&#x6B64;&#x5982;&#x679C;&#x5728;&#x67D0;&#x4E2A;level&#x4E2D;&#x627E;&#x5230;&#x4E86;entry&#xFF0C;&#x90A3;&#x4E48;&#x5C31;&#x65E0;&#x9700;&#x5728;&#x540E;&#x9762;&#x7684;level&#x4E2D;&#x67E5;&#x627E;&#x4E86;&#x3002;" class="anchor-navigation-ex-anchor" href="#s2-&#x4ECE;0&#x5F00;&#x59CB;&#x904D;&#x5386;&#x6240;&#x6709;&#x7684;level&#xFF0C;&#x4F9D;&#x6B21;&#x67E5;&#x627E;&#x3002;&#x56E0;&#x4E3A;entry&#x4E0D;&#x4F1A;&#x8DE8;&#x8D8A;level&#xFF0C;&#x56E0;&#x6B64;&#x5982;&#x679C;&#x5728;&#x67D0;&#x4E2A;level&#x4E2D;&#x627E;&#x5230;&#x4E86;entry&#xFF0C;&#x90A3;&#x4E48;&#x5C31;&#x65E0;&#x9700;&#x5728;&#x540E;&#x9762;&#x7684;level&#x4E2D;&#x67E5;&#x627E;&#x4E86;&#x3002;"><i class="fa fa-link" aria-hidden="true"></i></a>S2 &#x4ECE;0&#x5F00;&#x59CB;&#x904D;&#x5386;&#x6240;&#x6709;&#x7684;level&#xFF0C;&#x4F9D;&#x6B21;&#x67E5;&#x627E;&#x3002;&#x56E0;&#x4E3A;entry&#x4E0D;&#x4F1A;&#x8DE8;&#x8D8A;level&#xFF0C;&#x56E0;&#x6B64;&#x5982;&#x679C;&#x5728;&#x67D0;&#x4E2A;level&#x4E2D;&#x627E;&#x5230;&#x4E86;entry&#xFF0C;&#x90A3;&#x4E48;&#x5C31;&#x65E0;&#x9700;&#x5728;&#x540E;&#x9762;&#x7684;level&#x4E2D;&#x67E5;&#x627E;&#x4E86;&#x3002;</h4>
  1053. <pre class="language-"><code>for (int level = 0; level &lt;config::kNumLevels; level++) {
  1054. size_t num_files = files_[level].size();
  1055. if (num_files == 0) continue; // &#x672C;&#x5C42;&#x6CA1;&#x6709;&#x6587;&#x4EF6;&#xFF0C;&#x5219;&#x76F4;&#x63A5;&#x8DF3;&#x8FC7;
  1056. // &#x53D6;&#x5F97;level&#x4E0B;&#x7684;&#x6240;&#x6709;sstable&#x6587;&#x4EF6;&#x5217;&#x8868;&#xFF0C;&#x641C;&#x7D22;&#x672C;&#x5C42;
  1057. FileMetaData* const* files = &amp;files_[level][0];
  1058. </code></pre><p>&#x540E;&#x9762;&#x7684;&#x6240;&#x6709;&#x903B;&#x8F91;&#x90FD;&#x5728;for&#x5FAA;&#x73AF;&#x4F53;&#x4E2D;&#x3002;</p>
  1059. <h4 id="s3-&#x904D;&#x5386;level&#x4E0B;&#x7684;sstable&#x6587;&#x4EF6;&#x5217;&#x8868;&#xFF0C;&#x641C;&#x7D22;&#xFF0C;&#x6CE8;&#x610F;&#x5BF9;&#x4E8E;level0&#x548C;0&#x7684;sstable&#x6587;&#x4EF6;&#x7684;&#x5904;&#x7406;&#xFF0C;&#x7531;&#x4E8E;level-0&#x6587;&#x4EF6;&#x4E4B;&#x95F4;&#x7684;key&#x53EF;&#x80FD;&#x6709;&#x91CD;&#x53E0;&#xFF0C;&#x56E0;&#x6B64;&#x5904;&#x7406;&#x903B;&#x8F91;&#x6709;&#x522B;&#x4E8E;0&#x7684;level&#x3002;"><a name="s3-&#x904D;&#x5386;level&#x4E0B;&#x7684;sstable&#x6587;&#x4EF6;&#x5217;&#x8868;&#xFF0C;&#x641C;&#x7D22;&#xFF0C;&#x6CE8;&#x610F;&#x5BF9;&#x4E8E;level0&#x548C;0&#x7684;sstable&#x6587;&#x4EF6;&#x7684;&#x5904;&#x7406;&#xFF0C;&#x7531;&#x4E8E;level-0&#x6587;&#x4EF6;&#x4E4B;&#x95F4;&#x7684;key&#x53EF;&#x80FD;&#x6709;&#x91CD;&#x53E0;&#xFF0C;&#x56E0;&#x6B64;&#x5904;&#x7406;&#x903B;&#x8F91;&#x6709;&#x522B;&#x4E8E;0&#x7684;level&#x3002;" class="anchor-navigation-ex-anchor" href="#s3-&#x904D;&#x5386;level&#x4E0B;&#x7684;sstable&#x6587;&#x4EF6;&#x5217;&#x8868;&#xFF0C;&#x641C;&#x7D22;&#xFF0C;&#x6CE8;&#x610F;&#x5BF9;&#x4E8E;level0&#x548C;0&#x7684;sstable&#x6587;&#x4EF6;&#x7684;&#x5904;&#x7406;&#xFF0C;&#x7531;&#x4E8E;level-0&#x6587;&#x4EF6;&#x4E4B;&#x95F4;&#x7684;key&#x53EF;&#x80FD;&#x6709;&#x91CD;&#x53E0;&#xFF0C;&#x56E0;&#x6B64;&#x5904;&#x7406;&#x903B;&#x8F91;&#x6709;&#x522B;&#x4E8E;0&#x7684;level&#x3002;"><i class="fa fa-link" aria-hidden="true"></i></a>S3 &#x904D;&#x5386;level&#x4E0B;&#x7684;sstable&#x6587;&#x4EF6;&#x5217;&#x8868;&#xFF0C;&#x641C;&#x7D22;&#xFF0C;&#x6CE8;&#x610F;&#x5BF9;&#x4E8E;level=0&#x548C;&gt;0&#x7684;sstable&#x6587;&#x4EF6;&#x7684;&#x5904;&#x7406;&#xFF0C;&#x7531;&#x4E8E;level 0&#x6587;&#x4EF6;&#x4E4B;&#x95F4;&#x7684;key&#x53EF;&#x80FD;&#x6709;&#x91CD;&#x53E0;&#xFF0C;&#x56E0;&#x6B64;&#x5904;&#x7406;&#x903B;&#x8F91;&#x6709;&#x522B;&#x4E8E;&gt;0&#x7684;level&#x3002;</h4>
  1060. <h5 id="s31-&#x5BF9;&#x4E8E;level-0&#xFF0C;&#x6587;&#x4EF6;&#x53EF;&#x80FD;&#x6709;&#x91CD;&#x53E0;&#xFF0C;&#x627E;&#x5230;&#x6240;&#x6709;&#x548C;userkey&#x6709;&#x91CD;&#x53E0;&#x7684;&#x6587;&#x4EF6;&#xFF0C;&#x7136;&#x540E;&#x6839;&#x636E;&#x65F6;&#x95F4;&#x987A;&#x5E8F;&#x4ECE;&#x6700;&#x65B0;&#x7684;&#x6587;&#x4EF6;&#x4F9D;&#x6B21;&#x5904;&#x7406;&#x3002;"><a name="s31-&#x5BF9;&#x4E8E;level-0&#xFF0C;&#x6587;&#x4EF6;&#x53EF;&#x80FD;&#x6709;&#x91CD;&#x53E0;&#xFF0C;&#x627E;&#x5230;&#x6240;&#x6709;&#x548C;userkey&#x6709;&#x91CD;&#x53E0;&#x7684;&#x6587;&#x4EF6;&#xFF0C;&#x7136;&#x540E;&#x6839;&#x636E;&#x65F6;&#x95F4;&#x987A;&#x5E8F;&#x4ECE;&#x6700;&#x65B0;&#x7684;&#x6587;&#x4EF6;&#x4F9D;&#x6B21;&#x5904;&#x7406;&#x3002;" class="anchor-navigation-ex-anchor" href="#s31-&#x5BF9;&#x4E8E;level-0&#xFF0C;&#x6587;&#x4EF6;&#x53EF;&#x80FD;&#x6709;&#x91CD;&#x53E0;&#xFF0C;&#x627E;&#x5230;&#x6240;&#x6709;&#x548C;userkey&#x6709;&#x91CD;&#x53E0;&#x7684;&#x6587;&#x4EF6;&#xFF0C;&#x7136;&#x540E;&#x6839;&#x636E;&#x65F6;&#x95F4;&#x987A;&#x5E8F;&#x4ECE;&#x6700;&#x65B0;&#x7684;&#x6587;&#x4EF6;&#x4F9D;&#x6B21;&#x5904;&#x7406;&#x3002;"><i class="fa fa-link" aria-hidden="true"></i></a>S3.1 &#x5BF9;&#x4E8E;level 0&#xFF0C;&#x6587;&#x4EF6;&#x53EF;&#x80FD;&#x6709;&#x91CD;&#x53E0;&#xFF0C;&#x627E;&#x5230;&#x6240;&#x6709;&#x548C;user_key&#x6709;&#x91CD;&#x53E0;&#x7684;&#x6587;&#x4EF6;&#xFF0C;&#x7136;&#x540E;&#x6839;&#x636E;&#x65F6;&#x95F4;&#x987A;&#x5E8F;&#x4ECE;&#x6700;&#x65B0;&#x7684;&#x6587;&#x4EF6;&#x4F9D;&#x6B21;&#x5904;&#x7406;&#x3002;</h5>
  1061. <pre class="language-"><code>tmp.reserve(num_files);
  1062. for (uint32_t i = 0; i &lt;num_files; i++) { // &#x904D;&#x5386;level 0&#x4E0B;&#x7684;&#x6240;&#x6709;sstable&#x6587;&#x4EF6;
  1063. FileMetaData* f =files[i];
  1064. if(ucmp-&gt;Compare(user_key, f-&gt;smallest.user_key()) &gt;= 0 &amp;&amp;
  1065. ucmp-&gt;Compare(user_key, f-&gt;largest.user_key()) &lt;= 0)
  1066. tmp.push_back(f); // sstable&#x6587;&#x4EF6;&#x6709;user_key&#x6709;&#x91CD;&#x53E0;
  1067. }
  1068. if (tmp.empty()) continue;
  1069. std::sort(tmp.begin(),tmp.end(), NewestFirst); // &#x6392;&#x5E8F;
  1070. files = &amp;tmp[0]; num_files= tmp.size();// &#x6307;&#x5411;tmp&#x6307;&#x9488;&#x548C;&#x5927;&#x5C0F;
  1071. </code></pre><h5 id="s32-&#x5BF9;&#x4E8E;level0&#xFF0C;leveldb&#x4FDD;&#x8BC1;sstable&#x6587;&#x4EF6;&#x4E4B;&#x95F4;&#x4E0D;&#x4F1A;&#x6709;&#x91CD;&#x53E0;&#xFF0C;&#x6240;&#x4EE5;&#x5904;&#x7406;&#x903B;&#x8F91;&#x6709;&#x522B;&#x4E8E;level-0&#xFF0C;&#x76F4;&#x63A5;&#x6839;&#x636E;ikey&#x5B9A;&#x4F4D;&#x5230;sstable&#x6587;&#x4EF6;&#x5373;&#x53EF;&#x3002;"><a name="s32-&#x5BF9;&#x4E8E;level0&#xFF0C;leveldb&#x4FDD;&#x8BC1;sstable&#x6587;&#x4EF6;&#x4E4B;&#x95F4;&#x4E0D;&#x4F1A;&#x6709;&#x91CD;&#x53E0;&#xFF0C;&#x6240;&#x4EE5;&#x5904;&#x7406;&#x903B;&#x8F91;&#x6709;&#x522B;&#x4E8E;level-0&#xFF0C;&#x76F4;&#x63A5;&#x6839;&#x636E;ikey&#x5B9A;&#x4F4D;&#x5230;sstable&#x6587;&#x4EF6;&#x5373;&#x53EF;&#x3002;" class="anchor-navigation-ex-anchor" href="#s32-&#x5BF9;&#x4E8E;level0&#xFF0C;leveldb&#x4FDD;&#x8BC1;sstable&#x6587;&#x4EF6;&#x4E4B;&#x95F4;&#x4E0D;&#x4F1A;&#x6709;&#x91CD;&#x53E0;&#xFF0C;&#x6240;&#x4EE5;&#x5904;&#x7406;&#x903B;&#x8F91;&#x6709;&#x522B;&#x4E8E;level-0&#xFF0C;&#x76F4;&#x63A5;&#x6839;&#x636E;ikey&#x5B9A;&#x4F4D;&#x5230;sstable&#x6587;&#x4EF6;&#x5373;&#x53EF;&#x3002;"><i class="fa fa-link" aria-hidden="true"></i></a>S3.2 &#x5BF9;&#x4E8E;level&gt;0&#xFF0C;leveldb&#x4FDD;&#x8BC1;sstable&#x6587;&#x4EF6;&#x4E4B;&#x95F4;&#x4E0D;&#x4F1A;&#x6709;&#x91CD;&#x53E0;&#xFF0C;&#x6240;&#x4EE5;&#x5904;&#x7406;&#x903B;&#x8F91;&#x6709;&#x522B;&#x4E8E;level 0&#xFF0C;&#x76F4;&#x63A5;&#x6839;&#x636E;ikey&#x5B9A;&#x4F4D;&#x5230;sstable&#x6587;&#x4EF6;&#x5373;&#x53EF;&#x3002;</h5>
  1072. <pre class="language-"><code>//&#x4E8C;&#x5206;&#x67E5;&#x627E;&#xFF0C;&#x627E;&#x5230;&#x7B2C;&#x4E00;&#x4E2A;largest key &gt;=ikey&#x7684;file index
  1073. uint32_t index =FindFile(vset_-&gt;icmp_, files_[level], ikey);
  1074. if (index &gt;= num_files) { // &#x672A;&#x627E;&#x5230;&#xFF0C;&#x6587;&#x4EF6;&#x4E0D;&#x5B58;&#x5728;
  1075. files = NULL; num_files = 0;
  1076. } else {
  1077. tmp2 = files[index];
  1078. if(ucmp-&gt;Compare(user_key, tmp2-&gt;smallest.user_key()) &lt; 0) {
  1079. // &#x627E;&#x5230;&#x7684;&#x6587;&#x4EF6;&#x5176;&#x6240;&#x6709;key&#x90FD;&#x5927;&#x4E8E;user_key&#xFF0C;&#x7B49;&#x4E8E;&#x6587;&#x4EF6;&#x4E0D;&#x5B58;&#x5728;
  1080. files = NULL; num_files = 0;
  1081. } else {
  1082. files = <span class="token entity named-entity" title="&amp;tmp2;">&amp;tmp2;</span> num_files = 1;
  1083. }
  1084. }
  1085. </code></pre><h4 id="s4-&#x904D;&#x5386;&#x627E;&#x5230;&#x7684;&#x6587;&#x4EF6;&#xFF0C;&#x5B58;&#x5728;files&#x4E2D;&#xFF0C;&#x5176;&#x4E2A;&#x6570;&#x4E3A;numfiles&#x3002;"><a name="s4-&#x904D;&#x5386;&#x627E;&#x5230;&#x7684;&#x6587;&#x4EF6;&#xFF0C;&#x5B58;&#x5728;files&#x4E2D;&#xFF0C;&#x5176;&#x4E2A;&#x6570;&#x4E3A;numfiles&#x3002;" class="anchor-navigation-ex-anchor" href="#s4-&#x904D;&#x5386;&#x627E;&#x5230;&#x7684;&#x6587;&#x4EF6;&#xFF0C;&#x5B58;&#x5728;files&#x4E2D;&#xFF0C;&#x5176;&#x4E2A;&#x6570;&#x4E3A;numfiles&#x3002;"><i class="fa fa-link" aria-hidden="true"></i></a>S4 &#x904D;&#x5386;&#x627E;&#x5230;&#x7684;&#x6587;&#x4EF6;&#xFF0C;&#x5B58;&#x5728;files&#x4E2D;&#xFF0C;&#x5176;&#x4E2A;&#x6570;&#x4E3A;num_files&#x3002;</h4>
  1086. <pre class="language-"><code>for (uint32_t i = 0; i &lt;num_files; ++i) {
  1087. </code></pre><p>&#x540E;&#x9762;&#x7684;&#x903B;&#x8F91;&#x90FD;&#x5728;&#x8FD9;&#x4E00;&#x5C42;&#x5FAA;&#x73AF;&#x4E2D;&#xFF0C;&#x53EA;&#x8981;&#x5728;&#x67D0;&#x4E2A;&#x6587;&#x4EF6;&#x4E2D;&#x627E;&#x5230;&#x4E86;k/v&#x5BF9;&#xFF0C;&#x5C31;&#x8DF3;&#x51FA;for&#x5FAA;&#x73AF;&#x3002;</p>
  1088. <h5 id="s41-&#x5982;&#x679C;&#x672C;&#x6B21;&#x8BFB;&#x53D6;&#x4E0D;&#x6B62;&#x641C;&#x7D22;&#x4E86;&#x4E00;&#x4E2A;&#x6587;&#x4EF6;&#xFF0C;&#x8BB0;&#x5F55;&#x4E4B;&#xFF0C;&#x8FD9;&#x4EC5;&#x4F1A;&#x53D1;&#x751F;&#x5728;level-0&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#x3002;"><a name="s41-&#x5982;&#x679C;&#x672C;&#x6B21;&#x8BFB;&#x53D6;&#x4E0D;&#x6B62;&#x641C;&#x7D22;&#x4E86;&#x4E00;&#x4E2A;&#x6587;&#x4EF6;&#xFF0C;&#x8BB0;&#x5F55;&#x4E4B;&#xFF0C;&#x8FD9;&#x4EC5;&#x4F1A;&#x53D1;&#x751F;&#x5728;level-0&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#x3002;" class="anchor-navigation-ex-anchor" href="#s41-&#x5982;&#x679C;&#x672C;&#x6B21;&#x8BFB;&#x53D6;&#x4E0D;&#x6B62;&#x641C;&#x7D22;&#x4E86;&#x4E00;&#x4E2A;&#x6587;&#x4EF6;&#xFF0C;&#x8BB0;&#x5F55;&#x4E4B;&#xFF0C;&#x8FD9;&#x4EC5;&#x4F1A;&#x53D1;&#x751F;&#x5728;level-0&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#x3002;"><i class="fa fa-link" aria-hidden="true"></i></a>S4.1 &#x5982;&#x679C;&#x672C;&#x6B21;&#x8BFB;&#x53D6;&#x4E0D;&#x6B62;&#x641C;&#x7D22;&#x4E86;&#x4E00;&#x4E2A;&#x6587;&#x4EF6;&#xFF0C;&#x8BB0;&#x5F55;&#x4E4B;&#xFF0C;&#x8FD9;&#x4EC5;&#x4F1A;&#x53D1;&#x751F;&#x5728;level 0&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#x3002;</h5>
  1089. <pre class="language-"><code>if(last_file_read != NULL &amp;&amp; stats-&gt;seek_file == NULL) {
  1090. // &#x672C;&#x6B21;&#x8BFB;&#x53D6;&#x4E0D;&#x6B62;seek&#x4E86;&#x4E00;&#x4E2A;&#x6587;&#x4EF6;&#xFF0C;&#x8BB0;&#x5F55;&#x7B2C;&#x4E00;&#x4E2A;
  1091. stats-&gt;seek_file =last_file_read;
  1092. stats-&gt;seek_file_level= last_file_read_level;
  1093. }
  1094. FileMetaData* f = files[i];
  1095. last_file_read = f; // &#x8BB0;&#x5F55;&#x672C;&#x6B21;&#x8BFB;&#x53D6;&#x7684;level&#x548C;file
  1096. last_file_read_level =level;
  1097. </code></pre><h5 id="s42-&#x8C03;&#x7528;tablecacheget&#x5C1D;&#x8BD5;&#x83B7;&#x53D6;ikey-value&#xFF0C;&#x5982;&#x679C;&#x8FD4;&#x56DE;ok&#x5219;&#x8FDB;&#x5165;&#xFF0C;&#x5426;&#x5219;&#x76F4;&#x63A5;&#x8FD4;&#x56DE;&#xFF0C;&#x4F20;&#x9012;&#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x662F;savevalue&#x3002;"><a name="s42-&#x8C03;&#x7528;tablecacheget&#x5C1D;&#x8BD5;&#x83B7;&#x53D6;ikey-value&#xFF0C;&#x5982;&#x679C;&#x8FD4;&#x56DE;ok&#x5219;&#x8FDB;&#x5165;&#xFF0C;&#x5426;&#x5219;&#x76F4;&#x63A5;&#x8FD4;&#x56DE;&#xFF0C;&#x4F20;&#x9012;&#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x662F;savevalue&#x3002;" class="anchor-navigation-ex-anchor" href="#s42-&#x8C03;&#x7528;tablecacheget&#x5C1D;&#x8BD5;&#x83B7;&#x53D6;ikey-value&#xFF0C;&#x5982;&#x679C;&#x8FD4;&#x56DE;ok&#x5219;&#x8FDB;&#x5165;&#xFF0C;&#x5426;&#x5219;&#x76F4;&#x63A5;&#x8FD4;&#x56DE;&#xFF0C;&#x4F20;&#x9012;&#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x662F;savevalue&#x3002;"><i class="fa fa-link" aria-hidden="true"></i></a>S4.2 &#x8C03;&#x7528;TableCache::Get()&#x5C1D;&#x8BD5;&#x83B7;&#x53D6;{ikey, value}&#xFF0C;&#x5982;&#x679C;&#x8FD4;&#x56DE;OK&#x5219;&#x8FDB;&#x5165;&#xFF0C;&#x5426;&#x5219;&#x76F4;&#x63A5;&#x8FD4;&#x56DE;&#xFF0C;&#x4F20;&#x9012;&#x7684;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x662F;SaveValue()&#x3002;</h5>
  1098. <pre class="language-"><code>Saver saver; // &#x521D;&#x59CB;&#x5316;saver
  1099. saver.state = kNotFound;
  1100. saver.ucmp = ucmp;
  1101. saver.user_key = user_key;
  1102. saver.value = value;
  1103. s = vset_-&gt;table_cache_-&gt;Get(options,f-&gt;number, f-&gt;file_size,
  1104. ikey, &amp;saver, SaveValue);
  1105. if (!s.ok()) return s;
  1106. </code></pre><h5 id="s43-&#x6839;&#x636E;saver&#x7684;&#x72B6;&#x6001;&#x5224;&#x65AD;&#xFF0C;&#x5982;&#x679C;&#x662F;not-found&#x5219;&#x5411;&#x4E0B;&#x641C;&#x7D22;&#x4E0B;&#x4E00;&#x4E2A;&#x66F4;&#x65E9;&#x7684;sstable&#x6587;&#x4EF6;&#xFF0C;&#x5176;&#x5B83;&#x503C;&#x5219;&#x8FD4;&#x56DE;&#x3002;"><a name="s43-&#x6839;&#x636E;saver&#x7684;&#x72B6;&#x6001;&#x5224;&#x65AD;&#xFF0C;&#x5982;&#x679C;&#x662F;not-found&#x5219;&#x5411;&#x4E0B;&#x641C;&#x7D22;&#x4E0B;&#x4E00;&#x4E2A;&#x66F4;&#x65E9;&#x7684;sstable&#x6587;&#x4EF6;&#xFF0C;&#x5176;&#x5B83;&#x503C;&#x5219;&#x8FD4;&#x56DE;&#x3002;" class="anchor-navigation-ex-anchor" href="#s43-&#x6839;&#x636E;saver&#x7684;&#x72B6;&#x6001;&#x5224;&#x65AD;&#xFF0C;&#x5982;&#x679C;&#x662F;not-found&#x5219;&#x5411;&#x4E0B;&#x641C;&#x7D22;&#x4E0B;&#x4E00;&#x4E2A;&#x66F4;&#x65E9;&#x7684;sstable&#x6587;&#x4EF6;&#xFF0C;&#x5176;&#x5B83;&#x503C;&#x5219;&#x8FD4;&#x56DE;&#x3002;"><i class="fa fa-link" aria-hidden="true"></i></a>S4.3 &#x6839;&#x636E;saver&#x7684;&#x72B6;&#x6001;&#x5224;&#x65AD;&#xFF0C;&#x5982;&#x679C;&#x662F;Not Found&#x5219;&#x5411;&#x4E0B;&#x641C;&#x7D22;&#x4E0B;&#x4E00;&#x4E2A;&#x66F4;&#x65E9;&#x7684;sstable&#x6587;&#x4EF6;&#xFF0C;&#x5176;&#x5B83;&#x503C;&#x5219;&#x8FD4;&#x56DE;&#x3002;</h5>
  1107. <pre class="language-"><code>switch (saver.state) {
  1108. case kNotFound: break; // &#x7EE7;&#x7EED;&#x641C;&#x7D22;&#x4E0B;&#x4E00;&#x4E2A;&#x66F4;&#x65E9;&#x7684;sstable&#x6587;&#x4EF6;
  1109. case kFound: return s; // &#x627E;&#x5230;
  1110. case kDeleted: // &#x5DF2;&#x5220;&#x9664;
  1111. s =Status::NotFound(Slice()); // &#x4E3A;&#x4E86;&#x6548;&#x7387;&#xFF0C;&#x4F7F;&#x7528;&#x7A7A;&#x7684;&#x9519;&#x8BEF;&#x5B57;&#x7B26;&#x4E32;
  1112. return s;
  1113. case kCorrupt: // &#x6570;&#x636E;&#x635F;&#x574F;
  1114. s =Status::Corruption(&quot;corrupted key for &quot;, user_key);
  1115. return s;
  1116. }
  1117. </code></pre><p>&#x4EE5;&#x4E0A;&#x5C31;&#x662F;Version::Get()&#x7684;&#x4EE3;&#x7801;&#x903B;&#x8F91;&#xFF0C;&#x5982;&#x679C;level 0&#x7684;sstable&#x6587;&#x4EF6;&#x592A;&#x591A;&#x7684;&#x8BDD;&#xFF0C;&#x4F1A;&#x5F71;&#x54CD;&#x8BFB;&#x53D6;&#x901F;&#x5EA6;&#xFF0C;&#x8FD9;&#x4E5F;&#x662F;&#x4E3A;&#x4EC0;&#x4E48;&#x8FDB;&#x884C;compaction&#x7684;&#x539F;&#x56E0;&#x3002;
  1118. &#x53E6;&#x5916;&#xFF0C;&#x8FD8;&#x6709;&#x4E00;&#x4E2A;&#x4F20;&#x9012;&#x7ED9;TableCache::Get()&#x7684;saver&#x51FD;&#x6570;&#xFF0C;&#x4E0B;&#x9762;&#x5C31;&#x6765;&#x7B80;&#x5355;&#x5206;&#x6790;&#x4E0B;&#x3002;&#x8FD9;&#x662F;&#x4E00;&#x4E2A;&#x9759;&#x6001;&#x51FD;&#x6570;&#xFF1A;static void SaveValue(void* arg,const Slice&amp; ikey, const Slice&amp; v)&#x3002;&#x5B83;&#x5185;&#x90E8;&#x4F7F;&#x7528;&#x4E86;&#x7ED3;&#x6784;&#x4F53;Saver&#xFF1A;</p>
  1119. <pre class="language-"><code>struct Saver {
  1120. SaverState state;
  1121. const Comparator* ucmp; // user key&#x6BD4;&#x8F83;&#x5668;
  1122. Slice user_key;
  1123. std::string* value;
  1124. };
  1125. </code></pre><p>&#x51FD;&#x6570;SaveValue&#x7684;&#x903B;&#x8F91;&#x5F88;&#x7B80;&#x5355;&#x3002;<strong>&#x9996;&#x5148;</strong>&#x89E3;&#x6790;Table&#x4F20;&#x5165;&#x7684;InternalKey&#xFF0C;<strong>&#x7136;&#x540E;</strong>&#x6839;&#x636E;&#x6307;&#x5B9A;&#x7684;Comparator&#x5224;&#x65AD;user key&#x662F;&#x5426;&#x662F;&#x8981;&#x67E5;&#x627E;&#x7684;user key&#x3002;<strong>&#x5982;&#x679C;</strong>&#x662F;&#x5E76;&#x4E14;type&#x662F;kTypeValue&#xFF0C;&#x5219;<strong>&#x8BBE;&#x7F6E;</strong>&#x5230;Saver::<em>value&#x4E2D;&#xFF0C;&#x5E76;<em>*&#x8FD4;&#x56DE;</em></em>kFound&#xFF0C;&#x5426;&#x5219;&#x8FD4;&#x56DE;kDeleted&#x3002;&#x4EE3;&#x7801;&#x5982;&#x4E0B;&#xFF1A;</p>
  1126. <pre class="language-"><code>Saver* s =reinterpret_cast<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>Saver*</span><span class="token punctuation">&gt;</span></span>(arg);
  1127. ParsedInternalKey parsed_key; // &#x89E3;&#x6790;ikey&#x5230;ParsedInternalKey
  1128. if (!ParseInternalKey(ikey,&amp;parsed_key)) s-&gt;state = kCorrupt; // &#x89E3;&#x6790;&#x5931;&#x8D25;
  1129. else {
  1130. if(s-&gt;ucmp-&gt;Compare(parsed_key.user_key, s-&gt;user_key) == 0) { // &#x6BD4;&#x8F83;user key
  1131. s-&gt;state =(parsed_key.type == kTypeValue) ? kFound : kDeleted;
  1132. if (s-&gt;state == kFound) s-&gt;value-&gt;assign(v.data(), v.size()); // &#x627E;&#x5230;&#xFF0C;&#x4FDD;&#x5B58;&#x7ED3;&#x679C;
  1133. }
  1134. }
  1135. </code></pre><p>&#x4E0B;&#x9762;&#x8981;&#x5206;&#x6790;&#x7684;&#x51E0;&#x4E2A;&#x51FD;&#x6570;&#xFF0C;&#x6216;&#x591A;&#x6216;&#x5C11;&#x90FD;&#x548C;compaction&#x76F8;&#x5173;&#x3002;</p>
  1136. <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;
  1137. 2020-10-03 13:34:32
  1138. </span></footer>
  1139. <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>
  1140. </section>
  1141. </div>
  1142. <div class="search-results">
  1143. <div class="has-results">
  1144. <h1 class="search-results-title"><span class='search-results-count'></span> results matching "<span class='search-query'></span>"</h1>
  1145. <ul class="search-results-list"></ul>
  1146. </div>
  1147. <div class="no-results">
  1148. <h1 class="search-results-title">No results matching "<span class='search-query'></span>"</h1>
  1149. </div>
  1150. </div>
  1151. </div>
  1152. </div>
  1153. </div>
  1154. </div>
  1155. <a href="leveldb源码分析15.html" class="navigation navigation-prev " aria-label="Previous page: leveldb源码分析15">
  1156. <i class="fa fa-angle-left"></i>
  1157. </a>
  1158. <a href="leveldb源码分析17.html" class="navigation navigation-next " aria-label="Next page: leveldb源码分析17">
  1159. <i class="fa fa-angle-right"></i>
  1160. </a>
  1161. </div>
  1162. <script>
  1163. var gitbook = gitbook || [];
  1164. gitbook.push(function() {
  1165. gitbook.page.hasChanged({"page":{"title":"leveldb源码分析16","level":"7.2.16","depth":2,"next":{"title":"leveldb源码分析17","level":"7.2.17","depth":2,"path":"articles/leveldb源码分析/leveldb源码分析17.md","ref":"articles/leveldb源码分析/leveldb源码分析17.md","articles":[]},"previous":{"title":"leveldb源码分析15","level":"7.2.15","depth":2,"path":"articles/leveldb源码分析/leveldb源码分析15.md","ref":"articles/leveldb源码分析/leveldb源码分析15.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源码分析16.md","mtime":"2020-10-03T05:34:32.598Z","type":"markdown"},"gitbook":{"version":"3.2.3","time":"2020-10-09T15:31:57.905Z"},"basePath":"../..","book":{"language":""}});
  1166. });
  1167. </script>
  1168. </div>
  1169. <script src="../../gitbook/gitbook.js"></script>
  1170. <script src="../../gitbook/theme.js"></script>
  1171. <script src="../../gitbook/gitbook-plugin-chapter-fold/chapter-fold.js"></script>
  1172. <script src="../../gitbook/gitbook-plugin-search-pro/jquery.mark.min.js"></script>
  1173. <script src="../../gitbook/gitbook-plugin-search-pro/search.js"></script>
  1174. <script src="../../gitbook/gitbook-plugin-splitter/splitter.js"></script>
  1175. <script src="../../gitbook/gitbook-plugin-back-to-top-button/plugin.js"></script>
  1176. <script src="../../gitbook/gitbook-plugin-hide-element/plugin.js"></script>
  1177. <script src="../../gitbook/gitbook-plugin-code/plugin.js"></script>
  1178. <script src="../../gitbook/gitbook-plugin-livereload/plugin.js"></script>
  1179. <script src="../../gitbook/gitbook-plugin-sharing/buttons.js"></script>
  1180. <script src="../../gitbook/gitbook-plugin-fontsettings/fontsettings.js"></script>
  1181. <script src="../../gitbook/gitbook-plugin-theme-fexa/fexa.js"></script>
  1182. </body>
  1183. </html>