我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Redis学习笔记(三) 字典

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Redis学习笔记(三) 字典

Redis学习笔记(三) 字典

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

redis字典所用的哈希表由disht结构定义。

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

table 属性是一个数组,数组中的每个元素都是一个指向dictEntry结构的指针,每个dictEntry结构保存着一个键值对。其他的属性不多说。

 

哈希表节点

哈希表节点使用dictEntry结构标识,每个dictEntry保存一个键值对。

typedef struct dictEntry{
    void *key;//
    union{
    void *val;
    uint64_tu64"
    int64_ts64"
    } v;//
    struct dictEntry *next;//指向下个哈希节点,形成链表
} ductEntry;

*next 属性是指向另一个哈希表节点的指针,这个指针可以将多个哈希值相同的键值对连接在一起,解决键冲突的问题。所以,每一个哈希索引为一个单向链表。

 

Redis中的字典由dict结构表示:

typedef struct dict{
    dictType *type;//类型特定函数
    void *orivdata;//私有数据
    dictht ht[2];//哈希表
    int trehashidx;//rehash 索引 ,当rehash不再进行时,值为-1
} dict;

 

Redis计算哈希值和索引值的方法:

hash = dict->type->hashFunction(key);
index = hash & dict->ht[x].sizemask;

 

解决键冲突:

当两个或两个一个数量的键被分配到了哈希表数组的同一个索引上面时,为我们称作这些键发生冲突。Redis的哈希表使用链地址法来解决冲突,每个哈希表节点的next指针构成了一个单向链表,以此来解决键冲突。

另外由于链表没有指向链表结尾的指针,为考虑速度,每次将新加的节点放到链表表头位置(复杂度为O(1))。

 

Rehash

随着哈希表保存的键增多或减少,为了让哈希表的负载因子维持在一个合理的范围内,程序会对哈希表的小小进行rehash(重新散列)。

    1、为字典表的ht[1]哈希表分配空间,这个哈希表的空间大小取决于要执行的操作以及ht[0]包含的键值对数量

        (1)如果执行扩展,ht[1] =第一个>=ht[0].used * 2 的2的n次方幂。

        (2)如果收缩 ht[1] = 第一个>=ht[0].used 的2的n次方幂

    2、h[0] 迁移至h[1]。

    3、清空h[0],将h[1]设置为h[0],新建h[1]。

 

渐进式rehash 

字典表同时使用ht[0],ht[1],ht[0]通过索引计数器分批量的迁移至ht[1],为解决ht[0]所持有的键值对量太大的问题。

 

不为别的,每天学一点,总会有收获。

 

说明:尊重作者知识产权,文中内容参考《Redis设计与实现》,仅在此做学习与大家分享。

 

 

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Redis学习笔记(三) 字典

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Redis学习笔记(三) 字典

