redis 的那些事

素材彙集:

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。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章