Redis 键值对(key-value)数据库实现方法

 更新时间:2024年05月31日 14:38:20   作者:YoungSoulwt  
Redis 的键值对中的 key 就是字符串对象,而 value 可以是字符串对象,也可以是集合数据类型的对象,比如 List 对象,Hash 对象、Set 对象和 Zset 对象,这篇文章主要介绍了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 对象和数据结构的关系如下:

到此这篇关于Redis 键值对数据库是怎么实现的的文章就介绍到这了,更多相关Redis 键值对数据库内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • redis 查看所有的key方式

    redis 查看所有的key方式

    这篇文章主要介绍了redis 查看所有的key方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • Redis持久化使用及说明(RDB&AOF)

    Redis持久化使用及说明(RDB&AOF)

    Redis通过RDB(定期快照)和AOF(日志记录)实现持久化,兼顾内存性能与数据安全,RDB文件紧凑,适合冷备;AOF实时性强,但体积较大,两者结合使用(混合持久化)可平衡效率与可靠性,确保数据在异常重启时恢复
    2025-08-08
  • 简介Redis中的showlog功能

    简介Redis中的showlog功能

    这篇文章主要介绍了简介Redis中的showlog功能,作者同时对比了DEL命令的性能,需要的朋友可以参考下
    2015-06-06
  • redis 过期策略及内存回收机制解析

    redis 过期策略及内存回收机制解析

    这篇文章主要介绍了redis 过期策略及内存回收机制,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Redis哨兵模式在Spring Boot项目中的使用与实践完全指南

    Redis哨兵模式在Spring Boot项目中的使用与实践完全指南

    Redis哨兵模式为SpringBoot项目提供高可用Redis管理,实现自动故障转移与监控,通过配置依赖、参数及最佳实践(如哨兵节点数量、网络规划),可提升系统稳定性与可靠性,本文给大家介绍Redis哨兵模式在Spring Boot项目中的使用与实践,感兴趣的朋友跟随小编一起看看吧
    2025-09-09
  • 从原理到实践分析 Redis 分布式锁的多种实现方案

    从原理到实践分析 Redis 分布式锁的多种实现方案

    在分布式系统中,为了保证多个进程或线程之间的数据一致性和正确性,需要使用锁来实现互斥访问共享资源,然而,使用本地锁在分布式系统中存在问题,这篇文章主要介绍了从原理到实践分析 Redis 分布式锁的多种实现方案,需要的朋友可以参考下
    2024-07-07
  • Redis的复制延迟优化的实现步骤

    Redis的复制延迟优化的实现步骤

    本文探讨了Redis主从复制架构中的复制延迟问题及其优化策略,复制延迟主要由网络延迟、节点性能不足和数据量过大等因素导致,下面就来介绍一下优化方案,感兴趣的可以了解一下
    2025-10-10
  • Redis反序列化失败的解决方法

    Redis反序列化失败的解决方法

    在使用Redis缓存数据的过程中,有时会遇到反序列化失败的问题,本文主要介绍了Redis反序列化失败的解决方法,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • NestJS+Redis实现手写一个限流器

    NestJS+Redis实现手写一个限流器

    限流是大型系统必备的保护措施,本文将结合redis , lua 脚本 以及 Nestjs Guard 来实现 限流的效果,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-11-11
  • Window下对Redis进行开启与关闭的操作方法

    Window下对Redis进行开启与关闭的操作方法

    这篇文章主要介绍了Window下对Redis进行开启与关闭的操作方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-11-11

最新评论