Redis - 数据类型 & 常用命令

55 阅读6分钟

常见数据结构

键值类型数据库

  1. Key 常见类型:String

  2. Value 常见类型

    数据类型数据说明
    String“hello world”
    Hash{ name: “Jack”, age : 21 }
    List[ A → B → C → D ]
    Set{ A, B, C },基本类型,无序集合
    SortedSet{ A : 1, B : 2, C : 3 },有序集合
    GEO{ A : (12.3, 30.5) }
    BitMap0101010101010010101
    HyperLog0101010101010101010

其他数据库

  1. 文档类型 (MongoDB)
  2. 列类型 (HBase)
  3. Graph 类型 (Neo4j)

一、动态字符串 SDS

  1. 定义:Simple Dynamic String 简单动态字符串,Redis 实现的字符串

  2. 功能:

    1. 获取长度:快速获取字符串长度 (时间复杂度 O(1) )
    2. 动态扩容:可以修改,并且预分配内存空间可以减少内存分配次数
    3. 二进制安全:SDS 记录了字符串长度,不会因为 ‘\0’ 提前结束
  3. SDS 结构体组成

    属性说明
    unit8_t lenbuf已保存的字符串字节数,不包含结束标示
    unit9_t allocbuf申请的总的字节数,不包含结束标示
    unsigned char flags不同SDS的头类型,用来控制SDS的头大小,有 5 种,分别为5 / 8 / 16 / 32 / 64
    buf[]实际存储的内容
  4. 动态扩容(内存预分配)

    1. 字符串小于 1 M :新空间为新字符串长度的 2 倍 + 1
    2. 字符串大于 1 M :新空间为新字符串长度 + 1M + 1

二、IntSet

  1. 定义:一种 set 集合的实现方式,基于整数数组实现,类似 Set,但是只能存储数值

  2. 特点

    1. 唯一有序:Set 集合中的元素唯一并且有序
    2. 类型升级:contents 元素超出 encoding 限制时,会自动升级 encoding 方式,可以节省内存空间
    3. 二分查找:底层采用二分查找来查询
  3. 组成

    属性说明
    unit32_t encodingcontents[] 的编码方式,支持存放16位(short)、32位(int)、64位(long)整数
    unit32_t lengthcontents[] 中元素个数
    int8_t contents[]整数数组,保存集合数据

三、Dict

  1. 功能 :字典类,类似 java 的 HashTable,实现 key-value 映射关系

  2. Dict 扩容

    1. 功能:降低哈希冲突,提高查询效率
    2. 实现方式:Dict 新增键值对时检查负载因子 (LoadFactor = used/size),如果 LoadFactor ≥ 1,并且服务器没有执行 BGSAVE 或 BGREWRITEAOF 等后台进程,或者 LoadFactor > dict_force_resize_ratio ,则执行 Dict Rehash 进行扩容
  3. Dict 收缩

    1. 功能:节省内存空间
    2. 工作流程:每次删除 key-value 时检查负载因子,如果 LoadFactor < 0.1 则会做哈希表收缩
  4. Dict Rehash

    1. 定义:扩容或收缩时,对哈希表中的每一个 key 重新计算索引,插入新的哈希表,这个过程称为rehash

    2. 工作流程

      1. 计算新 hash 表的 realeSize,值取决于当前要做的是扩容还是收缩:

      2. 按照新的realeSize申请内存空间,创建dictht,并赋值给dict.ht[1]

      3. 设置dict.rehashidx = 0,标示开始rehash

      4. 将dict.ht[0]中的每一个dictEntry都rehash到dict.ht[1]

      5. 将dict.ht[1]赋值给dict.ht[0],给dict.ht[1]初始化为空哈希表,释放原来的dict.ht[0]的内存

      6. 将rehashidx赋值为-1,代表rehash结束

      7. 在rehash过程中,新增操作,则直接写入ht[1],查询、修改和删除则会在dict.ht[0]和dict.ht[1]依次查找并执行。这样可以确保ht[0]的数据只减不增,随着rehash最终为空

  5. 组成

    属性功能
    Dict存储字典类型和私有数据(hash函数),哈希表(两个,第二个用于rehash),rehashidx(rehash的进度),pauserehash:rehash是否暂停
    DictHashTable存储 entry 数组,hash表大小,哈希表大小的掩码(size-1),entry个数
    DictEntry存储 key-value 键值对,hash 冲突时的下一个 DictEntry 的指针

