時間:2023-08-21|瀏覽:234
1. 讀寫流程
數(shù)據(jù)寫入時,數(shù)據(jù)會先寫入memorycache,然后周期性(當snapshotblock插入時)地將部分數(shù)據(jù)從memorycache拷貝到pendingarea中,pendingarea存儲的是待寫入levelDB的數(shù)據(jù)集合,在下次”異步批量Flush“時,會將數(shù)據(jù)從pendingarea寫入levelDB。
在數(shù)據(jù)讀取時,數(shù)據(jù)可能存在于hotcache、memorycache、levelDB中,數(shù)據(jù)讀取的效率是hotcache>memorycache>levelDB。
2. levelDb索引
levelDB簡潔的實現(xiàn)對于固定類型的存儲數(shù)據(jù)來說非常便于優(yōu)化。通過預(yù)定義的key字節(jié)結(jié)構(gòu),有效的將同一類型的數(shù)據(jù)進行物理的排序,能夠充分發(fā)揮底層硬件性能。
具體實現(xiàn)是通過定義不同的字節(jié)前綴將不同的數(shù)據(jù)類型進行物理的分段,需要的話每個類型的數(shù)據(jù)還可以在這個基礎(chǔ)上定義自己的子前綴,從而實現(xiàn)不同子類型數(shù)據(jù)結(jié)構(gòu)的有序聚簇存儲。
3. hotcache與memorycache緩存
hotcache是一個高速讀緩存,經(jīng)常讀取到的熱數(shù)據(jù)會緩存于hotcache中,以提高整體的讀性能。memorycache是一個寫暫存區(qū),會暫存最近寫入的數(shù)據(jù),因而在memorycache中的部分數(shù)據(jù)可能還未寫入levelDB,而通過一定的設(shè)計,使得無論數(shù)據(jù)存儲在memorycache還是levelDB中,插入、刪除、讀取、更新、迭代等操作都是一致的,因而對于上層模塊而言,寫入memorycache數(shù)據(jù)即是可讀的。
4. pendingarea與redolog
pendingarea暫存準備寫入levelDB的數(shù)據(jù)?!碑惒脚縁lush“觸發(fā)時,數(shù)據(jù)會從pendingarea寫入levelDB,先寫redolog再寫入levelDB,redolog在邏輯上記錄的是數(shù)據(jù)操作順序,如"putk1v1;putk2v2;putk1v2;deletek3...",多次執(zhí)行同一個redolog是冪等的。
5. 索引維度
通過分析每種類型的數(shù)據(jù)讀寫場景,并有針性的定義最適合的維度,在數(shù)據(jù)寫入時多個維度的索引會分別寫入,這樣每個場景的的讀取效率都會因為有了最優(yōu)的索引而得到保證。