当我读取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中的方式不是那么有效。
或者我误解了什么?
答案 0 :(得分:1)
这可能是一种策略,但另一方面:
我非常确定99%的Redis生产部署都在Intel / AMD盒子上运行(即小端盒)。所以在实践中,它几乎没有影响。
使用相同的内存表示将数据存储在内存和磁盘上有助于保持较低的转储时间(从而降低写时复制内存的开销)。由于后台保存进程的分支和写时复制,转储时间越长,内存浪费越多。通过对ziplist使用相同的表示,Redis RDB函数可以将ziplist内容转储到文件中,而不必解析它,从而节省了许多CPU缓存未命中。
即使选择了另一种持久性机制,也可以使用RDB转储机制,因为它也用于初始化从属。因此,它的表现至关重要。