image.png

image.png

image.png


四、ZipList

  1. 定义 :一种特殊的“双端链表”,一系列特殊编码的连续内存块组成

  2. 功能 :节约内存空间(连续的内存空间,减少指针对内存的占用)

  3. 特点

    1. 占用连续内存空间,通过上一节点和本节点长度寻址,内存占用低
    2. 如果列表数据过多(链表过长),可能影响查询性能
    3. 增删较大数据时可能发生连续更新问题
  4. 组成

    属性类型长度功能
    zlbytesunit32_t4 byte记录整个 ZipList 占用内存字节数
    zltailunit32_t4 byte记录 ZipList 表尾结点距离压缩列表的起始地址字节数,用于快速定位表尾结点
    zllenunit16_t2 byte记录 ZipList 包含的结点数量
    entry列表节点不定ZipList 的各个结点,结点长度由结点内容决定
    zlendunit8_t1 byte标记 ZipList 的末端(特殊值 0xFF)
  5. 结构

image.png


五、QuickList

  1. 定义 :ZipList 的升级版本,是一个节点为 ZipList 的双端链表

  2. 功能 :解决传统链表的内存占用问题,控制 ZipList 大小,提高内存空间申请效率(不必很大的连续内存空间)

  3. 配置参数

    1. list-max-ziplist-size:限制 ZipList 结点大小,正数为最大 ZipList entry 个数,负数为最大内存占用(-x 表示最大占用 4*x kb 内存)
    2. list-compress-depth:首尾不压缩节点的个数(x 表示首尾各x个 entry 不压缩),默认为 0(不进行压缩)
  4. 组成

    属性功能
    head头结点指针
    tail尾节点指针
    count所有 ZipList 的 entry 的总数
    lenZipList 结点的总数量
    QL_FILL_BITSZipList 结点的 entry 上限
    QL_COMP_BITS首尾不压缩的结点数量
    QL_BM_BITS内存重分配时的书签数量及数组(一般用不到)

    Untitled


六、SkipList

  1. 定义 :一个双向链表,每个节点包含 score 和 level

  2. 功能 :通过多级指针,实现不同跨度的查找,解决顺序查找效率过低的问题

  3. 特点

    1. 结点按照 score 排序,score 一样则按照 ele 字典排序
    2. 每个节点可以包含多层指针,层数是 1 到 32 之间的随机数
    3. 不同层指针的跨度不同,层级越高跨度越大
    4. 增删改查效率与红黑树一致
  4. zskiplist 组成

    属性功能
    header / tail头尾节点指针
    length节点数量
    level最大的索引层级(默认 = 1)
  5. zskiplistNode 组成

    属性功能
    ele结点存储的值(SDS 类型)
    score结点分数,用于排序、查找
    backward前一节点指针
    level[]多级索引数组,包含 forward 和 span 两个元素
    forward下一个节点指针
    span索引跨度

七、RedisObject

  1. 定义:Redis 对象系统的基础数据结构,用于封装不同类型的数据对象

  2. 功能:统一管理Redis中的各种数据类型,实现对象共享和内存回收

  3. 组成

    属性功能
    type存储的数据对象的类型
    encoding存储的数据对象的底层编码方式
    lru该对象最后一次被访问的时间
    refcount对象引用计数器,被引用一次则 +1,计数器为 0 时可以被回收
    prt指向实际数据的指针