素材彙集:
1 redis with ssd?
antirez 之前做過使用ssd作爲swap來進行壓測分析,結果發現在內存足夠的情況下,通過pipeline,tps可以達到60k TPS;而內存不夠,開始使用swap後,極端情況下tps只有1k左右,分析可能跟main hash table(dict)進swap有關,一般在數據多於內存10%以上時,TPS降爲2w左右,很多請求響應很慢,服務不穩定,TPS漂移的很厲害,從2w-20w都有可能。
http://antirez.com/news/52
2 rdb存儲uint(長度)編碼方式
由於預期大部分int(集合list、dict、skiplist)、dbid等數字是小正數,11位長度以下的字符串數字也可以用int來代替,redis對int類型進行壓縮存儲。方法先用1byts的前2bit用來做flag:指示存的是小int或者作爲大整數、其他類型;
00|000000 如果前兩位MSB(Most Significant Byte)是00,表示是一個6bit的uint,該byte的後面6bit正好存下;
01|000000 如果前兩位MSB是01,表示是一個7-14bit的uint,後面6bit再加1bytes正好存;
10|000000 如果前兩位MSB是10,表示是一個32bit的uint,後面跟一個4bytes來存儲;
11|000000 如果前兩位MSB是11,表示是一個編碼對象,接下來的後6bit指示對象的type。
後面的6bit,redis目前用了最低2bit來表示類型:
#define REDIS_RDB_ENC_INT8 0 表示8bit的signed integer (char);
#define REDIS_RDB_ENC_INT16 1 表示16bit的signed integer (short)
#define REDIS_RDB_ENC_INT32 2 表示32的signed integer (int)
#define REDIS_RDB_ENC_LZF 3 表示用FASTLZ壓縮的string。