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。

 

你可能感兴趣的:(redis 的那些事)