zoukankan      html  css  js  c++  java
  • Redis Hash数据结构

    一、Redis Hash

    1、Redis的字典使用哈希表作为底层实现,一个哈希表里面可以有多个哈希表节点,而每个哈希表节点就保存了字典中的一个键值对。

    2、Redis 字典所使用的哈希表由 dict.h/dictht 结构定义:

    typedef struct dictht {
    
        // 哈希表数组
        dictEntry **table;
    
        // 哈希表大小
        unsigned long size;
    
        // 哈希表大小掩码,用于计算索引值
        // 总是等于 size - 1
        unsigned long sizemask;
    
        // 该哈希表已有节点的数量
        unsigned long used;
    
    } dictht;

    1.table属性是一个属组,数组中的每个元素都是一个指向dict.h/dictEntry结构的指针,每个dictEntry结构保存着一个键值对;

    2.size属性记录了哈希表的大小,也即是table数组的大小,而used属性则记录了哈希表目前已有节点(键值对)的数量;

    3.sizemask属性的值总是等于size-1,这个属性和哈希值一起决定一个键应该被放到table数组的哪个索引上面;

    3、哈希表节点使用dictEntry 结构表示, 每个 dictEntry 结构都保存着一个键值对:

    typedef struct dictEntry {
    
        //
        void *key;
    
        //
        union {
            void *val;
            uint64_t u64;
            int64_t s64;
        } v;
    
        // 指向下个哈希表节点,形成链表
        struct dictEntry *next;
    
    } dictEntry;

    1.key属性保存着键值对中的键,而v属性则保存着键值对中的值,其中v的值可以是一个指针,或者是一个uint64_t整数,或者是一个int64_t整数;

    2.next属性是指向另一个哈希表节点的指针,这个指针可以将多个哈希值相同的键值对连接在一起,以此来解决键冲突的问题;

    举例说明,如何通过next指针,将两个索引值相同的键k1和k0连接在一起:

     4、Redis 中的字典由 dict.h/dict 结构表示:

    typedef struct dict {
    
        // 类型特定函数
        dictType *type;
    
        // 私有数据
        void *privdata;
    
        // 哈希表
        dictht ht[2];
    
        // rehash 索引
        // 当 rehash 不在进行时,值为 -1
        int rehashidx; /* rehashing not in progress if rehashidx == -1 */
    
    } dict;

    1.type 属性和 privdata 属性是针对不同类型的键值对, 为创建多态字典而设置的;

    2.ht 属性是一个包含两个项的数组, 数组中的每个项都是一个 dictht 哈希表, 一般情况下, 字典只使用 ht[0] 哈希表, ht[1] 哈希表只会在对 ht[0] 哈希表进行 rehash 时使用;

    3.除了 ht[1] 之外, 另一个和 rehash 有关的属性就是 rehashidx : 它记录了 rehash 目前的进度, 如果目前没有在进行 rehash , 那么它的值为 -1

    4.举例说明一个普通状态下(没有进行rehash)的字典:

  • 相关阅读:
    Android通过流播放声音
    Android 凑热闹的MusicPlay
    ANDROID开发之SQLite详解
    Android中Bitmap和Drawable
    java synchronized详解
    android 使用广播监听网络状态
    你想不到的!CSS 实现的各种球体效果【附在线演示】
    18(19).迭代器协议和生成器
    18.函数复习,文件处理b模式(二进制处理),文件处理其他高级玩法
    17.python文件处理
  • 原文地址:https://www.cnblogs.com/lwhctv/p/11423939.html
Copyright © 2011-2022 走看看