1

当我阅读redis源代码时,我发现redis仅以小端存储内存数据。获取这些数据时,必须将它们转换为本地机器字节顺序。例如在 ziplist.c 中:

static int64_t zipLoadInteger(unsigned char *p, unsigned char encoding) {
    int16_t i16;
    int32_t i32;
    int64_t i64, ret = 0;
    if (encoding == ZIP_INT_8B) {
        ret = ((int8_t*)p)[0];
    } else if (encoding == ZIP_INT_16B) {
        memcpy(&i16,p,sizeof(i16));
        memrev16ifbe(&i16);
        ret = i16;
    } //......
    return ret;
}

我认为以本地机器格式(LE或BE)存储内存数据的最有效方法,当必须将数据写入磁盘或从磁盘读取数据时,可以将数据转换为某种格式。因为内存中的数据操作比磁盘中的操作更多,所以我觉得redis中的方式不是那么有效。

还是我误解了什么?

4

1 回答 1

1

这可能是一种策略,但另一方面:

  • 我很确定 99% 的 Redis 生产部署都在 Intel/AMD 机器(即小端机器)上运行。所以在实践中,影响不大。

  • 使用相同的内存表示将数据存储在内存和磁盘上有助于保持低转储时间(从而减少写时复制内存的开销)。由于后台保存进程和写时复制的分叉,转储时间越长,内存浪费越多。通过对 ziplist 使用相同的表示,Redis RDB 函数可以将 ziplist 内容转储到文件中,而无需对其进行解析,从而节省了许多 CPU 缓存未命中。

  • 即使选择了另一种持久性机制,也可以使用 RDB 转储机制,因为它也用于初始化从属。因此,它的性能至关重要。

于 2013-09-30T07:10:42.177 回答