• Redis基础数据结构


    Redis数据库中每个键值对都是由对象( c 的结构体对象)组成的。

    数据库键总是一个字符串对象(string object)

    数据库键的值可以使字符串对象、列表对象(list object)、哈希对象(hash object)、集合对象(set object)、有序集合对象(sorted set object)这五种中的一种。而每一种对象都是由基础数据结构组合而构成的。

    SDS 对象

    包含字符串值的键值对在底层都是由SDS实现的。

    比起C字符串,SDS具有以下优点:

    1)常数复杂度获取字符串长度。

    2)杜绝缓冲区溢出。

    3)减少修改字符串长度时所需的内存重分配次数。

    4)二进制安全。

    5)兼容部分C字符串函数。

     

    链表

    Redis的链表实现的特性可以总结如下:

    双端:链表节点带有prev和next指针,获取某个节点的前置节点和后置节点的复杂度都是O(1)。

    ·无环:表头节点的prev指针和表尾节点的next指针都指向NULL,对链表的访问以NULL为终点。

    ·带表头指针和表尾指针:通过list结构的head指针和tail指针,程序获取链表的表头节点和表尾节点的复杂度为O(1)。

    ·带链表长度计数器:程序使用list结构的len属性来对list持有的链表节点进行计数,程序获取链表中节点数量的复杂度为O(1)。

    ·多态:链表节点使用void*指针来保存节点值,并且可以通过list结构的dup、free、match三个属性为节点值设置类型特定函数,所以链表可以用于保存各种不同类型的值。

     

    字典

    通过使用链表解决键冲突

    渐进式的 Rehash 的操作,在ht[0]和ht[1]中进行更换,开始逐步将ht[0]的键值对换至ht[1],在ht[0]重新计算数组的长度后,重新将ht[1]的键值对计算回ht[0]。

    跳跃表

    Redis 的跳跃表实现由 zskiplist 和 zskiplistNode 两个结构组成,其中 zskiplist 用于保存跳跃表信息(比如表头节点、表尾节点、长度),而 zskiplistNode 则用于表示跳跃表节点。

    整数集合

    整数集合是集合键的底层实现之一。

    ·整数集合的底层实现为数组,这个数组以有序、无重复的方式保存集合元素,在有需要时,程序会根据新添加元素的类型,改变这个数组的类型。

    ·升级操作为整数集合带来了操作上的灵活性,并且尽可能地节约了内存。

    ·整数集合只支持升级操作,不支持降级操作。

     

    压缩列表

    压缩列表节点

    节点的encoding属性记录了节点的content属性所保存数据的类型以及长度。

    点的content属性负责保存节点的值,节点值可以是一个字节数组或者整数,值的类型和长度由节点的encoding属性决定。

    通过 previous_entry_length 的值,可以得到前一个节点的起始地址

    触发连锁更新的场景

     

    引用

    《Redis 设计与实现》

    http://zhangtielei.com/posts/blog-redis-skiplist.html

  • 相关阅读:
    Go语言从入门到放弃(三) 布尔/数字/格式化输出
    11. GLOBAL_VARIABLES 与 SESSION_VARIABLES
    10. GLOBAL_STATUS 与 SESSION_STATUS
    9. FILES
    8. EVENTS
    7. ENGINES
    6. COLUMN_PRIVILEGES
    5. COLUMNS
    4. COLLATION_CHARACTER_SET_APPLICABILITY
    3. COLLATIONS
  • 原文地址:https://www.cnblogs.com/dopeter/p/9893594.html
Copyright © 2020-2023  润新知