Redis数据类型与内部编码
在Redis中通常普遍认为,使用redis的能进行查询,插入,删除,修改操作都是O(1)是因为他是利用hash表实现的,但是,背后的实现不一定是一个标准的hash表,它内部的数据类型还会有变数,不过仍然能保证时间复杂度符合承诺。
在面对不同的场景,redis会进行特定的优化,不同的数据类型(value值)的实现会有不同的内部编码格式,如下表所示。
string
raw:最基本的字符串。(底层就是一个C++的char数组,或者Java的byte数组)
int:当value是整数的时候,此时redis可能会直接使用int来保存。
embstr:针对短字符串进行的特殊优化。
hash
hashtable:最基本的hash表。(不是Java标准库中的HashTable)
ziplist:压缩列表,能够节省空间,在hash表元素比较少的时候,可能就会优化成ziplist。
list
linkedlist:最基本的链表。
ziplist:压缩列表。
!!!注意:从redis3.2开始,引入了新的实现方式quicklist,结合两者优点来替代上面两种方式,但ziplist任然存在。
set
hashtable:最基本的hash表。
intset:集合中存的都是整数
zset
skiplist:跳表,跳表也是链表,不同于普通的链表,每个节点上有多个指针域。(类似于经典题目“随机链表的复制”力扣138题)
ziplist:压缩列表。
如果想要知道当前的key是什么编码方式可以使用object encoding key来查询。
对于上面的数据类型采用的哪种编码方式,最重要的是能知道思想,而不用去记数字。