一、Redis简介
Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API,目前最新版本7.0。Redis提供了五种不同的数据结构来存储数据,分别是字符串(String)、列表(List)、集合(Set)、有序集合(Sorted Set)和哈希(Hash)。
- 字符串(String):字符串是最基本的数据类型,可以存储任何类型的字符串,包括二进制、序列化的对象等。
- 列表(List):列表是一个双向链表,支持从两端进行push和pop操作,内部是按照插入顺序排序的。
- 集合(Set):集合是一个无序的、不允许有重复成员的字符串集合。
- 有序集合(Sorted Set):有序集合是一个不允许有重复成员的字符串集合。不同的是每个成员都会关联一个分数(score),根据分数对成员进行从小到大的排序。
- 哈希(Hash):哈希是一个键值对集合,适合存储小型的数据表。
二、Redis底层结构
Redis的数据结构有字符串、双端链表、字典、压缩列表、整数集合等,但是Redis为了加快读写速度,并没有直接使用这些数据结构,而是在此基础上又包装了一层称之为RedisObject,RedisObject 有五种对象:字符串(String)、列表(List)、集合(Set)、有序集合(Sorted Set)和哈希(Hash)。
①Redis内部统一实现 RedisObject有啥优点
- 简化数据结构:RedisObject是Redis数据库的基本构建块,它将不同类型的值(字符串、列表、集合等)封装为一个统一的对象结构,简化了数据结构的设计。
- 内存管理:RedisObject通过引用计数和内存回收机制管理内存,避免了额外的内存分配和释放开销。
- 快速访问:通过使用RedisObject,Redis可以快速直接访问和操作不同类型的数据,提高了数据访问的效率。
- 兼容性:RedisObject允许Redis支持不同的数据类型,并提供了一种在不同数据类型之间转换的机制。
- 灵活性:RedisObject允许开发者根据需要扩展Redis的数据类型,以支持新的应用场景。
②RedisObject底层设计
typedef struct redisObject {
// 类型
unsigned type:4个bit;
// 编码
unsigned encoding:4个bit;
// 对象最后一次被访问的时间
unsigned lru:REDIS_LRU_BITS; /* LRU_BITS为24bit*/
//引用计数
int refcount;4个字节
// 指向实际值的指针
void *ptr;8个字节
} robj;
下面分别解释一下各个字段的含义:
Ⅰ、type 记录了对象的类型占4个bit位,目前Redis支持的对象类型如下:
类型常量 |
常量对应的对象类型 |
OBJ_STRING |
字符串(String) |
OBJ_LIST |
列表(List) |
OBJ_SET |
集合(Set) |
OBJ_ZSET |
有序集合(Sorted Set) |
OBJ_HASH |
哈希(Hash) |
Ⅱ、ptr 指向对象的底层实现数据结构,即为具体对象值,占8个字节,这个后面会具体分析。
Ⅲ、encoding表示 ptr 指向的具体数据结构的编码方式,占4个bit位。Redis支持的编码如下:
编码常量 |
编码所对应的底展数据结构 |
OBJ_ENCODING_INT |
long 类型的整数 |
OBJ_ENCODING_EMBSTR |
embstr编码的简单动态字符串 |
OBJ_ENCODING_RAW |
简单动态字符申 |
OBJ_ENCODING_HT |
字典 |
OBJ_ENCODING_LINKEDLIST |
双端链表,Redis3.2之前使用 |
OBJ_ENCODING_ZIPLIST |
压缩列表 |
OBJ_ENCODING_QUICKLIST |
双端链表与压缩列表结合,Redis3.2之后使用 |
OBJ_ENCODING_INTSET |
整数集合 |
OBJ_ENCODING_SKIPLIST |
跳跃表 |
OBJ_ENCODING_ZIPMAP |
压缩Map,Redis2.6之前使用 |
OBJ_ENCODING_STREAM |
Stream流 |
上面提到的type 用于标识 String、Hash、List、Set、Sorted Set五种数据类型、encoding 用于标识底层数据结构。通过这两个字段的组合,同一种数据类型也有多种实现方式,一个完整的映射关系如下表:
类型type |
编码encoding |
描述 |
OBJ_STRING |
OBJ_ENCODING_INT |
整数实现字符串对象 |
OBJ_STRING |
OBJ_ENCODING_EMBSTR |
embstr编码实现字符串对象 |
OBJ_STRING |
OBJ_ENCODING_RAW |
sds实现字符串对象 |
OBJ_LIST |
OBJ_ENCODING_LINKEDLIST |
双端链表实现列表对象 |
OBJ_LIST |
OBJ_ENCODING_ZIPLIST |