自学内容网 自学内容网

【Redis】数据结构|内部编码

目录

五种数据类型

🔥【面试题】Redis数据结构和内部编码

小Tip:


五种数据类型

  • 五种数据类型

    • 字符串:类似String
    • 哈希:类似HashMap
    • 列表:类似List
    • 集合:类似Set
    • 有序集合:相当于除了存储member之外,还需要存储一个score(权重、分数)
  • Redis在实现上述数据结构的时候,会在源码层面,针对上述实现进行优化(内部的具体实现的数据结构,即编码方式还有变数),来达到节省时间/空间的效果
    eg:redis承诺,现在我这有个hash表,你进行查询,删除操作,都保证O(1),但是这个背后的实现,不一定就是一个标准的hash表,可能在特定的场景下,使用别的数据结构,但是仍然保证时间复杂度
    • 数据结构:redis承诺给你的,也可以理解为数据类型
    • 编码方式:redis内部底层的实现

🔥【面试题】Redis数据结构和内部编码

同一个数据类型,背后可能的编码实现方式是不同的 redis会根据特定场景优化,程序员在使用的时候一般感知不到

  • String
    • raw:最基本的字符串(底层就是byte数组)
    • int:当value就是一个整数的时候,redis可能就直接使用int保存
      这个通常可以用来实现一些“计数”这样的功能
    • embstr:针对短字符串进行特殊的优化
  • hash
    • hashtable:最基本的哈希表,整体思想和之前的学过一样
    • ziplist:压缩列表,能够节省空间
      元素比较少的时候用,比如redis上有很多key,可能某些key的value是hash
      此时key如果特别多,对应的hash也特别多,但是每个hash又不大的情况,
      就可以压缩,让整体占用的内存更小
  • list
    • linkedlist:链表
    • ziplist:压缩列表
    • 在redis3.2之后,引入了quicklist
      同时兼顾了linkedlist和ziplist的优点
      ​就是一个链表,每个元素又是一个ziplist
      把空间和效率都折中的兼顾到
  • set
    • hashtable
    • inset:集合中存的都是整数
  • zset
    • skiplist:跳表
      不同于普通的链表,每个节点上有多个指针域,
      ​巧妙的搭配这些指针域的指向,就可以做到查询元素的时间复杂度O(logN)
    • ziplist

小Tip:

  • object encoding key:查看key对应的value的实际编码
    • redis会根据实际情况选择内部的编码方式,自动适应的
    • 只记思想,不记数字
      数字都是可配置的,知道数字怎么来的更重要

原文地址:https://blog.csdn.net/qq_73017178/article/details/145103268

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!