Redis中的五种常见的数据类型:
字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set)
本篇文章详细学习一下这五种数据类型对应的数据结构
字符串(String)
字符串类型是Redis最基础的数据结构,它的值可以为字符串、数字,二进制(图片、音频、视频)等。
Redis是用C语言写的,但它并没有使用C的字符串表示,而是自己构建了一种简单动态字符串(simple dynamic string,SDS)的抽象类型,作为Redis的默认字符串表示;
SDS定义
SDS的结构定义在sds.h文件中,SDS的定义在Redis 3.2版本之后有一些改变,由一种数据结构变成了5种数据结构,会根据SDS存储的内容长度来选择不同的结构,以达到节省内存的效果
// 3.0
struct sdshdr {
// 记录buf数组中已使用字节的数量,即SDS所保存字符串的长度
unsigned int len;
// 记录buf数据中未使用的字节数量
unsigned int free;
// 字节数组,用于保存字符串
char buf[];
};
// 3.2
/* 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