帶狀態的分佈式離不開數據,本文想說下數據的格式,在內存中主要考慮空間複雜度和cpu操做時間複雜性,後面會單講,分佈式裏經常使用的B,B+,list,set,跳錶,hash,空間的R樹,前綴樹,壓縮前綴樹,涉及到這幾種。在網絡和磁盤中考慮格式和人編輯格式到物理格式之間的映射,在犧牲cpu處理壓縮和解壓縮下,能夠減小磁盤佔用和網絡開銷,下面主要講三種網絡通訊的數據壓縮thriftBP,PB,Avro和幾種磁盤數據壓縮性能對比,snappy的原理,EC原理。其中涉及到兩種壓縮算法:數字變長編碼和動態詞典編碼。html
這個就太多了。。略redis
thrift BinaryProtocal 字段名替換爲序號算法
{ "userName": "Martin", "favoriteNumber": 1337, "interests": ["daydreaming", "hacking"] }
=》壓縮格式:
shell
field和type在單個字節。數據的優化數據最高位標識是否還有後續,這個1337有錯誤,是下面的apache
只能添加或刪除有默認值的字段json
可變長數字編碼
int等固定64位的轉爲二進制,本身斷定長度。
1.連續位標識
以上數字的轉變全是基於VLQ可變長二進制數字編碼
的變體。最低位加0表示整數,1表示負數,而後7位一個分割。從最後開始,每一個後面有第一位是1,不然是0.
2.前綴長度。
前綴標識固定的長度,redis中也有不少前綴標識長度的壓縮好比UTF8:網絡
第一個字節 | 第二個字節 | 第三個字節 | 第四個字節 | 用於實際編碼的bit數量 | 能表示的最大unicode值 |
0xxxxxxx | 7 | 127 | |||
110xxxxx | 10xxxxxx | 11 | 2047 | ||
1110xxxx | 10xxxxxx | 10xxxxxx | 16 | 65535 | |
11110xxx | 10xxxxxx | 10xxxxxx | 10xxxxxx | 21 | 1114111 |
https://catchchallenger.first...:_Gzip_vs_Bzip2_vs_LZMA_vs_XZ_vs_LZ4_vs_LZO
https://www.percona.com/blog/...數據結構
如何快速找到最長匹配字符串?:簡單的將窗口中全部字符順序組合存入hash,也能夠存固定長度,好比2,匹配多個後再繼續向後比這些固定長度匹配的位置。
snappy 將整個數據切割爲32k一個大小的塊,塊之間無關聯,2個字節就可表示匹配字符串的相對位置,匹配長度至少爲4,hash字符串長度也固定爲4.輸出字符串的壓縮形式爲 <編碼方案,匹配字符串起始位置差值,匹配字符串長度>app