前一阵听人说redis的内存利用率不高,平均下来每个keyvalue的附加空间占用过多;特别对小keyvalue来说,比例较高。
dump中心那边有用redis做附表存储查询:
每个value包含17个字段,几乎都是int类型,用protocolbuffer存储,平均字节数在100左右;
一台机器插入8KW条记录,占用内存18G,平均每条记录占用字节200+。
下周去了解下redis的内存管理,看看这些额外空间是怎么出来的。
To be continued
淘宝五竹同学写的redis内存存储结构:http://www.searchtb.com/2011/05/redis-storage.html
redis只有一种基础数据类型: binary-safe string;在此基础之上,还支持set, list, hash。
string是作者自己实现的,叫sds, simple dynamic string,不是以\0作为结束符,可以包含任意二进制数据。sds空间不够时,X2增长空间。
虽然存储有时也会用到其他形式,比如int, zipmap,intset等,但这些都是小优化;真正要用redis,还是应该仔细看看代码,看会走到哪些分支。
redis的key是sds, value也是sds,或者set/list/hash of sds;但是key里面不能包含空格,换行等,因为内部用作特殊分隔符了。
目前看来,dump中心redis的用法,导致额外空间过多,主要有两个原因:
1. sds的x2空间增长机制,修改频繁时,这会导致大量的空间浪费
2. key非常多,每个value比较小;每个key-value除了实际数据,一些辅助变量占比较大;导致最后每条记录额外空间过多