Redis 的 string

Redis 的字符串就是 SET 和 GET 操作对应的类型,算是 Redis 里最常用的类型了。 0x00 动态字符串 sds Redis 内部的字符串表示,没有直接使用 C 语言字符串,而是对其进行了一定的改造,改造后的字符串在内存管理和长度计算方面的性能都有所提升。 举个例子,假设要存储的是字符串”redis“。 +——–+——–+————-+ | len | alloc | |r|e|d|i|s| | +——–+——–++———–++ | | v v flag ‘\0’ 这个图就是 sds 的内存结构。sdshdr 分四个部分,从左往右一次是字符串长度、开辟的内存空间、sdshdr 的类型以及字符串本身。在字符串初始化好之后,会返回一个指针,指向字符串本身的首地址,也就是 r 的内存地址。这样,既能方便地享受 C 语言字符串带来的兼容性,又可以对内存管理了如指掌。 0x01 redisObj typedef struct redisObject { unsigned type:4; unsigned encoding:4; unsigned lru:LRU_BITS; /* LRU time (relative to global lru_clock) or * LFU data (least significant 8 bits frequency * and most significant 16 bits access time).
Read more →

Redis 源码学习——浅谈 Redis 的字符串实现

Redis 源码学习——浅谈 Redis 的字符串实现 0x00 结构 Redis 的字符串,本质上还是沿用了 C 语言的字符串,但是还是有一些不同。Redis 的字符串附加了一些和字符串本身相关的信息。我觉得这个设计很巧妙(也许是一个常用的技巧,是我太菜了不知道)。 首先来看 sds 的定义 typedef char sds; 在目前的约定下,一个 char 是一个字节,这是开辟内存空间的最小的单位了,方便内存管理(我是这样认为的)。关于字符串的信息,定义在了几个结构体里面。 / Note: sdshdr5 is never used, we just access the flags byte directly. * However is here to document the layout of type 5 SDS strings. / struct attribute ((packed)) sdshdr5 { unsigned char flags; / 3 lsb of type, and 5 msb of string length / char buf[]; }; struct attribute ((packed)) sdshdr8 { uint8_t len; / used / uint8_t alloc; / excluding the header and null terminator / unsigned char flags; / 3 lsb of type, 5 unused bits / char buf[]; }; struct attribute ((packed)) sdshdr16 { uint16_t len; / used / uint16_t alloc; / excluding the header and null terminator / unsigned char flags; / 3 lsb of type, 5 unused bits / char buf[]; }; struct attribute ((packed)) sdshdr32 { uint32_t len; / used / uint32_t alloc; / excluding the header and null terminator / unsigned char flags; / 3 lsb of type, 5 unused bits / char buf[]; }; struct attribute ((packed)) sdshdr64 { uint64_t len; / used / uint64_t alloc; / excluding the header and null terminator / unsigned char flags; / 3 lsb of type, 5 unused bits */ char buf[]; }; 这几个结构体,其实是同一个作用,就是记录了字符串的各种信息,它们的区别就是用来表示不同长度的字符串,或者说用来开辟不同大小的空间。里面的几个成员变量,我认为是这样的作用:
Read more →