10- Redis 键值对数据库是怎么实现的?

在开始将数据结构之前,先给介绍下 Redis 是怎样实现键值对(key-value)数据库的。

Redis 的键值对中的 key 就是字符串对象,而 value 可以是字符串对象,也可以是集合数据类型的对象,比如 List 对象,Hash 对象、Set 对象和 Zset 对象。

比如说:

> SET name "a"
OK
​
> HSET person name "a" age 18
​
>RPUSH stu "a" "b"
(integer) 4

这些命令代表着:

  • 第一条命令:name 是一个字符串键,因为键的值是一个字符串对象

  • 第二条命令:person 是一个哈希表键,因为键的值是一个包含两个键值对的哈希表对象

  • 第三条命令:stu 是一个列表键,因为键的值是一个包含两个元素的列表对象

这些键值对是如何保存在 Redis 中的呢?

Redis 是使用了一个【哈希表】保存所有键值对,哈希表的最大好处就是让我们可以用 O(1) 的时间复杂度来快速查找键值对。哈希表其实就是一个数组,数组中的元素叫做哈希桶。

Redis 的哈希桶是怎么保存键值对数据的呢?

哈希桶存放的是指向键值对数据的指针(dictEntry*),这样通过指针就能找到键值对数据,然后因为键值对的值可以保存字符串对象和集合数据类型的对象,所以键值对的数据结构并不是直接保存值本身,而是保存了 void * key 和 void * value 指针,分别指向了实际的键对象和值对象,这样一来,即使值是集合数据,也可以通过 void * value 指针找到。

这里大概说下图中涉及到的数据结构的名字和用途:

  • redisDb 结构,表示 Redis 数据库的结构,结构体里存放了指向了 dict 结构的指针;

  • dict 结构,结构体里存放了 2 个哈希表,正常情况下都是用【哈希表1】,【哈希表2】只有在 rehash 的时候才用,具体什么是 rehash,会在哈希表数据结构中说明;

  • dicttht 结构,表示哈希表的结构,结构里存放了哈希表数组,数组中的每个元素都是指向一个哈希表节点结构(dictEntry)的指针;

  • dictEntry 结构,表示哈希表节点的结构,结构里存放了 void * key 和 void * value 指针,key 指向的是 String 对象,而 value 则可以指向 String 对象,也可以指向集合类型的对象,比如 List 对象、Hash 对象、Set 对象和 Zset 对象

特别说明下,void * key 和 void * value 指针指向的是 Redis 对象,Redis 中的每个对象都由 redisObject 结构表示,如下:

对象结构里包含的成员变量:

  • type:标识该对象是什么类型的对象(String 对象、List 对象、Hash 对象、Set 对象和 Zset 对象);

  • encoding:标识该对象使用了哪种底层的数据结构;

  • ptr,指向底层数据结构的指针

Redis 对象和数据结构的关系如下:

相关推荐

  1. redis:数据倾斜什么?怎么热点数据

    2024-06-07 16:08:02       46 阅读
  2. Rediskey过期策略怎么实现

    2024-06-07 16:08:02       49 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-07 16:08:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-07 16:08:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-07 16:08:02       82 阅读
  4. Python语言-面向对象

    2024-06-07 16:08:02       91 阅读

热门阅读

  1. 48、Flink 的 Data Source API 详解

    2024-06-07 16:08:02       31 阅读
  2. QT 和VS 针对linux开发的不同

    2024-06-07 16:08:02       33 阅读
  3. Apache Kylin新手小白入门教程

    2024-06-07 16:08:02       28 阅读
  4. LeetCode刷题第2题

    2024-06-07 16:08:02       27 阅读
  5. 【Python】使用 Python 查询域名的 IP 地址

    2024-06-07 16:08:02       33 阅读
  6. LoRa技术在物联网中的应用

    2024-06-07 16:08:02       31 阅读
  7. 迁移学习的简要概述

    2024-06-07 16:08:02       29 阅读
  8. 【小米-小爱】多模态算法岗社招面经

    2024-06-07 16:08:02       32 阅读
  9. wpf INotifyPropertyChanged

    2024-06-07 16:08:02       28 阅读
  10. 以下哪项不属于盗用视频行为?

    2024-06-07 16:08:02       25 阅读