使用type
命令返回的是当前key对应的value的数据结构类型,例如:string(字符串), list(列表),hash(哈希),set(集合),zset(有序集合)。这些只是redis对外的数据结构,
而redis针对每种数据结构都有自己的底层内部编码实现,而且是多种实现,这样redis会在合适的场景选择合适的内部编码。
:::info
数据结构:value的数据类型
编码方式:底层实现value这种数据结构的方式
:::
Redis数据结构和内部编码
- string类型
- 当value是一个整数时,此时redis会直接使用int来保存
- 当value字符串长度较短时,string的底层是embstr
- 当string字符串较长时,string底层采用raw(在java中就是byte数组)
- hash类型
- hashtable就是哈希表,注意不是java标准库中的hashtable
- ziplist压缩列表,当哈希表中元素较少时优化成ziplist,节省空间。
- 为什么需要压缩:redis上有很多很多的key,某些key对应的value类型是hash,如果key非常多,对应的hash也特别多,但是每个hash又不大的情况下,就去压缩,让整体占用的内存更小。
- list类型
- linkedlist就是链表
- ziplist压缩列表
- 在redis3以后采用quicklist,同时兼顾linkedlist和ziplist的优点,quicklist是一个链表,链表上每个节点又是一个ziplist,把空间和效率都兼顾到。
- set类型
- hashtable哈希表
- intset集合里存的都是整数
- zset类型
- skiplist 跳表也是链表,不同的地方是,每个节点上有多个指针域,巧妙的搭配这些指针域的指向,能做到查询元素的时间复杂度是O(logN)
- ziplist压缩列表
咱们可以通过object encoding key
命令查询value的内部编码