说到数据结构,或许就能想到哈希表,列表集合等数据结构。对于redis来说对应的key的value的形式也可以是这些数据结构,如下:
针对上面的每种数据结构,无论是哈希,还是列表和集合,他们都有自己的底层内部编码实现,这样redis会在合适的场景选择合适的内部编码。在源代码层面,实现特定的优化。来达到节省时间,节省空间的效果。
redis承诺,现在redis中的hash表,进行查询,插入删除等操作的时间复杂度都为O(1),但是它里面不一定就是一个标准的hash。
也就是说这里redis给出的数据结构,可以理解为redis承诺的一种数据类型。
下面是redis各种数据结构的内部编码:
数据结构 | 内部编码 |
string | raw int embstr |
hash | hashtable ziplist |
list | linkedlist ziplist(quicklist) |
set | hashtable intset |
zset | skiplist ziplist |
解析:
- raw:最基本的字符串,底层是持有一个char数组(C++)或者byte数组
- int:redis通常也可以用来实现一些计数功能,当value就是一个整数的时候,此时可能redis会直接使用int来保存
- embstr:针对短字符串的特殊优化。
上面三种是redis自动适应的,程序员一般感应不到。
- hashtable:最基本的hash表,redis内部的hash表实现。
- ziplist:压缩列表,在hash表的元素比较少的时候,可能就优化为ziplist,压缩列表可以节省空间
- linkedlist:链表(从3.2开始,引入了quicklist,list里面的实现从此就变成了quicklist了,而不再有linkedlist和ziplist,因为它同时兼顾了linkedlist和ziplist的有点)
- intset:集合中存放的都是整数
- skiplist:跳表,跳表也是链表,不同于普通的链表,每个节点有多个指针域,巧妙的搭配这些指针域的指向,实现从跳表上查询元素的时间复杂度为O( )
查看key对应的value实际的编码方式
使用object encoding key
演示
查看key1的value和其编码格式:
查看对应value值为“111”的key:
虽然存的是"111",但是由于他是数字,所以使用的是int来存储.
等等等等,不一一举例。