1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767 |
- <!DOCTYPE HTML>
- <html lang="" >
- <head>
- <meta charset="UTF-8">
- <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
- <title>leveldb源码分析18 · 高性能服务器开发 技术专栏</title>
- <meta http-equiv="X-UA-Compatible" content="IE=edge" />
- <meta name="description" content="">
- <meta name="generator" content="GitBook 3.2.3">
- <meta name="author" content="easy_coder">
-
-
-
- <link rel="stylesheet" href="../../gitbook/style.css">
-
-
-
- <link rel="stylesheet" href="../../gitbook/gitbook-plugin-chapter-fold/chapter-fold.css">
-
-
-
- <link rel="stylesheet" href="../../gitbook/gitbook-plugin-search-pro/search.css">
-
-
-
- <link rel="stylesheet" href="../../gitbook/gitbook-plugin-splitter/splitter.css">
-
-
-
- <link rel="stylesheet" href="../../gitbook/gitbook-plugin-back-to-top-button/plugin.css">
-
-
-
- <link rel="stylesheet" href="../../gitbook/gitbook-plugin-prism/prism.css">
-
-
-
- <link rel="stylesheet" href="../../gitbook/gitbook-plugin-tbfed-pagefooter/footer.css">
-
-
-
- <link rel="stylesheet" href="../../gitbook/gitbook-plugin-code/plugin.css">
-
-
-
- <link rel="stylesheet" href="../../gitbook/gitbook-plugin-anchor-navigation-ex/style/plugin.css">
-
-
-
- <link rel="stylesheet" href="../../gitbook/gitbook-plugin-fontsettings/website.css">
-
-
-
- <link rel="stylesheet" href="../../gitbook/gitbook-plugin-theme-fexa/fexa.css">
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- <meta name="HandheldFriendly" content="true"/>
- <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
- <meta name="apple-mobile-web-app-capable" content="yes">
- <meta name="apple-mobile-web-app-status-bar-style" content="black">
- <link rel="apple-touch-icon-precomposed" sizes="152x152" href="../../gitbook/images/apple-touch-icon-precomposed-152.png">
- <link rel="shortcut icon" href="../../gitbook/images/favicon.ico" type="image/x-icon">
-
- <link rel="next" href="leveldb源码分析19.html" />
-
-
- <link rel="prev" href="leveldb源码分析17.html" />
-
- </head>
- <body>
-
- <div class="book">
- <div class="header-inner">
- <!-- LOGO -->
- <div class="logo"></div>
- <span class="title"></span>
- <!-- Search -->
-
- <div id="book-search-input" role="search">
- <input type="text" placeholder="Type to search" />
- </div>
- <!-- Nav -->
- <ul class="header-nav">
-
- </ul>
- </div>
- <div class="book-summary">
- <div class="book-summary-title">文档目录</div>
-
-
- <nav role="navigation">
-
- <ul class="summary">
-
-
-
-
-
- <li class="header">Part I</li>
-
-
-
- <li class="chapter " data-level="1.1" data-path="../../">
-
- <a href="../../">
-
-
- Introduction
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="1.2" data-path="../C++必知必会的知识点/">
-
- <a href="../C++必知必会的知识点/">
-
-
- C++必知必会的知识点
-
- </a>
-
-
- <ul class="articles">
-
-
- <li class="chapter " data-level="1.2.1" data-path="../C++必知必会的知识点/如何成为一名合格的CC++开发者?.html">
-
- <a href="../C++必知必会的知识点/如何成为一名合格的CC++开发者?.html">
-
-
- 如何成为一名合格的C/C++开发者?
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="1.2.2" data-path="../C++必知必会的知识点/不定参数函数实现var_arg系列的宏.html">
-
- <a href="../C++必知必会的知识点/不定参数函数实现var_arg系列的宏.html">
-
-
- 不定参数函数实现var_arg系列的宏
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="1.2.3" data-path="../C++必知必会的知识点/你一定要搞明白的C函数调用方式与栈原理.html">
-
- <a href="../C++必知必会的知识点/你一定要搞明白的C函数调用方式与栈原理.html">
-
-
- 你一定要搞明白的C函数调用方式与栈原理
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="1.2.4" data-path="../C++必知必会的知识点/深入理解CC++中的指针.html">
-
- <a href="../C++必知必会的知识点/深入理解CC++中的指针.html">
-
-
- 深入理解C/C++中的指针
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="1.2.5" data-path="../C++必知必会的知识点/详解C++11中的智能指针.html">
-
- <a href="../C++必知必会的知识点/详解C++11中的智能指针.html">
-
-
- 详解C++11中的智能指针
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="1.2.6" data-path="../C++必知必会的知识点/C++17结构化绑定.html">
-
- <a href="../C++必知必会的知识点/C++17结构化绑定.html">
-
-
- C++17结构化绑定
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="1.2.7" data-path="../C++必知必会的知识点/C++必须掌握的pimpl惯用法.html">
-
- <a href="../C++必知必会的知识点/C++必须掌握的pimpl惯用法.html">
-
-
- C++必须掌握的pimpl惯用法
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="1.2.8" data-path="../C++必知必会的知识点/用VisualStudio调试Linux程序.html">
-
- <a href="../C++必知必会的知识点/用VisualStudio调试Linux程序.html">
-
-
- 用Visual Studio调试Linux程序
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="1.2.9" data-path="../C++必知必会的知识点/如何使用VisualStudio管理和阅读开源项目代码.html">
-
- <a href="../C++必知必会的知识点/如何使用VisualStudio管理和阅读开源项目代码.html">
-
-
- 如何使用Visual Studio管理和阅读开源项目代码
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="1.2.10" data-path="../C++必知必会的知识点/利用cmake工具生成VisualStudio工程文件.html">
-
- <a href="../C++必知必会的知识点/利用cmake工具生成VisualStudio工程文件.html">
-
-
- 利用cmake工具生成Visual Studio工程文件
-
- </a>
-
-
- </li>
-
- </ul>
-
- </li>
-
- <li class="chapter " data-level="1.3" data-path="../多线程/">
-
- <a href="../多线程/">
-
-
- 多线程
-
- </a>
-
-
- <ul class="articles">
-
-
- <li class="chapter " data-level="1.3.1" data-path="../多线程/后台C++开发你一定要知道的条件变量.html">
-
- <a href="../多线程/后台C++开发你一定要知道的条件变量.html">
-
-
- 后台C++开发你一定要知道的条件变量
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="1.3.2" data-path="../多线程/整型变量赋值是原子操作吗?.html">
-
- <a href="../多线程/整型变量赋值是原子操作吗?.html">
-
-
- 整型变量赋值是原子操作吗?
-
- </a>
-
-
- </li>
-
- </ul>
-
- </li>
-
-
-
- <li class="divider"></li>
-
-
-
- <li class="chapter " data-level="2.1" data-path="../网络编程/">
-
- <a href="../网络编程/">
-
-
- 网络编程
-
- </a>
-
-
- <ul class="articles">
-
-
- <li class="chapter " data-level="2.1.1" data-path="../网络编程/bind函数重难点解析.html">
-
- <a href="../网络编程/bind函数重难点解析.html">
-
-
- bind 函数重难点解析
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="2.1.2" data-path="../网络编程/connect函数在阻塞和非阻塞模式下的行为.html">
-
- <a href="../网络编程/connect函数在阻塞和非阻塞模式下的行为.html">
-
-
- connect 函数在阻塞和非阻塞模式下的行为
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="2.1.3" data-path="../网络编程/select函数重难点解析.html">
-
- <a href="../网络编程/select函数重难点解析.html">
-
-
- select 函数重难点解析
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="2.1.4" data-path="../网络编程/Linuxepoll模型(含LT模式和ET模式详解).html">
-
- <a href="../网络编程/Linuxepoll模型(含LT模式和ET模式详解).html">
-
-
- Linux epoll 模型(含LT 模式和 ET 模式详解)
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="2.1.5" data-path="../网络编程/socket的阻塞模式和非阻塞模式.html">
-
- <a href="../网络编程/socket的阻塞模式和非阻塞模式.html">
-
-
- socket 的阻塞模式和非阻塞模式
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="2.1.6" data-path="../网络编程/非阻塞模式下send和recv函数的返回值.html">
-
- <a href="../网络编程/非阻塞模式下send和recv函数的返回值.html">
-
-
- 非阻塞模式下 send 和 recv 函数的返回值
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="2.1.7" data-path="../网络编程/服务器开发通信协议设计介绍.html">
-
- <a href="../网络编程/服务器开发通信协议设计介绍.html">
-
-
- 服务器开发通信协议设计介绍
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="2.1.8" data-path="../网络编程/TCP协议如何解决粘包、半包问题.html">
-
- <a href="../网络编程/TCP协议如何解决粘包、半包问题.html">
-
-
- TCP 协议如何解决粘包、半包问题
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="2.1.9" data-path="../网络编程/网络通信中收发数据的正确姿势.html">
-
- <a href="../网络编程/网络通信中收发数据的正确姿势.html">
-
-
- 网络通信中收发数据的正确姿势
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="2.1.10" data-path="../网络编程/服务器端发数据时,如果对端一直不收,怎么办?.html">
-
- <a href="../网络编程/服务器端发数据时,如果对端一直不收,怎么办?.html">
-
-
- 服务器端发数据时,如果对端一直不收,怎么办?
-
- </a>
-
-
- </li>
-
- </ul>
-
- </li>
-
-
-
- <li class="divider"></li>
-
-
-
- <li class="chapter " data-level="3.1" data-path="../程序员必知必会的网络命令/">
-
- <a href="../程序员必知必会的网络命令/">
-
-
- 程序员必知必会的网络命令
-
- </a>
-
-
- <ul class="articles">
-
-
- <li class="chapter " data-level="3.1.1" data-path="../程序员必知必会的网络命令/利用telnet命令发电子邮件.html">
-
- <a href="../程序员必知必会的网络命令/利用telnet命令发电子邮件.html">
-
-
- 利用telnet命令发电子邮件
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="3.1.2" data-path="../程序员必知必会的网络命令/做Java或者C++开发都应该知道的lsof命令.html">
-
- <a href="../程序员必知必会的网络命令/做Java或者C++开发都应该知道的lsof命令.html">
-
-
- 做Java或者C++开发都应该知道的lsof命令
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="3.1.3" data-path="../程序员必知必会的网络命令/Linux网络故障排查的瑞士军刀.html">
-
- <a href="../程序员必知必会的网络命令/Linux网络故障排查的瑞士军刀.html">
-
-
- Linux网络故障排查的瑞士军刀nc命令
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="3.1.4" data-path="../程序员必知必会的网络命令/Linuxtcpdump使用介绍.html">
-
- <a href="../程序员必知必会的网络命令/Linuxtcpdump使用介绍.html">
-
-
- Linux tcpdump使用详解
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="3.1.5" data-path="../程序员必知必会的网络命令/从抓包的角度分析connect函数的连接过程.html">
-
- <a href="../程序员必知必会的网络命令/从抓包的角度分析connect函数的连接过程.html">
-
-
- 从抓包的角度分析connect函数的连接过程
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="3.1.6" data-path="../程序员必知必会的网络命令/服务器开发中网络数据分析与故障排查经验漫谈.html">
-
- <a href="../程序员必知必会的网络命令/服务器开发中网络数据分析与故障排查经验漫谈.html">
-
-
- 服务器开发中网络数据分析与故障排查经验漫谈
-
- </a>
-
-
- </li>
-
- </ul>
-
- </li>
-
-
-
- <li class="header">Part II</li>
-
-
-
- <li class="chapter " data-level="4.1" data-path="../高性能服务器框架设计/">
-
- <a href="../高性能服务器框架设计/">
-
-
- 高性能服务器框架设计
-
- </a>
-
-
- <ul class="articles">
-
-
- <li class="chapter " data-level="4.1.1" data-path="../高性能服务器框架设计/主线程与工作线程的分工.html">
-
- <a href="../高性能服务器框架设计/主线程与工作线程的分工.html">
-
-
- 主线程与工作线程的分工
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="4.1.2" data-path="../高性能服务器框架设计/Reactor模式.html">
-
- <a href="../高性能服务器框架设计/Reactor模式.html">
-
-
- Reactor模式
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="4.1.3" data-path="../高性能服务器框架设计/实例:一个服务器程序的架构介绍.html">
-
- <a href="../高性能服务器框架设计/实例:一个服务器程序的架构介绍.html">
-
-
- 实例:一个服务器程序的架构介绍
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="4.1.4" data-path="../高性能服务器框架设计/错误码系统的设计.html">
-
- <a href="../高性能服务器框架设计/错误码系统的设计.html">
-
-
- 错误码系统的设计
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="4.1.5" data-path="../高性能服务器框架设计/日志系统的设计.html">
-
- <a href="../高性能服务器框架设计/日志系统的设计.html">
-
-
- 日志系统的设计
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="4.1.6" data-path="../高性能服务器框架设计/如何设计断线自动重连机制.html">
-
- <a href="../高性能服务器框架设计/如何设计断线自动重连机制.html">
-
-
- 如何设计断线自动重连机制
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="4.1.7" data-path="../高性能服务器框架设计/心跳包机制设计详解.html">
-
- <a href="../高性能服务器框架设计/心跳包机制设计详解.html">
-
-
- 心跳包机制设计详解
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="4.1.8" data-path="../高性能服务器框架设计/业务数据处理一定要单独开线程吗.html">
-
- <a href="../高性能服务器框架设计/业务数据处理一定要单独开线程吗.html">
-
-
- 业务数据处理一定要单独开线程吗
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="4.1.9" data-path="../高性能服务器框架设计/C++高性能服务器网络框架设计细节.html">
-
- <a href="../高性能服务器框架设计/C++高性能服务器网络框架设计细节.html">
-
-
- C++ 高性能服务器网络框架设计细节
-
- </a>
-
-
- </li>
-
- </ul>
-
- </li>
-
-
-
- <li class="divider"></li>
-
-
-
- <li class="chapter " data-level="5.1" data-path="../服务器开发案例实战/">
-
- <a href="../服务器开发案例实战/">
-
-
- 服务器开发案例实战
-
- </a>
-
-
- <ul class="articles">
-
-
- <li class="chapter " data-level="5.1.1" data-path="../服务器开发案例实战/从零实现一个http服务器.html">
-
- <a href="../服务器开发案例实战/从零实现一个http服务器.html">
-
-
- 从零实现一个http服务器
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="5.1.2" data-path="../服务器开发案例实战/从零实现一款12306刷票软件.html">
-
- <a href="../服务器开发案例实战/从零实现一款12306刷票软件.html">
-
-
- 从零实现一款12306刷票软件
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="5.1.3" data-path="../服务器开发案例实战/从零实现一个邮件收发客户端.html">
-
- <a href="../服务器开发案例实战/从零实现一个邮件收发客户端.html">
-
-
- 从零实现一个邮件收发客户端
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="5.1.4" data-path="../服务器开发案例实战/从零开发一个WebSocket服务器.html">
-
- <a href="../服务器开发案例实战/从零开发一个WebSocket服务器.html">
-
-
- 从零开发一个WebSocket服务器
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="5.1.5" data-path="../服务器开发案例实战/1从一款多人联机实时对战游戏开始.html">
-
- <a href="../服务器开发案例实战/1从一款多人联机实时对战游戏开始.html">
-
-
- 从零学习开源项目系列(一) 从一款多人联机实时对战游戏开始
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="5.1.6" data-path="../服务器开发案例实战/2最后一战概况.html">
-
- <a href="../服务器开发案例实战/2最后一战概况.html">
-
-
- 从零学习开源项目系列(二) 最后一战概况
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="5.1.7" data-path="../服务器开发案例实战/3CSBattleMgr服务源码研究.html">
-
- <a href="../服务器开发案例实战/3CSBattleMgr服务源码研究.html">
-
-
- 从零学习开源项目系列(三) CSBattleMgr服务源码研究
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="5.1.8" data-path="../服务器开发案例实战/4LogServer源码探究.html">
-
- <a href="../服务器开发案例实战/4LogServer源码探究.html">
-
-
- 从零学习开源项目系列(四)LogServer源码探究
-
- </a>
-
-
- </li>
-
- </ul>
-
- </li>
-
-
-
- <li class="header">Part III</li>
-
-
-
- <li class="chapter " data-level="6.1" data-path="../TeamTalk源码解析/">
-
- <a href="../TeamTalk源码解析/">
-
-
- TeamTalk IM源码分析
-
- </a>
-
-
- <ul class="articles">
-
-
- <li class="chapter " data-level="6.1.1" data-path="../TeamTalk源码解析/01TeamTalk介绍.html">
-
- <a href="../TeamTalk源码解析/01TeamTalk介绍.html">
-
-
- 01 TeamTalk介绍
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="6.1.2" data-path="../TeamTalk源码解析/02服务器端的程序的编译与部署.html">
-
- <a href="../TeamTalk源码解析/02服务器端的程序的编译与部署.html">
-
-
- 02 服务器端的程序的编译与部署
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="6.1.3" data-path="../TeamTalk源码解析/03服务器端的程序架构介绍.html">
-
- <a href="../TeamTalk源码解析/03服务器端的程序架构介绍.html">
-
-
- 03 服务器端的程序架构介绍
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="6.1.4" data-path="../TeamTalk源码解析/04服务器端db_proxy_server源码分析.html">
-
- <a href="../TeamTalk源码解析/04服务器端db_proxy_server源码分析.html">
-
-
- 04 服务器端db_proxy_server源码分析
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="6.1.5" data-path="../TeamTalk源码解析/05服务器端msg_server源码分析.html">
-
- <a href="../TeamTalk源码解析/05服务器端msg_server源码分析.html">
-
-
- 05 服务器端msg_server源码分析
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="6.1.6" data-path="../TeamTalk源码解析/06服务器端login_server源码分析.html">
-
- <a href="../TeamTalk源码解析/06服务器端login_server源码分析.html">
-
-
- 06 服务器端login_server源码分析
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="6.1.7" data-path="../TeamTalk源码解析/07服务器端msfs源码分析.html">
-
- <a href="../TeamTalk源码解析/07服务器端msfs源码分析.html">
-
-
- 07 服务器端msfs源码分析
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="6.1.8" data-path="../TeamTalk源码解析/08服务器端file_server源码分析.html">
-
- <a href="../TeamTalk源码解析/08服务器端file_server源码分析.html">
-
-
- 08 服务器端file_server源码分析
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="6.1.9" data-path="../TeamTalk源码解析/09服务器端route_server源码分析.html">
-
- <a href="../TeamTalk源码解析/09服务器端route_server源码分析.html">
-
-
- 09 服务器端route_server源码分析
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="6.1.10" data-path="../TeamTalk源码解析/10开放一个TeamTalk测试服务器地址和几个测试账号.html">
-
- <a href="../TeamTalk源码解析/10开放一个TeamTalk测试服务器地址和几个测试账号.html">
-
-
- 10 开放一个TeamTalk测试服务器地址和几个测试账号
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="6.1.11" data-path="../TeamTalk源码解析/11pc客户端源码分析.html">
-
- <a href="../TeamTalk源码解析/11pc客户端源码分析.html">
-
-
- 11 pc客户端源码分析
-
- </a>
-
-
- </li>
-
- </ul>
-
- </li>
-
-
-
- <li class="divider"></li>
-
-
-
- <li class="chapter " data-level="7.1" data-path="../libevent源码深度剖析/">
-
- <a href="../libevent源码深度剖析/">
-
-
- libevent源码深度剖析
-
- </a>
-
-
- <ul class="articles">
-
-
- <li class="chapter " data-level="7.1.1" data-path="../libevent源码深度剖析/libevent源码深度剖析01.html">
-
- <a href="../libevent源码深度剖析/libevent源码深度剖析01.html">
-
-
- libevent源码深度剖析01
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="7.1.2" data-path="../libevent源码深度剖析/libevent源码深度剖析02.html">
-
- <a href="../libevent源码深度剖析/libevent源码深度剖析02.html">
-
-
- libevent源码深度剖析02
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="7.1.3" data-path="../libevent源码深度剖析/libevent源码深度剖析03.html">
-
- <a href="../libevent源码深度剖析/libevent源码深度剖析03.html">
-
-
- libevent源码深度剖析03
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="7.1.4" data-path="../libevent源码深度剖析/libevent源码深度剖析04.html">
-
- <a href="../libevent源码深度剖析/libevent源码深度剖析04.html">
-
-
- libevent源码深度剖析04
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="7.1.5" data-path="../libevent源码深度剖析/libevent源码深度剖析05.html">
-
- <a href="../libevent源码深度剖析/libevent源码深度剖析05.html">
-
-
- libevent源码深度剖析05
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="7.1.6" data-path="../libevent源码深度剖析/libevent源码深度剖析06.html">
-
- <a href="../libevent源码深度剖析/libevent源码深度剖析06.html">
-
-
- libevent源码深度剖析06
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="7.1.7" data-path="../libevent源码深度剖析/libevent源码深度剖析07.html">
-
- <a href="../libevent源码深度剖析/libevent源码深度剖析07.html">
-
-
- libevent源码深度剖析07
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="7.1.8" data-path="../libevent源码深度剖析/libevent源码深度剖析08.html">
-
- <a href="../libevent源码深度剖析/libevent源码深度剖析08.html">
-
-
- libevent源码深度剖析08
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="7.1.9" data-path="../libevent源码深度剖析/libevent源码深度剖析09.html">
-
- <a href="../libevent源码深度剖析/libevent源码深度剖析09.html">
-
-
- libevent源码深度剖析09
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="7.1.10" data-path="../libevent源码深度剖析/libevent源码深度剖析10.html">
-
- <a href="../libevent源码深度剖析/libevent源码深度剖析10.html">
-
-
- libevent源码深度剖析10
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="7.1.11" data-path="../libevent源码深度剖析/libevent源码深度剖析11.html">
-
- <a href="../libevent源码深度剖析/libevent源码深度剖析11.html">
-
-
- libevent源码深度剖析11
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="7.1.12" data-path="../libevent源码深度剖析/libevent源码深度剖析12.html">
-
- <a href="../libevent源码深度剖析/libevent源码深度剖析12.html">
-
-
- libevent源码深度剖析12
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="7.1.13" data-path="../libevent源码深度剖析/libevent源码深度剖析13.html">
-
- <a href="../libevent源码深度剖析/libevent源码深度剖析13.html">
-
-
- libevent源码深度剖析13
-
- </a>
-
-
- </li>
-
- </ul>
-
- </li>
-
- <li class="chapter " data-level="7.2" data-path="./">
-
- <a href="./">
-
-
- leveldb源码分析
-
- </a>
-
-
- <ul class="articles">
-
-
- <li class="chapter " data-level="7.2.1" data-path="leveldb源码分析1.html">
-
- <a href="leveldb源码分析1.html">
-
-
- leveldb源码分析1
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="7.2.2" data-path="leveldb源码分析2.html">
-
- <a href="leveldb源码分析2.html">
-
-
- leveldb源码分析2
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="7.2.3" data-path="leveldb源码分析3.html">
-
- <a href="leveldb源码分析3.html">
-
-
- leveldb源码分析3
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="7.2.4" data-path="leveldb源码分析4.html">
-
- <a href="leveldb源码分析4.html">
-
-
- leveldb源码分析4
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="7.2.5" data-path="leveldb源码分析5.html">
-
- <a href="leveldb源码分析5.html">
-
-
- leveldb源码分析5
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="7.2.6" data-path="leveldb源码分析6.html">
-
- <a href="leveldb源码分析6.html">
-
-
- leveldb源码分析6
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="7.2.7" data-path="leveldb源码分析7.html">
-
- <a href="leveldb源码分析7.html">
-
-
- leveldb源码分析7
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="7.2.8" data-path="leveldb源码分析8.html">
-
- <a href="leveldb源码分析8.html">
-
-
- leveldb源码分析8
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="7.2.9" data-path="leveldb源码分析9.html">
-
- <a href="leveldb源码分析9.html">
-
-
- leveldb源码分析9
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="7.2.10" data-path="leveldb源码分析10.html">
-
- <a href="leveldb源码分析10.html">
-
-
- leveldb源码分析10
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="7.2.11" data-path="leveldb源码分析11.html">
-
- <a href="leveldb源码分析11.html">
-
-
- leveldb源码分析11
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="7.2.12" data-path="leveldb源码分析12.html">
-
- <a href="leveldb源码分析12.html">
-
-
- leveldb源码分析12
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="7.2.13" data-path="leveldb源码分析13.html">
-
- <a href="leveldb源码分析13.html">
-
-
- leveldb源码分析13
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="7.2.14" data-path="leveldb源码分析14.html">
-
- <a href="leveldb源码分析14.html">
-
-
- leveldb源码分析14
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="7.2.15" data-path="leveldb源码分析15.html">
-
- <a href="leveldb源码分析15.html">
-
-
- leveldb源码分析15
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="7.2.16" data-path="leveldb源码分析16.html">
-
- <a href="leveldb源码分析16.html">
-
-
- leveldb源码分析16
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="7.2.17" data-path="leveldb源码分析17.html">
-
- <a href="leveldb源码分析17.html">
-
-
- leveldb源码分析17
-
- </a>
-
-
- </li>
-
- <li class="chapter active" data-level="7.2.18" data-path="leveldb源码分析18.html">
-
- <a href="leveldb源码分析18.html">
-
-
- leveldb源码分析18
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="7.2.19" data-path="leveldb源码分析19.html">
-
- <a href="leveldb源码分析19.html">
-
-
- leveldb源码分析19
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="7.2.20" data-path="leveldb源码分析20.html">
-
- <a href="leveldb源码分析20.html">
-
-
- leveldb源码分析20
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="7.2.21" data-path="leveldb源码分析21.html">
-
- <a href="leveldb源码分析21.html">
-
-
- leveldb源码分析21
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="7.2.22" data-path="leveldb源码分析22.html">
-
- <a href="leveldb源码分析22.html">
-
-
- leveldb源码分析22
-
- </a>
-
-
- </li>
-
- </ul>
-
- </li>
-
-
-
- <li class="divider"></li>
-
-
-
- <li class="chapter " data-level="8.1" data-path="../Memcached源码分析/">
-
- <a href="../Memcached源码分析/">
-
-
- Memcached源码分析
-
- </a>
-
-
- <ul class="articles">
-
-
- <li class="chapter " data-level="8.1.1" data-path="../Memcached源码分析/00服务器资源调整.html">
-
- <a href="../Memcached源码分析/00服务器资源调整.html">
-
-
- 00 服务器资源调整
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="8.1.2" data-path="../Memcached源码分析/01初始化参数解析.html">
-
- <a href="../Memcached源码分析/01初始化参数解析.html">
-
-
- 01 初始化参数解析
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="8.1.3" data-path="../Memcached源码分析/02网络监听的建立.html">
-
- <a href="../Memcached源码分析/02网络监听的建立.html">
-
-
- 02 网络监听的建立
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="8.1.4" data-path="../Memcached源码分析/03网络连接建立.html">
-
- <a href="../Memcached源码分析/03网络连接建立.html">
-
-
- 03 网络连接建立
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="8.1.5" data-path="../Memcached源码分析/04内存初始化.html">
-
- <a href="../Memcached源码分析/04内存初始化.html">
-
-
- 04 内存初始化
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="8.1.6" data-path="../Memcached源码分析/05资源初始化.html">
-
- <a href="../Memcached源码分析/05资源初始化.html">
-
-
- 05 资源初始化
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="8.1.7" data-path="../Memcached源码分析/06get过程.html">
-
- <a href="../Memcached源码分析/06get过程.html">
-
-
- 06 get过程
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="8.1.8" data-path="../Memcached源码分析/07cas属性.html">
-
- <a href="../Memcached源码分析/07cas属性.html">
-
-
- 07 cas属性
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="8.1.9" data-path="../Memcached源码分析/08内存池.html">
-
- <a href="../Memcached源码分析/08内存池.html">
-
-
- 08 内存池
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="8.1.10" data-path="../Memcached源码分析/09连接队列.html">
-
- <a href="../Memcached源码分析/09连接队列.html">
-
-
- 09 连接队列
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="8.1.11" data-path="../Memcached源码分析/10Hash表操作.html">
-
- <a href="../Memcached源码分析/10Hash表操作.html">
-
-
- 10 Hash表操作
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="8.1.12" data-path="../Memcached源码分析/12set操作.html">
-
- <a href="../Memcached源码分析/12set操作.html">
-
-
- 12 set操作
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="8.1.13" data-path="../Memcached源码分析/13do_item_alloc操作.html">
-
- <a href="../Memcached源码分析/13do_item_alloc操作.html">
-
-
- 13 do_item_alloc操作
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="8.1.14" data-path="../Memcached源码分析/14item结构.html">
-
- <a href="../Memcached源码分析/14item结构.html">
-
-
- 14 item结构
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="8.1.15" data-path="../Memcached源码分析/15Hash表扩容.html">
-
- <a href="../Memcached源码分析/15Hash表扩容.html">
-
-
- 15 Hash表扩容
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="8.1.16" data-path="../Memcached源码分析/16线程交互.html">
-
- <a href="../Memcached源码分析/16线程交互.html">
-
-
- 16 线程交互
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="8.1.17" data-path="../Memcached源码分析/17状态机.html">
-
- <a href="../Memcached源码分析/17状态机.html">
-
-
- 17 状态机
-
- </a>
-
-
- </li>
-
- </ul>
-
- </li>
-
-
-
- <li class="divider"></li>
-
-
-
- <li class="chapter " data-level="9.1" data-path="../游戏开发专题/">
-
- <a href="../游戏开发专题/">
-
-
- 游戏开发专题
-
- </a>
-
-
- <ul class="articles">
-
-
- <li class="chapter " data-level="9.1.1" data-path="../游戏开发专题/1游戏服务器开发的基本体系与服务器端开发的一些建议.html">
-
- <a href="../游戏开发专题/1游戏服务器开发的基本体系与服务器端开发的一些建议.html">
-
-
- 1 游戏服务器开发的基本体系与服务器端开发的一些建议
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="9.1.2" data-path="../游戏开发专题/2网络游戏服务器开发框架设计介绍.html">
-
- <a href="../游戏开发专题/2网络游戏服务器开发框架设计介绍.html">
-
-
- 2 网络游戏服务器开发框架设计介绍
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="9.1.3" data-path="../游戏开发专题/3游戏后端开发需要掌握的知识.html">
-
- <a href="../游戏开发专题/3游戏后端开发需要掌握的知识.html">
-
-
- 3 游戏后端开发需要掌握的知识
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="9.1.4" data-path="../游戏开发专题/4关于游戏服务端架构的整理.html">
-
- <a href="../游戏开发专题/4关于游戏服务端架构的整理.html">
-
-
- 4 关于游戏服务端架构的整理
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="9.1.5" data-path="../游戏开发专题/5各类游戏对应的服务端架构.html">
-
- <a href="../游戏开发专题/5各类游戏对应的服务端架构.html">
-
-
- 5 各类游戏对应的服务端架构
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="9.1.6" data-path="../游戏开发专题/6从腾讯QQgame高性能服务器集群架构看“分而治之”与“自治”等分布式架构设计原则.html">
-
- <a href="../游戏开发专题/6从腾讯QQgame高性能服务器集群架构看“分而治之”与“自治”等分布式架构设计原则.html">
-
-
- 6 从腾讯QQgame高性能服务器集群架构看“分而治之”与“自治”等分布式架构设计原则
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="9.1.7" data-path="../游戏开发专题/7QQ游戏百万人同时在线服务器架构实现.html">
-
- <a href="../游戏开发专题/7QQ游戏百万人同时在线服务器架构实现.html">
-
-
- 7 QQ游戏百万人同时在线服务器架构实现
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="9.1.8" data-path="../游戏开发专题/8大型多人在线游戏服务器架构设计.html">
-
- <a href="../游戏开发专题/8大型多人在线游戏服务器架构设计.html">
-
-
- 8 大型多人在线游戏服务器架构设计
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="9.1.9" data-path="../游戏开发专题/9百万用户级游戏服务器架构设计.html">
-
- <a href="../游戏开发专题/9百万用户级游戏服务器架构设计.html">
-
-
- 9 百万用户级游戏服务器架构设计
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="9.1.10" data-path="../游戏开发专题/10十万在线的WebGame的数据库设计思路.html">
-
- <a href="../游戏开发专题/10十万在线的WebGame的数据库设计思路.html">
-
-
- 10 十万在线的WebGame的数据库设计思路
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="9.1.11" data-path="../游戏开发专题/11一种高性能网络游戏服务器架构设计.html">
-
- <a href="../游戏开发专题/11一种高性能网络游戏服务器架构设计.html">
-
-
- 11 一种高性能网络游戏服务器架构设计
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="9.1.12" data-path="../游戏开发专题/12经典游戏服务器端架构概述.html">
-
- <a href="../游戏开发专题/12经典游戏服务器端架构概述.html">
-
-
- 12 经典游戏服务器端架构概述
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="9.1.13" data-path="../游戏开发专题/13游戏跨服架构进化之路.html">
-
- <a href="../游戏开发专题/13游戏跨服架构进化之路.html">
-
-
- 13 游戏跨服架构进化之路
-
- </a>
-
-
- </li>
-
- </ul>
-
- </li>
-
-
-
- <li class="header">Part IV</li>
-
-
-
- <li class="chapter " data-level="10.1" data-path="../程序员面试题精讲/">
-
- <a href="../程序员面试题精讲/">
-
-
- 程序员面试题精讲
-
- </a>
-
-
- <ul class="articles">
-
-
- <li class="chapter " data-level="10.1.1" data-path="../程序员面试题精讲/腾讯后台开发实习生技能要求.html">
-
- <a href="../程序员面试题精讲/腾讯后台开发实习生技能要求.html">
-
-
- 腾讯后台开发实习生技能要求
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="10.1.2" data-path="../程序员面试题精讲/聊聊如何拿大厂的offer.html">
-
- <a href="../程序员面试题精讲/聊聊如何拿大厂的offer.html">
-
-
- 聊聊如何拿大厂的 offer
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="10.1.3" data-path="../程序员面试题精讲/网络通信题目集锦.html">
-
- <a href="../程序员面试题精讲/网络通信题目集锦.html">
-
-
- 网络通信题目集锦
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="10.1.4" data-path="../程序员面试题精讲/我面试后端开发经理的经历.html">
-
- <a href="../程序员面试题精讲/我面试后端开发经理的经历.html">
-
-
- 我面试后端开发经理的经历
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="10.1.5" data-path="../程序员面试题精讲/LinuxCC++后端开发面试问哪些问题.html">
-
- <a href="../程序员面试题精讲/LinuxCC++后端开发面试问哪些问题.html">
-
-
- Linux C/C++后端开发面试问哪些问题
-
- </a>
-
-
- </li>
-
- </ul>
-
- </li>
-
- <li class="chapter " data-level="10.2" data-path="../职业规划/">
-
- <a href="../职业规划/">
-
-
- 职业规划
-
- </a>
-
-
- <ul class="articles">
-
-
- <li class="chapter " data-level="10.2.1" data-path="../职业规划/给工作4年迷茫的程序员们的一点建议.html">
-
- <a href="../职业规划/给工作4年迷茫的程序员们的一点建议.html">
-
-
- 给工作 4 年迷茫的程序员们的一点建议
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="10.2.2" data-path="../职业规划/聊聊技术人员的常见的职业问题.html">
-
- <a href="../职业规划/聊聊技术人员的常见的职业问题.html">
-
-
- 聊聊技术人员的常见的职业问题
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="10.2.3" data-path="../职业规划/写给那些傻傻想做服务器开发的朋友.html">
-
- <a href="../职业规划/写给那些傻傻想做服务器开发的朋友.html">
-
-
- 写给那些傻傻想做服务器开发的朋友
-
- </a>
-
-
- </li>
-
- </ul>
-
- </li>
-
- <li class="chapter " data-level="10.3" data-path="../自我提升与开源代码/">
-
- <a href="../自我提升与开源代码/">
-
-
- 自我提升与开源代码
-
- </a>
-
-
- <ul class="articles">
-
-
- <li class="chapter " data-level="10.3.1" data-path="../自我提升与开源代码/2020年好好读一读开源代码吧.html">
-
- <a href="../自我提升与开源代码/2020年好好读一读开源代码吧.html">
-
-
- 2020 年好好读一读开源代码吧
-
- </a>
-
-
- </li>
-
- </ul>
-
- </li>
-
- <li class="chapter " data-level="10.4" data-path="../后端开发相关的书籍/">
-
- <a href="../后端开发相关的书籍/">
-
-
- 后端开发相关的书籍
-
- </a>
-
-
- <ul class="articles">
-
-
- <li class="chapter " data-level="10.4.1" data-path="../后端开发相关的书籍/后台开发应该读的书.html">
-
- <a href="../后端开发相关的书籍/后台开发应该读的书.html">
-
-
- 后台开发应该读的书
-
- </a>
-
-
- </li>
-
- </ul>
-
- </li>
-
- <li class="chapter " data-level="10.5" data-path="../程序员的简历/">
-
- <a href="../程序员的简历/">
-
-
- 程序员的简历
-
- </a>
-
-
- <ul class="articles">
-
-
- <li class="chapter " data-level="10.5.1" data-path="../程序员的简历/程序员如何写简历.html">
-
- <a href="../程序员的简历/程序员如何写简历.html">
-
-
- 程序员如何写简历
-
- </a>
-
-
- </li>
-
- </ul>
-
- </li>
-
- <li class="chapter " data-level="10.6" data-path="../程序员的薪资与年终奖那些事儿/">
-
- <a href="../程序员的薪资与年终奖那些事儿/">
-
-
- 程序员的薪资与年终奖那些事儿
-
- </a>
-
-
- <ul class="articles">
-
-
- <li class="chapter " data-level="10.6.1" data-path="../程序员的薪资与年终奖那些事儿/技术面试与HR谈薪资技巧.html">
-
- <a href="../程序员的薪资与年终奖那些事儿/技术面试与HR谈薪资技巧.html">
-
-
- 技术面试与HR谈薪资技巧
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="10.6.2" data-path="../程序员的薪资与年终奖那些事儿/聊一聊程序员如何增加收入.html">
-
- <a href="../程序员的薪资与年终奖那些事儿/聊一聊程序员如何增加收入.html">
-
-
- 聊一聊程序员如何增加收入
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="10.6.3" data-path="../程序员的薪资与年终奖那些事儿/谈一谈年终奖.html">
-
- <a href="../程序员的薪资与年终奖那些事儿/谈一谈年终奖.html">
-
-
- 谈一谈年终奖
-
- </a>
-
-
- </li>
-
- </ul>
-
- </li>
-
- <li class="chapter " data-level="10.7" data-path="../程序员的烦心事/">
-
- <a href="../程序员的烦心事/">
-
-
- 程序员的烦心事
-
- </a>
-
-
- <ul class="articles">
-
-
- <li class="chapter " data-level="10.7.1" data-path="../程序员的烦心事/拒绝了一家公司的offer后,他们的副总和hr总监同时打电话来询问拒绝原因并极力要求加入,我该不该去?.html">
-
- <a href="../程序员的烦心事/拒绝了一家公司的offer后,他们的副总和hr总监同时打电话来询问拒绝原因并极力要求加入,我该不该去?.html">
-
-
- 拒绝了一家公司的offer后,他们的副总和hr总监同时打电话来询问拒绝原因并极力要求加入,我该不该去?
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="10.7.2" data-path="../程序员的烦心事/我是一名程序员,结婚时女友要求我用两年的工资作为彩礼,我该不该答应?.html">
-
- <a href="../程序员的烦心事/我是一名程序员,结婚时女友要求我用两年的工资作为彩礼,我该不该答应?.html">
-
-
- 我是一名程序员,结婚时女友要求我用两年的工资作为彩礼,我该不该答应?
-
- </a>
-
-
- </li>
-
- </ul>
-
- </li>
-
- <li class="chapter " data-level="10.8" data-path="../作者的故事/">
-
- <a href="../作者的故事/">
-
-
- 作者的故事
-
- </a>
-
-
- <ul class="articles">
-
-
- <li class="chapter " data-level="10.8.1" data-path="../作者的故事/我的2019.html">
-
- <a href="../作者的故事/我的2019.html">
-
-
- 我的 2019
-
- </a>
-
-
- </li>
-
- <li class="chapter " data-level="10.8.2" data-path="../作者的故事/我是如何年薪五十万的.html">
-
- <a href="../作者的故事/我是如何年薪五十万的.html">
-
-
- 我是如何年薪五十万的
-
- </a>
-
-
- </li>
-
- </ul>
-
- </li>
-
-
- <li class="divider"></li>
- <li>
- <a href="https://www.gitbook.com" target="blank" class="gitbook-link">
- Published with GitBook
- </a>
- </li>
- </ul>
- </nav>
-
-
- </div>
- <!-- Content nav -->
- <div class="book-anchor">
- <div class="book-anchor-title">在这篇文章中:</div>
- <div class="book-anchor-body">
- </div>
- </div>
- <div class="book-body">
-
- <div class="body-inner">
-
-
- <div class="book-header" role="navigation">
-
- <!-- Title -->
- <h1>
- <i class="fa fa-circle-o-notch fa-spin"></i>
- <a href="../.." >leveldb源码分析18</a>
- </h1>
- </div>
- <div class="page-wrapper" tabindex="-1" role="main">
- <div class="page-inner">
-
- <div id="book-search-results">
- <div class="search-noresults">
-
- <section class="normal markdown-section">
-
- <div id="anchor-navigation-ex-navbar"><i class="fa fa-navicon"></i><ul><li><span class="title-icon "></span><a href="#leveldb源码分析18"><b></b>leveldb源码分析18</a></li><ul><ul><li><span class="title-icon "></span><a href="#111-versionset接口"><b></b>11.1 VersionSet接口</a></li><li><span class="title-icon "></span><a href="#112-versionsetbuilder类"><b></b>11.2 VersionSet::Builder类</a></li><li><span class="title-icon "></span><a href="#113-recover"><b></b>11.3 Recover()</a></li></ul></ul></ul></div><h1 id="leveldb源码分析18"><a name="leveldb源码分析18" class="anchor-navigation-ex-anchor" href="#leveldb源码分析18"><i class="fa fa-link" aria-hidden="true"></i></a>leveldb源码分析18</h1>
- <p>本系列《leveldb源码分析》共有22篇文章,这是第十八篇</p>
- <p><strong>11 VersionSet分析之1</strong>
- <code>Version</code>之后就是<code>VersionSet</code>,它并不是Version的简单集合,还肩负了不少的处理逻辑。这里的分析不涉及到<code>compaction</code>相关的部分,这部分会单独分析。包括log等各种编号计数器,compaction点的管理等等。</p>
- <h3 id="111-versionset接口"><a name="111-versionset接口" class="anchor-navigation-ex-anchor" href="#111-versionset接口"><i class="fa fa-link" aria-hidden="true"></i></a>11.1 VersionSet接口</h3>
- <p><strong>1 首先是构造函数,VersionSet会使用到TableCache,这个是调用者传入的。TableCache用于Get k/v操作。</strong></p>
- <pre class="language-"><code>VersionSet(const std::string& dbname, const Options* options,
- TableCache*table_cache, const InternalKeyComparator*);
- </code></pre><p><code>VersionSet</code>的构造函数很简单,除了根据参数初始化,还有两个地方值得注意:
- <strong>N1</strong> next<em>file_number</em>从2开始;
- <strong>N2</strong> 创建新的Version并加入到Version链表中,并设置CURRENT=新创建version;
- 其它的数字初始化为0,指针初始化为NULL。
- <strong>2 恢复函数,从磁盘恢复最后保存的元信息</strong></p>
- <pre class="language-"><code>Status Recover();
- </code></pre><p><strong>3 标记指定的文件编号已经被使用了</strong></p>
- <pre class="language-"><code>void MarkFileNumberUsed(uint64_t number);
- </code></pre><p>逻辑很简单,就是根据编号更新文件编号计数器:</p>
- <pre class="language-"><code>if (next_file_number_ <= number)
- next_file_number_ = number + 1;
- </code></pre><p><strong>4 在current version上应用指定的VersionEdit,生成新的MANIFEST信息,保存到磁盘上,并用作current version。</strong>
- 要求:没有其它线程并发调用;要用于mu;</p>
- <pre class="language-"><code>Status LogAndApply(VersionEdit* edit, port::Mutex* mu)EXCLUSIVE_LOCKS_REQUIRED(mu);
- </code></pre><p><strong>5 对于@v中的@key,返回db中的大概位置</strong></p>
- <pre class="language-"><code>uint64_t ApproximateOffsetOf(Version* v, const InternalKey& key);
- </code></pre><p><strong>6 其它一些简单接口,信息获取或者设置,如下:</strong></p>
- <pre class="language-"><code>//返回current version
- Version* current() const {
- return current_;
- }
- // 当前的MANIFEST文件号
- uint64_t ManifestFileNumber() const {
- return manifest_file_number_;
- }
- // 分配并返回新的文件编号
- uint64_t NewFileNumber() {
- return next_file_number_++;
- }
- // 返回当前log文件编号
- uint64_t LogNumber() const {
- return log_number_;
- }
- // 返回正在compact的log文件编号,如果没有返回0
- uint64_t PrevLogNumber() const {
- return prev_log_number_;
- }
- // 获取、设置last sequence,set时不能后退
- uint64_t LastSequence() const {
- return last_sequence_;
- }
- void SetLastSequence(uint64_t s) {
- assert(s >=last_sequence_);
- last_sequence_ = s;
- }
- // 返回指定level中所有sstable文件大小的和
- int64_t NumLevelBytes(int level) const;
- // 返回指定level的文件个数
- int NumLevelFiles(int level) const;
- // 重用@file_number,限制很严格:@file_number必须是最后分配的那个
- // 要求: @file_number是NewFileNumber()返回的.
- void ReuseFileNumber(uint64_t file_number) {
- if (next_file_number_ ==file_number + 1) next_file_number_ = file_number;
- }
- // 对于所有level>0,遍历文件,找到和下一层文件的重叠数据的最大值(in bytes)
- // 这个就是Version:: GetOverlappingInputs()函数的简单应用
- int64_t MaxNextLevelOverlappingBytes();
- // 获取函数,把所有version的所有level的文件加入到@live中
- void AddLiveFiles(std::set<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>uint64_t</span><span class="token punctuation">></span></span>* live);
- // 返回一个可读的单行信息——每个level的文件数,保存在*scratch中
- struct LevelSummaryStorage {char buffer[100]; };
- const char* LevelSummary(LevelSummaryStorage* scratch) const;
- </code></pre><p>下面就来分析这两个接口<code>Recover</code>、<code>LogAndApply</code>以及<code>ApproximateOffsetOf</code>。</p>
- <h3 id="112-versionsetbuilder类"><a name="112-versionsetbuilder类" class="anchor-navigation-ex-anchor" href="#112-versionsetbuilder类"><i class="fa fa-link" aria-hidden="true"></i></a>11.2 VersionSet::Builder类</h3>
- <p><code>Builder</code>是一个<strong>内部辅助类</strong>,其主要作用是:
- 1 把一个<code>MANIFEST</code>记录的元信息应用到版本管理器<code>VersionSet</code>中;
- 2 把当前的版本状态设置到一个Version对象中。</p>
- <p><strong>11.2.1 成员与构造</strong></p>
- <p><code>Builder</code>的vset<em>与base</em>都是调用者传入的,此外它还为<code>FileMetaData</code>定义了一个比较类<code>BySmallestKey</code>,首先依照文件的min key,小的在前;如果min key相等则<code>file number</code>小的在前。</p>
- <pre class="language-"><code>typedefstd::set<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>FileMetaData*,</span> <span class="token attr-name">BySmallestKey</span><span class="token punctuation">></span></span> FileSet;
- // 这个是记录添加和删除的文件
- struct LevelState {
- std::set<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>uint64_t</span><span class="token punctuation">></span></span>deleted_files;
- // 保证添加文件的顺序是有效定义的
- FileSet* added_files;
- };
- VersionSet* vset_;
- Version* base_;
- LevelStatelevels_[config::kNumLevels];
- // 其接口有3个:
- void Apply(VersionEdit* edit);
- void SaveTo(Version* v);
- void MaybeAddFile(Version* v, int level, FileMetaData* f);
- </code></pre><p>构造函数执行简单的初始化操作,在析构时,遍历检查<code>LevelState::added_files</code>,如果文件引用计数为0,则删除文件。</p>
- <p><strong>11.2.2 Apply()</strong></p>
- <p>函数声明:<code>voidApply(VersionEdit* edit)</code>,该函数将edit中的修改应用到当前状态中。注意除了<code>compaction</code>点直接修改了vset_,其它删除和新加文件的变动只是先存储在Builder自己的成员变量中,在调用SaveTo(v)函数时才施加到v上。</p>
- <p><strong>S1 把edit记录的compaction点应用到当前状态</strong></p>
- <pre class="language-"><code>edit->compact_pointers_ => vset_->compact_pointer_
- </code></pre><p><strong>S2 把edit记录的已删除文件应用到当前状态</strong></p>
- <pre class="language-"><code>edit->deleted_files_ => levels_[level].deleted_files
- </code></pre><p><strong>S3把edit记录的新加文件应用到当前状态,这里会初始化文件的allowed_seeks值,以在文件被无谓seek指定次数后自动执行compaction,这里作者阐述了其设置规则。</strong></p>
- <pre class="language-"><code>for (size_t i = 0; i <span class="token tag"><span class="token tag"><span class="token punctuation"><</span>edit-</span><span class="token punctuation">></span></span>new_files_.size(); i++) {
- const int level =edit->new_files_[i].first;
- FileMetaData* f = newFileMetaData(edit->new_files_[i].second);
- f->refs = 1;
- f->allowed_seeks = (f->file_size /16384); // 16KB-见下面
- if (f->allowed_seeks <100) f->allowed_seeks = 100;
- levels_[level].deleted_files.erase(f->number); // 以防万一
- levels_[level].added_files->insert(f);
- }
- </code></pre><p>值allowed_seeks事关compaction的优化,其计算依据如下,首先假设:</p>
- <blockquote>
- <p>1 一次seek时间为10ms
- 2 写入10MB数据的时间为10ms(100MB/s)
- 3 compact 1MB的数据需要执行25MB的IO
- ->从本层读取1MB
- ->从下一层读取10-12MB(文件的key range边界可能是非对齐的)
- ->向下一层写入10-12MB</p>
- </blockquote>
- <p>这意味这25次seek的代价等同于<code>compact 1MB</code>的数据,也就是一次seek花费的时间大约相当于<code>compact 40KB</code>的数据。基于保守的角度考虑,对于每16KB的数据,我们允许它在触发compaction之前能做一次seek。</p>
- <p><strong>11.2.3 MaybeAddFile()</strong></p>
- <p>函数声明:</p>
- <pre class="language-"><code>voidMaybeAddFile(Version* v, int level, FileMetaData* f);
- </code></pre><p>该函数尝试将f加入到<code>levels_[level]</code>文件set中。
- 要满足两个条件:</p>
- <blockquote>
- <p>1 文件不能被删除,也就是不能在levels<em>[level].deleted_files集合中;
- 2 保证文件之间的key是连续的,即基于比较器vset</em>->icmp<em>,f的min key要大于levels</em>[level]集合中最后一个文件的max key;</p>
- </blockquote>
- <p><strong>11.2.4 SaveTo()</strong></p>
- <p>把当前的状态存储到v中返回,函数声明:</p>
- <pre class="language-"><code>void SaveTo(Version* v);
- </code></pre><p>函数逻辑:For循环遍历所有的<code>level[0, config::kNumLevels-1]</code>,把新加的文件和已存在的文件merge在一起,丢弃已删除的文件,结果保存在v中。对于level> 0,还要确保集合中的文件没有重合。
- <strong>S1 merge流程</strong></p>
- <pre class="language-"><code>// 原文件集合
- conststd::vector<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>FileMetaData*</span><span class="token punctuation">></span></span>& base_files = base_->files_[level];
- std::vector<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>FileMetaData*</span><span class="token punctuation">></span></span>::const_iterator base_iter =base_files.begin();
- std::vector<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>FileMetaData*</span><span class="token punctuation">></span></span>::const_iterator base_end =base_files.end();
- const FileSet* added =levels_[level].added_files;
- v->files_[level].reserve(base_files.size()+ added->size());
- for (FileSet::const_iteratoradded_iter = added->begin();
- added_iter !=added->end(); ++added_iter) {
- //加入base_中小于added_iter的那些文件
- for(std::vector<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>FileMetaData*</span><span class="token punctuation">></span></span>::const_iterator bpos = std::upper_bound(base_iter,base_end,*added_iter, cmp);
- base_iter != bpos;++base_iter) {
- // base_iter逐次向后移到
- MaybeAddFile(v, level,*base_iter);
- }
- // 加入added_iter
- MaybeAddFile(v, level,*added_iter);
- }
- // 添加base_剩余的那些文件
- for (; base_iter != base_end;++base_iter)
- MaybeAddFile(v, level, *base_iter);
- </code></pre><p>对象cmp就是前面定义的比较仿函数<code>BySmallestKey</code>对象。
- <strong>S2 检查流程,保证level>0的文件集合无重叠,基于vset<em>->icmp</em>,确保文件i-1的max key < 文件i的min key。</strong></p>
- <h3 id="113-recover"><a name="113-recover" class="anchor-navigation-ex-anchor" href="#113-recover"><i class="fa fa-link" aria-hidden="true"></i></a>11.3 Recover()</h3>
- <p>对于<code>VersionSet</code>而言,<code>Recover</code>就是根据<code>CURRENT</code>指定的<code>MANIFEST</code>,读取db元信息。这是9.3介绍的Recovery流程的开始部分。</p>
- <p><strong>11.3.1 函数流程</strong></p>
- <p>下面就来分析其具体逻辑。</p>
- <p><strong>S1 读取CURRENT文件,获得最新的MANIFEST文件名,根据文件名打开MANIFEST文件。CURRENT文件以\n结尾,读取后需要trim下。</strong></p>
- <pre class="language-"><code>std::string current; // MANIFEST文件名
- ReadFileToString(env_, CurrentFileName(dbname_), ¤t);
- std::string dscname = dbname_ + "/" + current;
- SequentialFile* file;
- env_->NewSequentialFile(dscname, &file);
- </code></pre><p><strong>S2 读取MANIFEST内容,MANIFEST是以log的方式写入的,因此这里调用的是log::Reader来读取。然后调用VersionEdit::DecodeFrom,从内容解析出VersionEdit对象,并将VersionEdit记录的改动应用到versionset中。读取MANIFEST中的log number, prev log number, nextfile number, last sequence。</strong></p>
- <pre class="language-"><code>Builder builder(this, current_);
- while (reader.ReadRecord(&record, &scratch) && s.ok()) {
- VersionEdit edit;
- s = edit.DecodeFrom(record);
- if (s.ok())builder.Apply(&edit);
- // log number, file number, …逐个判断
- if (edit.has_log_number_) {
- log_number =edit.log_number_;
- have_log_number = true;
- }
- … …
- }
- </code></pre><p><strong>S3 将读取到的log number, prev log number标记为已使用。</strong></p>
- <pre class="language-"><code>MarkFileNumberUsed(prev_log_number);
- MarkFileNumberUsed(log_number);
- </code></pre><p><strong>S4 最后,如果一切顺利就创建新的Version,并应用读取的几个number。</strong></p>
- <pre class="language-"><code>if (s.ok()) {
- Version* v = newVersion(this);
- builder.SaveTo(v);
- // 安装恢复的version
- Finalize(v);
- AppendVersion(v);
- manifest_file_number_ =next_file;
- next_file_number_ = next_file+ 1;
- last_sequence_ = last_sequence;
- log_number_ = log_number;
- prev_log_number_ =prev_log_number;
- }
- </code></pre><p><code>Finalize(v)</code>和<code>AppendVersion(v)</code>用来安装并使用version v,在<code>AppendVersion</code>函数中会将<code>current version</code>设置为v。下面就来分别分析这两个函数。</p>
- <p><strong>11.3.2 Finalize()</strong></p>
- <p>函数声明:</p>
- <pre class="language-"><code>void Finalize(Version*v);
- </code></pre><p>该函数依照规则为下次的compaction计算出最适用的level,对于level 0和>0需要分别对待,逻辑如下。</p>
- <p><strong>S1 对于level 0以文件个数计算,kL0_CompactionTrigger默认配置为4。</strong></p>
- <pre class="language-"><code>score =v->files_[level].size()/static_cast<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>double</span><span class="token punctuation">></span></span>(config::kL0_CompactionTrigger);
- </code></pre><p><strong>S2 对于level>0,根据level内的文件总大小计算</strong></p>
- <pre class="language-"><code>const uint64_t level_bytes = TotalFileSize(v->files_[level]);
- score = static_cast<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>double</span><span class="token punctuation">></span></span>(level_bytes) /MaxBytesForLevel(level);
- </code></pre><p><strong>S3 最后把计算结果保存到v的两个成员compaction<em>level</em>和compaction<em>score</em>中。</strong></p>
- <p>其中函数MaxBytesForLevel根据level返回其本层文件总大小的预定最大值。
- 计算规则为:<strong>1048576.0* level^10</strong>。
- 这里就有一个问题,为何level0和其它level计算方法不同,原因如下,这也是leveldb为<code>compaction</code>所做的另一个优化。</p>
- <blockquote>
- <p>1 对于较大的写缓存(write-buffer),做太多的level 0 compaction并不好
- 2 每次read操作都要merge level 0的所有文件,因此我们不希望level 0有太多的小文件存在(比如写缓存太小,或者压缩比较高,或者覆盖/删除较多导致小文件太多)。
- 看起来这里的写缓存应该就是配置的操作log大小。</p>
- </blockquote>
- <p><strong>11.3.3 AppendVersion()</strong></p>
- <p>函数声明:</p>
- <pre class="language-"><code>void AppendVersion(Version*v);
- </code></pre><p>把v加入到<code>versionset</code>中,并设置为<code>current version</code>。并对老的<code>current version</code>执行Uref()。
- 在双向循环链表中的位置在<code>dummy_versions_</code>之前。</p>
- <footer class="page-footer"><span class="copyright">如需下载本站全部技术文章,可以在【高性能服务器开发】公众号回复关键字“文章下载”即可。</span><span class="footer-modification">最近更新时间:
- 2020-10-03 13:44:16
- </span></footer>
- <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>
-
- </section>
-
- </div>
- <div class="search-results">
- <div class="has-results">
-
- <h1 class="search-results-title"><span class='search-results-count'></span> results matching "<span class='search-query'></span>"</h1>
- <ul class="search-results-list"></ul>
-
- </div>
- <div class="no-results">
-
- <h1 class="search-results-title">No results matching "<span class='search-query'></span>"</h1>
-
- </div>
- </div>
- </div>
- </div>
- </div>
-
- </div>
-
-
- <a href="leveldb源码分析17.html" class="navigation navigation-prev " aria-label="Previous page: leveldb源码分析17">
- <i class="fa fa-angle-left"></i>
- </a>
-
-
- <a href="leveldb源码分析19.html" class="navigation navigation-next " aria-label="Next page: leveldb源码分析19">
- <i class="fa fa-angle-right"></i>
- </a>
-
-
-
- </div>
- <script>
- var gitbook = gitbook || [];
- gitbook.push(function() {
- gitbook.page.hasChanged({"page":{"title":"leveldb源码分析18","level":"7.2.18","depth":2,"next":{"title":"leveldb源码分析19","level":"7.2.19","depth":2,"path":"articles/leveldb源码分析/leveldb源码分析19.md","ref":"articles/leveldb源码分析/leveldb源码分析19.md","articles":[]},"previous":{"title":"leveldb源码分析17","level":"7.2.17","depth":2,"path":"articles/leveldb源码分析/leveldb源码分析17.md","ref":"articles/leveldb源码分析/leveldb源码分析17.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源码分析18.md","mtime":"2020-10-03T05:44:16.852Z","type":"markdown"},"gitbook":{"version":"3.2.3","time":"2020-10-09T15:31:57.905Z"},"basePath":"../..","book":{"language":""}});
- });
- </script>
- </div>
-
- <script src="../../gitbook/gitbook.js"></script>
- <script src="../../gitbook/theme.js"></script>
-
-
- <script src="../../gitbook/gitbook-plugin-chapter-fold/chapter-fold.js"></script>
-
-
-
- <script src="../../gitbook/gitbook-plugin-search-pro/jquery.mark.min.js"></script>
-
-
-
- <script src="../../gitbook/gitbook-plugin-search-pro/search.js"></script>
-
-
-
- <script src="../../gitbook/gitbook-plugin-splitter/splitter.js"></script>
-
-
-
- <script src="../../gitbook/gitbook-plugin-back-to-top-button/plugin.js"></script>
-
-
-
- <script src="../../gitbook/gitbook-plugin-hide-element/plugin.js"></script>
-
-
-
- <script src="../../gitbook/gitbook-plugin-code/plugin.js"></script>
-
-
-
- <script src="../../gitbook/gitbook-plugin-livereload/plugin.js"></script>
-
-
-
- <script src="../../gitbook/gitbook-plugin-sharing/buttons.js"></script>
-
-
-
- <script src="../../gitbook/gitbook-plugin-fontsettings/fontsettings.js"></script>
-
-
-
- <script src="../../gitbook/gitbook-plugin-theme-fexa/fexa.js"></script>
-
-
- </body>
- </html>
|