码迷,mamicode.com
首页 > 其他好文 > 详细

Redis---Hash(字典)

时间:2018-08-27 23:21:54      阅读:240      评论:0      收藏:0      [点我收藏+]

标签:col   上进   color   val   扩展   ict   大小   基本   hash表   

1. 概述

  a. 它就是一个键值对,对于hash冲突的处理采用了头插法的链式存储来解决。

  b. 对rehash,扩展就是取第一个大于等于 used * 2 的2 ^ n的数作为新的hash表大小;缩紧就是取第一个大于等于 used 的2 ^ n的数作为新的hash表大小。

  c. 有个负载因子的概念(负载因子 = used / size),没有执行BGSAVE或者BGREWRITEAOF时 大于1就会扩展,小于0.1就会缩紧。

  d. dict结构体中是有dictht ht[2]这个成员变量的,2个是为了做rehash时交替使用的。渐进式rehash,在此过程中对于字典的删、改、查会在2个ht上面进行,而只会在新的ht上进行。

2. 基本结构

typedef struct dictEntry {
    void *key; ////
    union {
        void *val;
        uint64_t u64;
        int64_t s64;
        double d;
    } v;
    struct dictEntry *next; // 指向下个节点的指针, hash 值相同的键值对构成单向链表 头插法
} dictEntry;

// 哈希表结构。 每个字典都有两个,因为我们实现了从旧表到新表的增量重写
typedef struct dictht {
    dictEntry **table;
    PORT_ULONG size; // hash 表大小
    PORT_ULONG sizemask; // 哈希表大小掩码,用于计算索引值,总是等于 size - 1
    PORT_ULONG used; // 节点个数
} dictht;

typedef struct dict {
    dictType *type; // 类型特定函数  实现多态
    void *privdata; // 私有数据
    dictht ht[2]; // 两个 hash table
    PORT_LONG rehashidx; // 如果rehashidx == -1则不进行重复
    int iterators; // 当前正在运行的迭代器数
} dict;

 

Redis---Hash(字典)

标签:col   上进   color   val   扩展   ict   大小   基本   hash表   

原文地址:https://www.cnblogs.com/virgosnail/p/9545179.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!