Redis的字典使用哈希表作为底层实现,一个哈希表中可以有多个哈希表节点,而每个哈希节点就保存在字典中的一个键值对。redis字典所用的哈希表由disht结构定义。typedef struct dictht{ dictEntry **table;//哈希
Redis学习笔记(三) 字典
2014-05-20

python学习笔记:字典

python版本:Python 2.6.6 系统环境:CentOS release 6.2 x86_64 本文参考了互联网上前辈的一些文章 一、字典是python中最灵活的内置数据结构类型,如果把列表看作是有序的对象集合,那么字典就是无序的
2023-01-31

Redisbook学习笔记(1)字典(3

渐进式rehash在上一节,我们了解了字典的rehash 过程,需要特别指出的是,rehash 程序并不是在激活之后就马上执行直到完成的,而是分多次、渐进式地完成的。假设这样一个场景:在一个有很多键值对的字典里,某个用户在添加新键值对时触发
2023-01-31

Redis学习笔记(十三) 复制(下)

上一篇写了Redis复制功能的简单应用,下面我们看下Redis复制功能的实现过程。下面基本上是理论部分,枯燥乏味,但希望大家能看看,毕竟知识不都是感兴趣的.耐得住寂寞,经得起诱惑,方能守得住繁华 ~.~旧版复制功能的实现Redis的复制功能分为同步和命令传播两
Redis学习笔记(十三) 复制(下)
2022-04-20

Python 学习日记第三篇 -- 字典

一、字典  python中的字典不是序列,而是一种映射;不通过位置而是通过键存储。字典是可变的。  1、字典的映射操作#字典的创建>>> d1 = {'k1':'v1','k2':'v2'}>>> d2 = dict(k1='v1',k2=
2023-01-31

Python学习笔记8——列表、字典、元

参考书籍:《Learning_Python_5th_Edition.pdf》,一本英文书呢,我上传到百度网盘吧,请点击这里,密码是:kym3Lists 列表The Python list object is the most general
2023-01-30

Redis学习笔记记录

基础篇什么是Redis及快速理解Redis的使用Redis解决的问题及Redis的特性Redis的应用场景及正确安装与启动Redis配置、启动、操作、关闭及版本选择字符串使用与内部实现原理字典使用与内部实现原理列表使用与内部实现原理集合使用与内部实现原理有序集
Redis学习笔记记录
2016-01-10

NumPy 学习笔记(三)

NumPy 数组操作:  1、修改数组形状    a、numpy.reshape(arr, newshape, order='C') 在不改变数据的条件下修改形状    b、numpy.ndarray.flat 是一个数组元素迭代器    
2023-01-31

Redis 学习笔记(一) 字符串 SDS

SDS 简单动态字符串。SDS的结构:struct sdshdr{int len;//记录BUF数组中已使用字节的数量 ,等于SDS所八寸字符串的长度int free;//记录BUF数组中未使用字节的数量char buf[];//字节数组,用于保存字符串}1、
Redis 学习笔记(一) 字符串 SDS
2016-03-29

Redis学习笔记(四)--安全

Redis学习笔记(四)--安全 基于Redis6之前版本 一、设置数据库密码 1、配置文件“redis.conf”修改,需重启服务器 在配置文件中“redis.conf”设置"requirepass 123456" 2、通过"config get requi
Redis学习笔记(四)--安全
2017-03-22

Redis学习笔记(二) 链表

链表提供了高效的节点重排能力,以及顺序性的节点访问方式,并且可以通过增删节点来灵活地调整链表的长度。redis中链表应用广泛,如list中就使用了链表。每一个链表节点使用listNode结构标识(双向链表):typedef struct listNode{
Redis学习笔记(二) 链表
2017-01-27

Redis学习笔记(六) 对象

前面我们看了Redis用到的主要数据结构,如简单动态字符串(SDS)、双向链表、字典、压缩列表、整数集合等。但是Redis并没有直接使用这些数据结构来实现键值对,而是基于这些数据结构创建了一个对象系统,这个系统包括字符串对象、列表对象、哈希对象、集合对象、有序
Redis学习笔记(六) 对象
2021-06-25

Redis学习笔记——Redis基础介绍

纸上得来终觉浅,绝知此事要躬行。——陆游《冬夜读书示子聿》redis基础概念redis是一个字典结构的存储服务器。以字典结构键值对(key=>value)形式存储数据,并允许其他应用通过TCP协议读写字段中的内容。我们可以把 redis 存储数据的形式想象成一
Redis学习笔记——Redis基础介绍
2018-08-28

Python学习笔记三(Python程序

Linux系统自带的python版本通常都比较低,可以在python官方网站(http://www.python.org/download/)下载最新源码包,然后进行升级安装。1.下载python源码包。wget http://www.py
2023-01-31

Flutter学习笔记(三)RowColum布局

这篇文章主要介绍了Flutter学习笔记(三)RowColum布局,通俗来说,就是横向布局和纵向布局的用法,需要的朋友可以参考下
2023-05-14

JPetStore 5.0 学习笔记(三.Service层)

JPetStore 5.0 学习笔记(三.Service层)[@more@]19.把剩下的UPDATE/DELETE/ADD加上去,运行了一下,所有均成功了20.下面我们来回顾一下整个ibatis开发过程.首先编写User.xml,为了生效
2023-06-03

Python的dict字典结构操作方法学习笔记

一.字典的基本方法 1.新建字典 1)、建立一个空的字典>>> dict1={} >>> dict2=dict() >>> dict1,dict2 ({}, {}) 2)、新建的时候初始化一个值>>> dict1={1:'a',2:'
2022-06-04

编程热搜

目录