gpt4 book ai didi

redis - 为什么redis只用little endian存储内存数据?

转载 作者:IT王子 更新时间:2023-10-29 06:15:40 25 4
gpt4 key购买 nike

在阅读redis源码时,发现redis存储内存数据的方式只有little endian。获取这些数据时,必须将它们转换为本地机器字节顺序。比如在 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中的方式不是那么有效。

或者我误解了什么?

最佳答案

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

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

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

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

关于redis - 为什么redis只用little endian存储内存数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19085724/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com