广告
返回顶部
首页 > 资讯 > 数据库 >Redis学习笔记(三) 字典
  • 429
分享到

Redis学习笔记(三) 字典

Redis学习笔记(三)字典 2014-05-20 14:05:47 429人浏览 猪猪侠
摘要

Redis的字典使用哈希表作为底层实现,一个哈希表中可以有多个哈希表节点,而每个哈希节点就保存在字典中的一个键值对。 redis字典所用的哈希表由disht结构定义。 typedef struct dictht{ dic

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设计与实现》,仅在此做学习与大家分享。

 

 

您可能感兴趣的文档:

--结束END--

本文标题: Redis学习笔记(三) 字典

本文链接: https://www.lsjlt.com/news/6025.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • Redis学习笔记(三) 字典
    Redis的字典使用哈希表作为底层实现,一个哈希表中可以有多个哈希表节点,而每个哈希节点就保存在字典中的一个键值对。 redis字典所用的哈希表由disht结构定义。 typedef struct dictht{ dic...
    99+
    2014-05-20
    Redis学习笔记(三) 字典
  • python学习笔记:字典
     python版本:Python 2.6.6   系统环境:CentOS release 6.2 x86_64   本文参考了互联网上前辈的一些文章   一、字典是python中最灵活的内置数据结构类型,如果把列表看作是有序的对象集合,那么...
    99+
    2023-01-31
    字典 学习笔记 python
  • Redisbook学习笔记(1)字典(3
    渐进式rehash在上一节,我们了解了字典的rehash 过程,需要特别指出的是,rehash 程序并不是在激活之后就马上执行直到完成的,而是分多次、渐进式地完成的。假设这样一个场景:在一个有很多键值对的字典里,某个用户在添加新键值对时触发...
    99+
    2023-01-31
    字典 学习笔记 Redisbook
  • Redis学习笔记(十三) 复制(下)
    上一篇写了Redis复制功能的简单应用,下面我们看下Redis复制功能的实现过程。下面基本上是理论部分,枯燥乏味,但希望大家能看看,毕竟知识不都是感兴趣的.耐得住寂寞,经得起诱惑,方能守得住繁华 ~.~旧版复制功能的实现 Redi...
    99+
    2022-04-20
    Redis学习笔记(十三) 复制(下)
  • Python 学习日记第三篇 -- 字典
    一、字典  python中的字典不是序列,而是一种映射;不通过位置而是通过键存储。字典是可变的。  1、字典的映射操作#字典的创建 >>> d1 = {'k1':'v1','k2':'v2'} >>> d...
    99+
    2023-01-31
    字典 第三篇 日记
  • Python学习笔记8——列表、字典、元
    参考书籍:《Learning_Python_5th_Edition.pdf》,一本英文书呢,我上传到百度网盘吧,请点击这里,密码是:kym3 Lists 列表 The Python list object is the most gene...
    99+
    2023-01-30
    字典 学习笔记 列表
  • Redis学习笔记记录
    基础篇 什么是Redis及快速理解Redis的使用 Redis解决的问题及Redis的特性 Redis的应用场景及正确安装与启动 Redis配置、启动、操作、关闭及版本选择 字符串使用与内部实现原理 字典使用与内部实现原理 列表...
    99+
    2016-01-10
    Redis学习笔记记录
  • Redis 学习笔记(一) 字符串 SDS
    SDS 简单动态字符串。 SDS的结构: struct sdshdr{ int len;//记录BUF数组中已使用字节的数量 ,等于SDS所八寸字符串的长度 int free;//记录BUF数组中未使用字节的数量 char ...
    99+
    2016-03-29
    Redis 学习笔记(一) 字符串 SDS
  • SQL入门经典(第5版)学习笔记(三)
    1.下面这个CREATE TABLE命令能够正常执行吗?需要做什么修改?在不同的数据库(MySQL、Oracle、SQL Server)中执行,有什么限制吗? 不要as: middle_name null...
    99+
    2022-10-18
  • NumPy 学习笔记(三)
    NumPy 数组操作:   1、修改数组形状     a、numpy.reshape(arr, newshape, order='C') 在不改变数据的条件下修改形状     b、numpy.ndarray.flat 是一个数组元素迭代器...
    99+
    2023-01-31
    学习笔记 NumPy
  • redis geohash 学习笔记
    附近的人: 地图元素的位置数据使用二维的经纬度表示,经度范围 (-180, 180],纬度范围 (-90, 90],纬度正负以赤道为界,北正南负,经度正负以本初子午线 (英国格林尼治天文台) 为界,东正西负...
    99+
    2022-10-18
  • Redis学习笔记(二) 链表
    链表提供了高效的节点重排能力,以及顺序性的节点访问方式,并且可以通过增删节点来灵活地调整链表的长度。 redis中链表应用广泛,如list中就使用了链表。 每一个链表节点使用listNode结构标识(双向链表): typedef...
    99+
    2017-01-27
    Redis学习笔记(二) 链表
  • Redis学习笔记(六) 对象
    前面我们看了Redis用到的主要数据结构,如简单动态字符串(SDS)、双向链表、字典、压缩列表、整数集合等。 但是Redis并没有直接使用这些数据结构来实现键值对,而是基于这些数据结构创建了一个对象系统,这个系统包括字符串对象、列...
    99+
    2021-06-25
    Redis学习笔记(六) 对象
  • Redis学习笔记(四)--安全
    Redis学习笔记(四)--安全 基于Redis6之前版本 一、设置数据库密码 配置文件“redis.conf”修改,需重启服务器 在配置文件中“redis.conf”设置"requirepass 123456" 通过"confi...
    99+
    2017-03-22
    Redis学习笔记(四)--安全
  • Redis学习笔记——Redis基础介绍
    纸上得来终觉浅,绝知此事要躬行。——陆游《冬夜读书示子聿》 redis基础概念 redis是一个字典结构的存储服务器。以字典结构键值对(key=>value)形式存储数据,并允许其他应用通过TCP协议读写字段中的内容。 我们可以把 r...
    99+
    2018-08-28
    Redis学习笔记——Redis基础介绍
  • Python的dict字典结构操作方法学习笔记
    一.字典的基本方法 1.新建字典 1)、建立一个空的字典 >>> dict1={} >>> dict2=dict() >>> dict1,dic...
    99+
    2022-06-04
    字典 操作方法 学习笔记
  • Python学习笔记三(Python程序
     Linux系统自带的python版本通常都比较低,可以在python官方网站(http://www.python.org/download/)下载最新源码包,然后进行升级安装。1.下载python源码包。wget http://www....
    99+
    2023-01-31
    学习笔记 程序 Python
  • Android学习笔记——Menu介绍(三)
    知识点 今天继续昨天没有讲完的Menu的学习,主要是Popup Menu的学习。 Popup Menu(弹出式菜单) 弹出式菜单是一种固定在View上的菜单模型。主要用于以下三...
    99+
    2022-06-06
    android学习 Android
  • 【Python3.7学习笔记】三、变量和
    【Python3.7学习笔记】三、变量和简单数据类型 【Python3.7学习笔记】一、环境搭建 【Python3.7学习笔记】二、第一个python程序 【Python3.7学习笔记】三、变量和简单数据类型 【Pytho...
    99+
    2023-01-31
    变量 学习笔记
  • Flutter学习笔记(三)RowColum布局
    目录主题开发环境源码开发过程主题 本文将介绍,flutter中的row,colum的用法。通俗来说,就是横向布局和纵向布局的用法。 开发环境 win10androidstudio20...
    99+
    2023-05-14
    Flutter学习 Flutter Row Flutter Colum Flutter布局
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作