Redis源码分析(三)——Redis数据结构-字典

标签: redis 数据结构 源码 typedef struct
2067人阅读 评论(0) 收藏 举报
分类:

这里写图片描述

1. 数据结构

1.1 哈希表

typedef struct dictht{
  dictEntry **table;
  unsigned long size;
  unsigned long sizemask;
  unsigned long used;
} dictht;
  • table:存储节点的数组
  • size:table数组的长度
  • sizemask:size-1,用于在添加节点时计算节点在table中的位置
  • used:节点数量

1.2 哈希表节点

typedef struct dictEntry{
  void *key
  union {
    void *val;
    unit64_t u64;
    int64_t s64;
  }v;
  struct dictEntry *next
} dictEntry;
  • key:节点的key
  • union:节点的value(可以是指针、unit64_t整数、int64_t整数)
  • next:下一个节点的地址

1.3 字典

typedef struct dict {
  dictType *type
  void *privdata
  dictht ht[2]
} dict;
  • type:操作哈希表的各种函数
  • privdata:上述函数所需的入参
  • ht[2]:存储两个哈希表,一个正常使用,另一个在rehash时使用。

2. 哈希算法

  1. 计算哈希值

    hash = dict->type->hashFunction(key);
  2. 计算在table数组的位置

    index = hash & dict->ht[0].sizemask;
  3. 插入节点
    创建新节点,并将其插入到table[index]的第一位。

3. rehash

3.1 何时进行rehash?

当加载因子(load factor)大于1或小于0.1时就要进行rehash。
加载因子计算公式:

load_factor = ht[0].used / ht[0].size

3.2 新哈希表大小的计算公式

当需要进行扩容/缩容的时候,究竟创建多大的哈希表呢?这取决于如下公式:

  • 若要进行扩容,则新的哈希表的大小=第一个大于等于h[0].used*2的2的n次方。
  • 若要进行缩容,则新的哈希表的大小=第一个大于等于h[0].used的2的n次方。

3.3 rehash过程

  1. 创建一个新的哈希表h[1],大小由上述公式计算得出;
  2. 将字典的rehashidx值从-1改为0;
  3. 依次遍历ht[0]上的所有节点,依次转移到ht[1]上去;
  4. 释放ht[0]的内存空间;

3.4 渐进式rehash

  • rehash过程中需要将所有节点迁移到新的哈希表中,如果节点个数很多的情况下,迁移的过程将非常漫长,那么程序将处于停止等待状态。所以事实上,Redis的rehash过程是分多次、分布完成的。
  • 在rehash过程中,每次对哈希表进行增删改查外,还要将ht[0][rehashidx]上的所有节点迁移到ht[1]中,并将rehashidx+1。从而几次操作后,ht[0]上的所有节点均被迁移至ht[1]中,rehash过程完成。
  • 在rehash过程中,对哈希表的添加操作均在ht[1]上完成,ht[0]只减不增。

这里写图片描述

查看评论

【Redis源码剖析】 - Redis内置数据结构之字典dict

今天我们来讲讲Redis中的哈希表。哈希表在C++中对应的是map数据结构,但在Redis中称作dict(字典)。Redis只是用了几个简单的结构体和几种常见的哈希算法就实现了一个简单的类似高级语言中...
  • Xiejingfa
  • Xiejingfa
  • 2016-03-30 19:08:01
  • 27945

Redis源码解析——字典结构

Redis字典库的接触结构
  • breaksoftware
  • breaksoftware
  • 2016-12-08 20:25:11
  • 1469

Redis数据结构之字典

字典描述在字典中,一个键(key)可以和一个值(value)进行关联(或者说将键映射为值),这些关联的键和值就称为键值对。 字典中的每个键都是独一无二的,程序可以在字典中根据键查找与之关联的值,或者通...
  • u012342262
  • u012342262
  • 2016-09-13 20:33:32
  • 288

Redis内部数据结构详解之字典(dict)

本文所引用的源码全部来自Redis2.8.2版本。 Redis中字典dict数据结构与API相关文件是:dict.h, dict.c。 本文讲解的不是很详细,可以同时参考Redis实现与设计一书中...
  • Acceptedxukai
  • Acceptedxukai
  • 2013-12-22 16:44:09
  • 7943

redis内部数据结构详解之字典dict

Redis内部数据结构详解之字典dict     对于redis的Dict(字典),虽说算法上跟市面上一般的Dict实现没有什么区别,但是redis的Dict有2个特殊的地方那就是它的rehash(重...
  • chenglinhust
  • chenglinhust
  • 2017-05-20 12:55:02
  • 408

redis源码分析

  • 2018年04月04日 18:53
  • 1.52MB
  • 下载

Redis中的字典

Redis中的字典  字典,又称为符号表(symbol table)、关联数组(associative array)或映射(map),是一种用于保存键值对(key-value pair)的抽象数据结构...
  • universe_ant
  • universe_ant
  • 2016-04-09 22:56:22
  • 1139

redis学习笔记(3)---字典dict

字典dict  redis中的字典,即hash表,其实现与Java中的HashMap基本类似。同样是基于数组和链表的,通过“拉链法”来处理碰撞。   字典中的每一个key都是独一无二的,当要加入一...
  • u012658346
  • u012658346
  • 2016-05-04 16:29:09
  • 1503

xml 之 dtd xsd

一个简单的 XML 文档: 请看这个名为 "note.xml" 的 XML 文档: George John Reminder Don't forget the meeting! D...
  • jiujiea6543
  • jiujiea6543
  • 2012-01-15 13:08:09
  • 183

redis中的字典与hash结构

字典是redis中的一种数据结构实现,用来保存键值对。 字典中的每个键都是独一无二的,程序可以根据键来找到与之关联的值。 redis的数据库的底层实现是字典,对于数据库的增删改查操作也都是通过对字...
  • cpp_game
  • cpp_game
  • 2016-10-12 08:24:11
  • 909
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 43万+
    积分: 6338
    排名: 4821
    我的微信公众号
      大闲人柴毛毛
      一个分享技术干货和记录程序员奋斗史的地方。快关注我吧!
    博客专栏
    最新评论