Redis中,我们打交道最多的是对象类型,如字符串对象、列表对象等。
字符串对象使用方式比如set name "John"。而字符串对象的底层实现是一种叫简单动态字符串,即"SDS"数据结构,上述命令的键值对都是字符串对象,底层实现都是SDS。
又比如,rpush phone "apple" "huawei" "oppo"这个命令,这里的键是字符串对象,而值为列表对象,只不过列表对象包含了三个字符串对象。
这里罗列出对象与数据结构的映射
对象类型 | 数据结构 | 编码 |
---|---|---|
字符串键 | 简单动态字符串 | int、embstr、raw |
列表键 | 链表、压缩列表 | ziplist、linkedlist |
哈希键 | 字典、压缩列表 | hashtable、ziplist |
集合键 | 整数集合、字典 | intset、hashtable |
有序集合键 | 跳跃表、压缩列表 | skiplist、ziplist |
这里谈谈redis为什么设计压缩列表和整数集合这样的数据结构。大家知道,redis是内存数据库,而内存是很宝贵的资源,压缩列表和整数集合是为了提升内存利用率而存在的,但相应的,它们的查询效率不高(O(N))。所以当数据元素较少时会某些对象类型会使用压缩列表和整数集合这样的底层数据结构,当数据元素较多时候转换为哈希或者跳表来提升查询效率。
注:当我们称呼一个键为"XX键",如列表键时,指的是这个数据库键对应的值为列表对象。
网友评论