Redis是一种高性能的键值数据库,它支持五种基本的数据类型:字符串、列表、集合、散列和有序集合。每种数据类型都有自己的特点和用途,了解它们的结构和原理可以帮助我们更好地利用Redis的功能。
字符串(string)是Redis最简单也最常用的数据类型,它可以存储任何形式的数据,比如文本、数字、二进制等。字符串的最大长度是512MB,可以用于缓存、计数器、分布式锁等场景。字符串的底层结构是一个动态字符串对象,它包含了长度、容量、空闲空间和字节数组四个属性,可以实现惰性空间释放和空间预分配两种优化策略,提高内存利用率和减少内存碎片。
列表(list)是Redis的有序序列数据类型,它可以存储多个字符串元素,按照插入顺序排序。列表的最大长度是232-1个元素,可以用于消息队列、最新列表、历史记录等场景。列表的底层结构是一个双向链表或者一个压缩列表,根据列表的实际长度动态切换。双向链表由多个节点组成,每个节点包含了前后指针和字符串值,可以快速地在两端进行插入和删除操作。压缩列表是一种紧凑的顺序存储结构,由多个特殊编码的连续内存块组成,每个内存块包含了字符串长度、字符串内容和后续节点长度,可以节省内存空间。
集合(set)是Redis的无序集合数据类型,它可以存储多个不重复的字符串元素。集合的最大长度是232-1个元素,可以用于标签、关注者、点赞等场景。集合的底层结构是一个哈希表或者一个整数集合,根据集合的实际元素类型和数量动态切换。哈希表由多个桶组成,每个桶包含了一个键值对,键是集合元素,值是null,可以快速地进行添加、删除和查找操作。整数集合是一种有序数组结构,由多个整数值组成,按照从小到大排序,可以减少整数元素占用的内存空间。
散列(hash)是Redis的键值对集合数据类型,它可以存储多个字段和值的映射关系。散列的最大长度是232-1个键值对,可以用于存储对象、属性、配置等场景。散列的底层结构是一个压缩列表或者一个哈希表,根据散列的实际大小动态切换。压缩列表和列表使用相同的结构,只是每个内存块存储了一个键和一个值,可以节省小型散列占用的内存空间。哈希表和集合使用相同的结构,只是每个桶存储了一个键值对,可以快速地进行增删改查操作。
有序集合(sorted set)是Redis的排序集合数据类型,它可以存储多个不重复的字符串元素,并给每个元素赋予一个分数(score),根据分数进行排序。有序集合的最大长度是232-1个元素,可以用于排行榜、延时队列、时间轴等场景。有序集合的底层结构是一个压缩列表或者一个跳跃表和一个哈希表,根据有序集合的实际大小动态切换。压缩列表和列表使用相同的结构,只是每个内存块存储了一个元素和一个分数,可以节省小型有序集合占用的内存空间。