搞定 Redis 数据存储原理,别只会Set、Get 了
在上一篇通过源码编译构建出可调式环境之后,想必你想更深入了解我的整体架构。当你熟悉我的整体架构和每个模块,遇到问题才能直击本源,直捣黄龙,一笑破苍穹。
我的核心模块如图 1-10。
- Client 客户端,官方提供了 C 语言开发的客户端,可以发送命令,性能分析和测试等。
- 网络层事件驱动模型,基于 I/O 多路复用,封装了一个短小精悍的高性能 ae 库,全称是a simple event-driven programming library。
- 在 ae 这个库里面,我通过aeApiState 结构体对 epoll、select、kqueue、evport四种 I/O 多路复用的实现进行适配,让上层调用方感知不到在不同操作系统实现 I/O 多路复用的差异。
- Redis 中的事件可以分两大类:一类是网络连接、读、写事件;另一类是时间事件,也就是特定时间触发的事件,比如定时执行 rehash 操作。
- 命令解析和执行层,负责执行客户端的各种命令,比如SET、DEL、GET等。
- 内存分配和回收,为数据分配内存,提供不同的数据结构保存数据。
- 持久化层,提供了 RDB 内存快照文件 和 AOF 两种持久化策略,实现数据可靠性。
- 高可用模块,提供了副本、哨兵、集群实现高可用。
- 监控与统计,提供了一些监控工具和性能分析工具,比如监控内存使用、基准测试、内存碎片、bigkey 统计、慢指令查询等。
掌握了整体架构和模块后,接下来进入 src 源码目录,使用如下指令执行 redis-server可执行程序启动 Redis。
./redis-server ../redis.conf
每个被启动的服务我都会抽象成一个 redisServer,源码定在server.h 的redisServer 结构体。
这个结构体包含了存储键值对的数据库实例、redis.conf 文件路径、命令列表、加载的 Modules、网络监听、客户端列表、RDB AOF 加载信息、配置信息、RDB 持久化、主从复制、客户端缓存、数据结构压缩、pub/sub、Cluster、哨兵等一些列 Redis 实例运行的必要信息。
结构体字段很多,不再一一列举,部分核心字段如下。
truct redisServer {
pid_t pid; /* 主进程 pid. */
pthread_t main_thread_id; /* 主线程 id */
char *configfile; /*redis.conf 文件绝对路径*/
redisDb *db; /* 存储键值对数据的 redisDb 实例 */
int dbnum; /* DB 个数 */
dict *commands; /* 当前实例能处理的命令表,key 是命令名,value 是执行命令的入口 */
aeEventLoop *el;/* 事件循环处理 */
int sentinel_mode; /* true 则表示作为哨兵实例启动 */
/* 网络相关 */
int port;/* TCP 监听端口 */
list *clients; /* 连接当前实例的客户端列表 */
list *clients_to_close; /* 待关闭的客户端列表 */
client *current_client; /* 当前执行命令的客户端*/
};
数据存储原理
其中redisDb *db指针非常重要,它指向了一个长度为 dbnum(默认 16)的 redisDb 数组,它是整个存储的核心,我就是用这玩意来存储键值对。
redisDb
redisDb 结构体定义如下。
typedef struct redisDb {
dict *dict;
dict *expires;
dict *blocking_keys;
dict *ready_keys;
dict *watched_keys;
int id;
long long avg_ttl;
unsigned long expires_cursor;
list *defrag_later;
clusterSlotToKeyMapping *slots_to_keys;
} redisDb;
dict 和 expires
- dict 和 expires 是最重要的两个属性,底层数据结构是字典,分别用于存储键值对数据和 key 的过期时间。
- expires,底层数据结构是 dict 字典,存储每个 key 的过期时间。
>更多相关文章
- 01-09搞定 Redis 数据存储原理,别只会Set、Get 了
- 01-09多数据库Citus集群的维护
- 01-09MySQL批量导入数据时,为何表空间膨胀了N倍
- 01-09关系型数据库设计三大范式
- 01-09面试官:MySQL主键为什么不是连续递增的?
- 01-09大型互联网系统数据库切换方案
首页推荐
佛山市东联科技有限公司一直秉承“一切以用户价值为依归
- 01-11全球最受赞誉公司揭晓:苹果连续九年第一
- 12-09罗伯特·莫里斯:让黑客真正变黑
- 12-09谁闯入了中国网络?揭秘美国绝密黑客小组TA
- 12-09警示:iOS6 惊现“闪退”BUG
- 03-20马斯克称将于月底开放推特推荐机制代码
- 03-20欢聚集团2022年四季度净亏损超3亿美元
- 03-20阅文集体2022年营收76.3亿元 归母净利同比增
- 03-20天津成立人工智能计算中心
- 03-20AI最先代替谁?马斯克称是CEO
相关文章
24小时热门资讯
24小时回复排行
热门推荐
最新资讯
操作系统
黑客防御