`

Redis 存储结构分析,及哈希相关

阅读更多

Redis 是支持多 key-value 数据库 ( ) , 并用 RedisDb 来表示一个 key-value 数据库 ( ). redisServer 中有一个 redisDb *db; 成员变量 , RedisServer 在初始化时 , 会根据配置文件的 db 数量来创建一个 redisDb 数组 . 客户端在连接后 , 通过 SELECT 指令来选择一个 reidsDb, 如果不指定 , 则缺省是 redisDb 数组的第 1 ( 即下标是 0)redisDb. 一个客户端在选择 redisDb , 其后续操作都是在此 redisDb 上进行的 .

 

dictType 中定义的为各种函数 : 哈希函数 ,key 比较函数 ,key/value 复制函数等 .

dict 是主要是由 struct dictht 的哈希表构成的 , 之所以定义成长度为 2 (dictht ht[2]) 哈希表数组 , 是因为 redis 采用增量的 rehash. 这种渐进的 rehash 需要一个额外的 struct dictht 结构来保存 .

dictht 中的 table 是一个数组 + 指针形式的 hash 表, size hash 数组 ( ) 的大小, used 表示 hash 表的元素个数,这两个值与 rehash resize 过程密切相关。 sizemask 等于 size-1 ,这是为了方便将 hash 值映射到数组中。

iterators 记录当前 dict 中的迭代器数,主要是为了避免在有迭代器时 rehash ,在有迭代器时 rehash 可能会造成值的丢失或重复 .

rehashidx 表示上次 rehash 时在 ht[0] 的下标位置 .

 

关于 rehash:

1)原因:
redis使用的为动态大小的哈希表,当哈希表的大小不能满足需求,元素的hash碰撞比较多时进行扩容. 由于在数据结构中定义使用两个哈希表,当第一个表ht中的元素大于桶的个数时,进行扩容(dictAdd->_dictKeyIndex->_dictExpandIfNeeded->dictExpand),每次扩容大小为((d->ht[0].size > d->ht[0].used) ? d->ht[0].size : d->ht[0].used)*2,初始值为DICT_HT_INITIAL_SIZE = 4.扩容后开始将第一个表ht中的元素进行增量rehash到第二个表中,当rehash完成时,将第二个表赋给第一个表,并将原表内存释放.

/* Check if we already rehashed the whole table... */
if (d->ht[0].used == 0) {
  zfree(d->ht[0].table);
  d->ht[0] = d->ht[1];
  _dictReset(&d->ht[1]);
  d->rehashidx = -1;
  return 0;
}

 

2)原则: 增量更新与分批更新同时进行,不阻塞请求. 将操作平摊到每次操作,以及充分利用server idle时的CPU资源,以减少突然的rehash行为造成服务器性能的瞬间下降.
3)模式:
lazy rehashing:在每次对dict进行操作的时候执行一个slot的rehash
_dictRehashStep中,也会调用dictRehash,而_dictRehashStep每次仅会rehash一个值从ht[0]到ht[1],但由于_dictRehashStep是被dictGetRandomKey、 dictFind、 dictGenericDelete、dictAdd调用的,因此在每次dict增删查改时都会被调用,这无疑就加快rehash了 过程。
active rehashing:每100ms里面使用1ms时间进行rehash。
serverCron中,当没有后台子线程时,会调用incrementallyRehash,最终调用dictRehashMilliseconds。 incrementallyRehash的时间较长,rehash的个数也比较多。这里每次执行 1 millisecond rehash 操作;如果未完成 rehash,会在下一个loop里面继续执行。
4)方法:
active rehashing: serverCron->incrementallyRehash->dictRehashMilliseconds->dictRehash(100)
lazy rehashing: dictAdd/dictGenericDelete/dictFind/dictGetRandomKey->_dictRehashStep-> dictRehash(1)

分享到:
评论

相关推荐

    redis内存存储结构分析

    ### Redis内存存储结构分析 #### 一、Redis内存存储总体结构概述 Redis是一种高性能的键值存储系统,它将所有数据存储在内存中,从而实现了非常快的数据读写速度。然而,这种设计也有其局限性,例如对于拥有大量...

    Redis技术分析及运用

    ### Redis技术分析及运用 #### 一、Redis简介与特性 Redis是一种开源的键值(Key-Value)存储系统,属于非关系型数据库(NoSQL)的一种,它将数据存储在内存中,以提高数据访问速度。由于其高效的数据结构和丰富的...

    Redis流量-流量分析

    1. 数据结构:Redis支持多种数据结构,如字符串(String)、哈希表(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)。不同的数据结构在处理数据时的效率不同,对内存和网络带宽的影响也有所差异。例如...

    Redis源代码分析.pdf

    哈希表是Redis中用于存储键值对的数据结构,通过dict定义,提供哈希表的大小size和哈希表的元素数组table。 二、服务器模型 1. 事件处理(ae.h/ae.c) 事件处理是Redis的核心机制,用于处理客户端的连接和命令...

    redis数据结构基础知识及案列(每个数据结构一个案例).zip

    Redis 是一个高性能的键值对数据库,其丰富的数据结构为数据存储和处理提供了极大的灵活性。在Redis中,数据结构不仅仅是简单的字符串、整数或哈希,还包括了集合、有序集合、链表、位图等多种类型。这些数据结构的...

    Redis源代码分析

    Redis的特点在于其支持多种数据结构,如字符串(Strings)、哈希(Hashes)、列表(Lists)、集合(Sets)、有序集合(Sorted Sets)等,这使得Redis不仅仅局限于简单的键值存储,还能用于更复杂的场景,比如缓存、消息队列、...

    redis之相关理解分析以及面试问题总结

    2. Redis存储机制: - 内存管理:Redis将所有数据存储在内存中,以实现高速访问。为避免内存耗尽,Redis使用LRU(最近最少使用)算法进行内存淘汰。 - 网络模型:Redis基于单线程模型处理客户端请求,通过IO多路...

    Redis实战中文版及源码下载

    在这个“Redis实战中文版及源码下载”的资源中,你将能够获取到关于Redis的实战经验和源码分析,这对于深入理解Redis的工作原理以及在实际项目中的应用非常有帮助。 Redis的主要特点包括: 1. **高速缓存**:Redis...

    redis源码分析

    Redis支持多种数据结构,如字符串(String)、哈希表(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)。这些数据结构在源码中由不同的C结构体实现,例如`sds`用于表示字符串,`dict`表示哈希表,`list`...

    redis客户端连接工具 RedisDesktopManager

    1. **什么是Redis**:Redis是一个开源的、基于键值对的数据存储系统,支持多种数据结构,如字符串、哈希、列表、集合、有序集合等。它以内存中的数据作为主要存储方式,同时提供了持久化功能,确保数据在断电后不会...

    Redis和RedisDesktop

    Redis的数据类型包括字符串(Strings)、哈希(Hashes)、列表(Lists)、集合(Sets)和有序集合(Sorted Sets),这些数据结构提供了多样化的存储和操作方式。例如,字符串可以用来存储简单的键值对;哈希则适用于存储对象,...

    RedisStudio Redis监控工具

    Redis支持多种数据类型,如字符串、哈希、列表、集合、有序集合等,使得在处理复杂数据结构时变得简单高效。 **Redis的主要特性** 1. **内存存储**: Redis的所有数据都存储在内存中,读写速度极快,但这也意味着...

    redis 免安装 redis客户端 redis-desktop-manager-0.8.8.384

    1. **键值存储**:Redis 支持多种数据结构,如字符串、哈希、列表、集合、有序集合等,这些数据结构为开发提供了极大的便利。 2. **持久化**:Redis 可以通过 RDB (Snapshot) 和 AOF (Append Only File) 两种方式...

    Redis Desktop Manager redis的可视化工具压缩包,解压即用

    由于其快速响应和轻量级的内存存储方式,Redis在Web应用程序、实时分析和分布式系统等领域得到了广泛应用。 Redis Desktop Manager的主要功能包括: 1. **连接管理**:支持多个Redis服务器的连接,可以方便地切换...

    redis集群连接及工具类DEMO

    【Redis集群连接及工具类DEMO】是一个Spring工程,它提供了与Redis集群交互的实例,同时也包含了一些实用的工具类,使得开发者能够更方便地在Java应用中使用Redis作为数据存储。这个DEMO的主要目标是展示如何配置和...

    redis-5.0.5.zip windows版本

    - **数据类型**:Redis支持字符串、哈希、列表、集合和有序集合等多种数据结构,满足不同场景需求。 - **事务(Transactions)**:Redis提供了多条命令的原子执行,确保数据操作的完整性。 - **发布订阅(Pub/Sub...

    WPF操作Redis简单实例

    **描述分析:** 描述提到"C#简单操作Redis",这意味着我们将使用C#编程语言来实现Redis的操作。C#提供了多种库如StackExchange.Redis,使得开发者可以方便地在C#应用中集成Redis。同时,描述中提到了两个版本——一...

Global site tag (gtag.js) - Google Analytics