redis中的内存分配

rea*_*jin 1 redis

在浏览了Redis的一些代码之后,我注意到"robj"的创建是通过调用"createObject"函数完成的,该函数又调用"malloc"来分配内存.因此,每当请求到来时(例如SET uid 1234),将存在内存分配过程.

我的问题是,为什么不预先分配空间来减少内存分配成本?因为物体尺寸不同?

Sri*_*nan 6

我的问题是,为什么不预先分配空间来减少内存分配成本?因为物体尺寸不同?

你描述的是内存分配器的工作.在Redis中构建这种逻辑并非易事.

默认情况下,Redis 在Linux上使用jemalloc内存分配器.

Jemalloc有几个优化来减少内存分配开销.阅读以下链接,了解jemalloc如何帮助 -

  1. 关于Jemalloc的Facebook工程博客
  2. 2006年的Jemalloc Paper

当Redis推出Jemalloc时,许多内存管理问题就消失了.以下是antirez(redis的作者)关于介绍jemalloc的说法:

[snip]分配器是一件严肃的事情.由于我们引入了特殊编码的数据类型,Redis开始遭受碎片化.我们尝试了不同的方法来解决这个问题,但基本上glibc中的Linux默认分配器真的很糟糕.

在Redis内部包括jemalloc是一个巨大的胜利.现实世界系统中的每一个碎片都是通过这种改变来解决的,并且使用的内存量也有所下降.

PS你可能会在redis-db邮件列表上获得更好,更明智的答案