redis一个大list拆分为N个小list用压缩列表保存,可以更省内存。
列表对象保存的所有字符串元素的长度都小于64字节;
列表对象保存的元素数量小于512个;
下面将举例说明。
情况1、一个key,有很多64字节以内的value
例如:
只有一个key
该key对应的list有300w个value
每个value都是小于64个字节的
在只有一个300w个value的key的情况下,内存占用约为263m
情况2:将value分散到不同的key
将同样的3434114个value拆分到6800个key中,每个key存放500个value。
数据如下:
有6800+个key
value和情况1是一致的
消耗的内存只有55m
原因分析
情况1:
列表的node的双向指针每个8个字节,指向redisObject的字符串的指针8个字节
redisObeject消耗内存24个字节
字符串以sds的方式存储,每个16个字节(含2*sizeof(int)+真实字符串长度)。
共消耗内存 = 350w*(24+24+16) = 224m
情况2:
已ziplist的形式存储,
只消耗内存:
6800*(500*(12+4) + 12) = 54m
其中6800位key的数量,500位每个key对应的value的数量,12位字符串长度,4位int大小,记录字符串长度,12位每个ziplist的消耗的内存