zoukankan      html  css  js  c++  java
  • redis数据结构-字典

    大纲

    1. 字典的数据结构
    2. 字典的特性

    一、字典的数据结构

    字典的实现和java的hashmap很像,dictht就是一个哈希表

    typedef struct dict {
    
        // 类型特定函数
        dictType *type;
    
        // 私有数据保存了传给type的可选参数
        void *privdata;
    
        // 哈希表,一个用于平时保存,一个用于rehash
        dictht ht[2];
    
        // rehash 索引,记录当前rehash进行到数组的下标
        // 当 rehash 不在进行时,值为 -1
        int rehashidx; /* rehashing not in progress if rehashidx == -1 */
    
    } dict;
    typedef struct dictht {
    
        // 哈希表数组
        dictEntry **table;
    
        // 哈希表大小,数组大小
        unsigned long size;
    
        // 哈希表大小掩码,用于计算索引值。hash计算后&掩码,比如掩码为3,&操作后,得到(0,1,2,3)就是数组的下标
        // 总是等于 size - 1
        unsigned long sizemask;
    
        // 该哈希表已有节点的数量
        unsigned long used;
    
    } dictht;
    typedef struct dictEntry {
    
        //
        void *key;
    
        // 值,union是三选一
        union {
            void *val;
            uint64_t u64;
            int64_t s64;
        } v;
    
        // 指向下个哈希表节点,形成链表
        struct dictEntry *next;
    
    } dictEntry;

    二、字典的特性

    • 哈希冲突时,链表头插,时间复杂度O(1)
    • 当保存或删除数据后,load factor(used/size)不在合理范围内后将进行rehash,ht[0]rehash后所有值存到ht[1],然后释放ht[0]再将ht[0]=ht[1],最后创建ht[1]为下次rehash做准备
    • load factor在没有bgsave和aof操作时为1,再bgsave和aof操作时是5,超过load factor会扩容,当load factor小于0.1时会缩容
    • rehash过程为渐进性rehash,并非一次性完成,因为键很多时,会导致服务阻塞。单次完成后会记录rehashidx,rehash期间增加结点操作只在ht[1]完成,而查找操作会先找ht[0]若没有再找ht[1]
  • 相关阅读:
    Codeforces 841 D
    Codeforces 838 B
    Codeforces 833 C
    Codeforces 101572 D
    Codeforces 101173 C
    Codeforces 444 C
    POJ 3076 Sudoku
    Codeforces 1025 D
    算法笔记--基环树
    Codeforces 1016 E
  • 原文地址:https://www.cnblogs.com/liuboyuan/p/14749061.html
Copyright © 2011-2022 走看看