美文网首页
Redis底层数据结构

Redis底层数据结构

作者: 长安猎人 | 来源:发表于2019-06-21 11:05 被阅读0次

    1.简单动态字符串

    struct sdshdr {  
        // buf 中已占用空间的长度  
        int len;  
        // buf 中剩余可用空间的长度  
        int free;  
        // 数据空间  
        char buf[];  
    };  
    

    2.链表

    #链表节点
    typedef struct listNode{
          struct listNode *prev;
          struct listNode * next;
          void * value;  
    }
    
    typedef struct list{
        //表头节点
        listNode  * head;
        //表尾节点
        listNode  * tail;
        //链表长度
        unsigned long len;
        //节点值复制函数
        void *(*dup) (void *ptr);
        //节点值释放函数
        void (*free) (void *ptr);
        //节点值对比函数
        int (*match)(void *ptr, void *key);
    }
    

    3.字典

    #1.哈希表
    typedef struct dictht {
       //哈希表数组
       dictEntry **table;
       //哈希表大小
       unsigned long size;
       //哈希表大小掩码,用于计算索引值
       unsigned long sizemask;
       //该哈希表已有节点的数量
       unsigned long used;
    }
    #2.哈希表节点
    typeof struct dictEntry{
       //键
       void *key;
       //值
       union{
          void *val;
          uint64_tu64;
          int64_ts64;
       }
       struct dictEntry *next;
    }
    #3.字典
    typedef struct dict {
        // 类型特定函数
        dictType *type;
        // 私有数据
        void *privedata;
        // 哈希表
        dictht  ht[2];
        // rehash 索引
        in trehashidx;
    }
    

    哈希冲突解决办法:
    1.开放定址法
    当关键字key的哈希地址p=H(key)出现冲突时,以p为基础,产生另一个哈希地址p1,如果p1仍然冲突,再以p为基础,产生另一个哈希地址p2,…,直到找出一个不冲突的哈希地址pn

    2.再哈希法
    当哈希地址Hi=RH1(key)发生冲突时,再计算Hi=RH2(key)……,直到冲突不再产生。

    相关文章

      网友评论

          本文标题:Redis底层数据结构

          本文链接:https://www.haomeiwen.com/subject/jzzeqctx.html