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是一种开源的键值(Key-Value)存储系统,属于非关系型数据库(NoSQL)的一种,它将数据存储在内存中,以提高数据访问速度。由于其高效的数据结构和丰富的...
1. 数据结构:Redis支持多种数据结构,如字符串(String)、哈希表(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)。不同的数据结构在处理数据时的效率不同,对内存和网络带宽的影响也有所差异。例如...
哈希表是Redis中用于存储键值对的数据结构,通过dict定义,提供哈希表的大小size和哈希表的元素数组table。 二、服务器模型 1. 事件处理(ae.h/ae.c) 事件处理是Redis的核心机制,用于处理客户端的连接和命令...
Redis 是一个高性能的键值对数据库,其丰富的数据结构为数据存储和处理提供了极大的灵活性。在Redis中,数据结构不仅仅是简单的字符串、整数或哈希,还包括了集合、有序集合、链表、位图等多种类型。这些数据结构的...
Redis的特点在于其支持多种数据结构,如字符串(Strings)、哈希(Hashes)、列表(Lists)、集合(Sets)、有序集合(Sorted Sets)等,这使得Redis不仅仅局限于简单的键值存储,还能用于更复杂的场景,比如缓存、消息队列、...
2. Redis存储机制: - 内存管理:Redis将所有数据存储在内存中,以实现高速访问。为避免内存耗尽,Redis使用LRU(最近最少使用)算法进行内存淘汰。 - 网络模型:Redis基于单线程模型处理客户端请求,通过IO多路...
在这个“Redis实战中文版及源码下载”的资源中,你将能够获取到关于Redis的实战经验和源码分析,这对于深入理解Redis的工作原理以及在实际项目中的应用非常有帮助。 Redis的主要特点包括: 1. **高速缓存**:Redis...
Redis支持多种数据结构,如字符串(String)、哈希表(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)。这些数据结构在源码中由不同的C结构体实现,例如`sds`用于表示字符串,`dict`表示哈希表,`list`...
1. **什么是Redis**:Redis是一个开源的、基于键值对的数据存储系统,支持多种数据结构,如字符串、哈希、列表、集合、有序集合等。它以内存中的数据作为主要存储方式,同时提供了持久化功能,确保数据在断电后不会...
Redis的数据类型包括字符串(Strings)、哈希(Hashes)、列表(Lists)、集合(Sets)和有序集合(Sorted Sets),这些数据结构提供了多样化的存储和操作方式。例如,字符串可以用来存储简单的键值对;哈希则适用于存储对象,...
Redis支持多种数据类型,如字符串、哈希、列表、集合、有序集合等,使得在处理复杂数据结构时变得简单高效。 **Redis的主要特性** 1. **内存存储**: Redis的所有数据都存储在内存中,读写速度极快,但这也意味着...
1. **键值存储**:Redis 支持多种数据结构,如字符串、哈希、列表、集合、有序集合等,这些数据结构为开发提供了极大的便利。 2. **持久化**:Redis 可以通过 RDB (Snapshot) 和 AOF (Append Only File) 两种方式...
由于其快速响应和轻量级的内存存储方式,Redis在Web应用程序、实时分析和分布式系统等领域得到了广泛应用。 Redis Desktop Manager的主要功能包括: 1. **连接管理**:支持多个Redis服务器的连接,可以方便地切换...
【Redis集群连接及工具类DEMO】是一个Spring工程,它提供了与Redis集群交互的实例,同时也包含了一些实用的工具类,使得开发者能够更方便地在Java应用中使用Redis作为数据存储。这个DEMO的主要目标是展示如何配置和...
- **数据类型**:Redis支持字符串、哈希、列表、集合和有序集合等多种数据结构,满足不同场景需求。 - **事务(Transactions)**:Redis提供了多条命令的原子执行,确保数据操作的完整性。 - **发布订阅(Pub/Sub...
**描述分析:** 描述提到"C#简单操作Redis",这意味着我们将使用C#编程语言来实现Redis的操作。C#提供了多种库如StackExchange.Redis,使得开发者可以方便地在C#应用中集成Redis。同时,描述中提到了两个版本——一...