Redis中大小端存储分析

大端与小端存储问题

  • 大端与小端的存储方式:

    大端模式:是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。
    小端模式:是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,高地址部分权值高,低地址部分权值低。
    大小端图示

  • 在网络上传输数据时,由于数据传输的两端可能对应不同的硬件平台,采用的存储字节顺序也可能不一致,因此 TCP/IP 协议规定了在网络上必须采用网络字节顺序(也就是大端模式) 。

在redis的Endianconv.c文件中提供了对于大小端的转换,redis 的所有存储方式都是小端存储,在endianconv.h中有一段大小端的宏定义,如果当前cpu的字节序为大端就进行相应的转换:

/* variants of the function doing the actual convertion only if the target
 * host is big endian */
#if (BYTE_ORDER == LITTLE_ENDIAN)  // 如果是小端存储,什么也不做
#define memrev16ifbe(p)
#define memrev32ifbe(p)
#define memrev64ifbe(p)
#define intrev16ifbe(v) (v)
#define intrev32ifbe(v) (v)
#define intrev64ifbe(v) (v)
#else	// 如果是大端存储的话对内存中的存储和值的表示进行一个大小端的转换
#define memrev16ifbe(p) memrev16(p)
#define memrev32ifbe(p) memrev32(p)
#define memrev64ifbe(p) memrev64(p)
#define intrev16ifbe(v) intrev16(v)
#define intrev32ifbe(v) intrev32(v)
#define intrev64ifbe(v) intrev64(v)
#endif

猜你喜欢

转载自blog.csdn.net/li123_123_/article/details/92383307