猿问

总结redis在节省内存开销方面做过哪些设计?

总结redis在节省内存开销方面做过哪些设计


慕盖茨4494581
浏览 108回答 1
1回答

精慕门1444504

因为是拿 Python 测试的,所以可能对其他语言并不完全适用。使用的测试数据是特定的,可能对更小或更大的数据并不完全适用。测试结果就不列出了,直接说结论吧。最差的存储方式就是用一个 hash 来存储一个实体(即一条记录)。时间上比其他方案慢 1 ~ 2 倍,空间占用较大。更重要的是拿出来的字段类型是字符串,还得自己转换类型。唯一的好处就是可以单独操作一个字段。使用 string 类型来存储也是不推荐的,不过稍好于前一种方式。在单个实体较小时,会暴露出 key 占用内存较多的缺点。用一个 hash 来存储一个类型的所有实体(即一张表),在实现上比较简单,内存占用尚可。用多个 hash 来存储一个类型的所有实体(即分表),在实现上稍微复杂点,但占用的内存最小。如果单个字段值较小(缺省值是 64 字节),单个 hash 存储的字段数不多(缺省值是 512 个)时,会采用 hash zipmap 来存储,内存占用会显著减小。单个 hash 存储的字段数建议为 2 的次方,例如 1024。略微超过这个值,会导致内存占用和延迟时间都增加。Instagram 的工程师认为,使用 hash zipmap 时,最佳的字段数为 1000 左右。不过据我测试,基本都是随字段数增加而变慢,而内存占用从 128 直到 1024 的变化基本可以忽略。存储为 JSON 格式是种不错的选择。对包含中文的内容来说,设置 ensure_ascii=False 可以节省大量内存。ujson 比 json 性能好很多,后者在设置 ensure_ascii=False 后性能急剧下降。cPickle 比 ujson 的性能要差,不过支持更多类型(如 datetime)。MessagePack 比 ujson 有一点不太明显的性能优势,不过丧失了可读性,且取回 unicode 需要自己 decode。号称比 Protocol Buffer 快 4 倍应该可以无视了,至少其 Python 库没有明显优势。使用 zlib 压缩可以节省更多内存,不过性能变慢 1 ~ 2 倍。看这个测试结果,感觉还不如用 MongoDB 省事……
打开App,查看更多内容
随时随地看视频慕课网APP
我要回答