Redis是一种开源的、基于内存的、支持多种数据类型的键值数据库。它可以用作缓存、消息队列、计数器等场景,具有高性能、高可用、高扩展性等特点。Redis的核心是它的存储结构,它决定了Redis如何组织和访问数据,以及如何支持不同类型的数据操作。
Redis存储结构的基本单位是对象,每个对象由一个类型和一个指针组成。类型表示对象的数据类型,指针指向对象的具体内容。Redis支持五种基本数据类型:字符串(string)、列表(list)、集合(set)、有序集合(sorted set)和哈希(hash)。每种数据类型都有自己的对象实现方式,以及相应的命令和操作。
字符串对象是最简单的对象,它的指针直接指向一个字符串。字符串可以是任意长度的字节数组,可以存储文本、数字、二进制数据等。字符串对象支持多种操作,如追加、截取、增减、位运算等。
列表对象是一个双向链表,它的指针指向链表的头节点。链表中的每个节点都是一个字符串对象。列表对象支持在头部或尾部插入或删除元素,以及按索引或值查找元素等操作。
集合对象是一个无序的字符串集合,它的指针指向一个哈希表。哈希表中的每个键都是一个字符串对象,值都是NULL。集合对象支持添加、删除、判断是否存在等操作,以及求并集、交集、差集等集合运算。
有序集合对象是一个有序的字符串集合,它的指针指向一个跳跃表和一个哈希表。跳跃表中的每个节点都是一个字符串对象和一个分数(double类型),按分数从小到大排序。哈希表中的每个键都是一个字符串对象,值都是对应的分数。有序集合对象支持按分数或字典序排序,以及按范围或分数查找元素等操作。
哈希对象是一个键值对的集合,它的指针指向一个哈希表。哈希表中的每个键和值都是一个字符串对象。哈希对象支持设置、获取、删除等操作,以及遍历所有键值对等操作。
Redis存储结构不仅提供了多种数据类型,还提供了多种编码方式,以适应不同的场景和优化内存使用。例如,当列表对象中只有少量元素时,它会使用压缩列表(ziplist)作为编码方式,将所有元素连续地存储在一块内存中,节省空间和提高访问速度;当列表对象中元素较多时,它会使用链表作为编码方式,方便动态地增删元素。类似地,当集合或哈希对象中只有少量元素时,它会使用整数集合(intset)或压缩列表作为编码方式;当元素较多时,它会使用哈希表作为编码方式。