1. Redis 简介
Redis 是一个开源的缓存和消息中间件,其特点是速度快、内存占用率低、支持丰富数据类型和支持数据持久化等特性,因此在大数据获得广泛应用。
2. Redis 的数据结构
Redis 中的数据结构有以下五种,其中 SDS 是一种基本结构:
2.1 SDS 简介
SDS(Simple Dynamic String)是 Redis 中的一个基本字符串类型,其内部实现比 C 库中的字符串更加健壮,更加方便。
SDS 的字符串结构包含以下三部分:
struct sdshdr {
int len; // 记录 buf 数组中的已用字节量
int free; // 记录 buf 数组中的未使用字节量
char buf[]; // 字节数组,存储实际字符串内容
};
其中 len 和 free 是 SDS 真正的头部信息,是一个 16 字节的结构体。buf 是字符数组(不是指针),里面存储了实际的字符串内容。
2.2 Redis 中的字符串
Redis 的字符串可以表示为以下三种:
普通字符串:Redis 中的普通字符串是指只能保存字符串数据类型的键值对。
二进制安全的 SDS 字符串:当我们在需要保存二进制数据时,比如图片、音频等等时,Redis 就会选择使用二进制安全的 SDS 字符串。
内部编码(encoding):Redis 的字符串在存储时会按照其长度和内容的不同自动启用不同的内部编码方式。
2.3 Redis 中的列表
Redis 的列表是由一系列有序的字符串组成的集合,支持在列表的两端插入和删除元素,支持按照索引下标访问和查找元素,从而也支持像数组一样的使用场景。
Redis 的列表是一个双向链表结构,每个节点都包含一个指向前置节点和后置节点的指针,每个节点都包含一个字符串对象。
2.4 Redis 中的哈希表
Redis 的哈希表是由键值对组成的无序字典,每个键值对都可以是字符串或者二进制安全的 SDS 字符串。
Redis 的哈希表使用拉链法来处理键冲突的问题,每个哈希节点包含一个指向下一个哈希节点的指针,使用一个数组来保存哈希表的哈希节点,数组中的每个元素都是一个指向下一个哈希节点的指针。
2.5 Redis 中的集合与有序集合
Redis 集合是无序的字符串集合,其内部实现由一个哈希表负责实现。
Redis 有序集合是指集合中的每一个字符串都关联着一个分值,Redis 会按照这个分值来进行有序排序。其内部实现由一个跳跃表和一个哈希表负责实现。
3. 总结
通过本文介绍可以看出,Redis 基于 SDS 实现了多种数据结构,这些数据结构分别适应了不同的使用场景。在实际的开发中,我们应该根据需要选用不同的数据结构,以发挥 Redis 的高效存储和查询的特点。