在浏览了Redis的一些代码后,我注意到“robj”的创建是通过调用“createObject”函数完成的,该函数又调用“malloc”来分配内存。因此,每当请求到来时(例如,SET uid 1234),将存在内存分配过程。
我的问题是,为什么不预先分配空间以减少内存分配成本?因为物体尺寸不同?
答案 0 :(得分:6)
我的问题是,为什么不预先分配空间以减少内存分配成本?因为物体尺寸不同?
您描述的是内存分配器的工作。在Redis中构建这种逻辑并非易事。
默认情况下,Redis在Linux上使用jemalloc内存分配器。
Jemalloc有几项优化可以减少内存分配开销。阅读以下链接,了解jemalloc如何帮助 -
当Redis推出Jemalloc时,许多内存管理问题都消失了。以下是关于介绍jemalloc的antirez (author of redis) had to say:
[snip]分配器是一件很严肃的事情。自从我们专门介绍了 编码数据类型Redis开始遭受碎片化。我们 尝试了不同的东西来解决问题,但基本上是Linux glibc中的默认分配器真的很糟糕。
在Redis中包含jemalloc是一个巨大的胜利。现实世界中每一个碎片都是如此 通过此更改以及使用的内存量来修复系统 有点下降。
P.S。您可能会在redis-db邮件列表上获得更好,更明智的答案