首页 > 数据库 >Redis数据结构-字典的实现

Redis数据结构-字典的实现

时间:2024-07-05 13:26:18浏览次数:26  
标签:数据库 Redis 键值 哈希 org 数据结构 字典

字典, 又称符号表(symbol table)、关联数组(associative array)或者映射(map), 是一种用于保存键值对(key-value pair)的抽象数据结构。

在字典中, 一个键(key)可以和一个值(value)进行关联(或者说将键映射为值), 这些关联的键和值就被称为键值对。

字典中的每个键都是独一无二的, 程序可以在字典中根据键查找与之关联的值, 或者通过键来更新值, 又或者根据键来删除整个键值对, 等等。

字典经常作为一种数据结构内置在很多高级编程语言里面, 但 Redis 所使用的 C 语言并没有内置这种数据结构, 因此 Redis 构建了自己的字典实现。

字典在 Redis 中的应用相当广泛, 比如 Redis 的数据库就是使用字典来作为底层实现的, 对数据库的增、删、查、改操作也是构建在对字典的操作之上的。

举个例子, 当我们执行命令:

redis> SET msg "hello world"
OK

在数据库中创建一个键为 "msg" , 值为 "hello world" 的键值对时, 这个键值对就是保存在代表数据库的字典里面的。

除了用来表示数据库之外, 字典还是哈希键的底层实现之一: 当一个哈希键包含的键值对比较多, 又或者键值对中的元素都是比较长的字符串时, Redis 就会使用字典作为哈希键的底层实现。

举个例子, website 是一个包含 10086 个键值对的哈希键, 这个哈希键的键都是一些数据库的名字, 而键的值就是数据库的主页网址:

redis> HLEN website
(integer) 10086
​
redis> HGETALL website
1) "Redis"
2) "Redis.io"
3) "MariaDB"
4) "MariaDB.org"
5) "MongoDB"
6) "MongoDB.org"
# ...

website 键的底层实现就是一个字典, 字典中包含了 10086 个键值对:

  • 其中一个键值对的键为 "Redis" , 值为 "Redis.io"

  • 另一个键值对的键为 "MariaDB" , 值为 "MariaDB.org"

  • 还有一个键值对的键为 "MongoDB" , 值为 "MongoDB.org"

诸如此类。

除了用来实现数据库和哈希键之外, Redis 的不少功能也用到了字典, 在后续的章节中会不断地看到字典在 Redis 中的各种不同应用。

本章接下来的内容将对 Redis 的字典实现进行详细的介绍, 并列出字典的操作 API 。

本章不会对字典的基本定义和基础算法进行介绍, 如果有需要的话, 可以参考以下这些资料:

字典的实现

Redis 的字典使用哈希表作为底层实现, 一个哈希表里面可以有多个哈希表节点, 而每个哈希表节点就保存了字典中的一个键值对。

接下来的三个小节将分别介绍 Redis 的哈希表、哈希表节点、以及字典的实现。 Redis 字典所使用的哈希表由 dict.h/dictht 结构定义:

typedef struct dictht {
​
    // 哈希表数组
    dictEntry **table;
​
    // 哈希表大小
    unsigned long size;
​
    // 哈希表大小掩码,用于计算索引值
    // 总是等于 size - 1
    unsigned long sizemask;
​
    // 该哈希表已有节点的数量
    unsigned long used;
​
} dictht;

table 属性是一个数组, 数组中的每个元素都是一个指向 dict.h/dictEntry 结构的指针, 每个 dictEntry 结构保存着一个键值对。

size 属性记录了哈希表的大小, 也即是 table 数组的大小, 而 used 属性则记录了哈希表目前已有节点(键值对)的数量。

sizemask 属性的值总是等于 size - 1 , 这

标签:数据库,Redis,键值,哈希,org,数据结构,字典
From: https://blog.csdn.net/u012882823/article/details/140206031

相关文章

  • 谷粒商城学习-11-docker安装redis
    文章目录一,拉取Redis镜像1,搜索Redis的Docker镜像2,拉取Redis镜像3,查看已经拉取的镜像二,创建、启动Redis容器1,创建redis配置文件2,创建及运行Redis容器3,使用dockerps查看运行状态的容器4,验证容器是否可用三,修改Redis配置文件一,拉取Redis镜像1,搜索Redis的Docker镜像......
  • 从零开始学数据结构系列之第四章《 广度优先遍历BFS》
    文章目录广度优先遍历(BFS)概念广度优先遍历算法步骤总代码往期回顾广度优先遍历(BFS)概念​  广度优先遍历(BreadthFirstSearch),又称为广度优先搜索,简称BFS。​  如果说图的深度优先遍历类似树的前序遍历,那么图的广度优先遍历就类似于树的层序遍历了。​ ......
  • Redis详解
    Redis是一个开源的内存数据库,它属于NoSQL数据库的一种,以其高性能、支持丰富的数据结构、持久化特性、复制、集群以及发布/订阅等特性而闻名。以下是Redis的详细说明:一、Redis的基本介绍定义:Redis(RemoteDictionaryServer)是一个高性能的键值对存储系统,它可以用于缓存、消息队......
  • Python-字典
    字典1.字典Python字典的主要属性如下:通过键而不是偏移量来读取:字典通过键将一系列值联系起来,这样就可以使用键从字典中取出存储于该键下的一项任意对象的无序集合:与列表不同,保存在字典中的项并没有特定的顺序,实际上,Python将各项伪随机地从左到右随机排序,以便快速查找长度可......
  • ElasticSearch的数据结构是什么
    Elasticsearch的数据结构是基于文档的存储和检索模型。它使用一种灵活的、面向文档的方式来存储和管理数据,每个文档都可以包含多种类型的数据。下面详细介绍Elasticsearch的数据结构及其核心概念:核心概念索引(Index):Elasticsearch中的索引相当于关系型数据库中的数据库。......
  • Redis 中如何让消息永不过期
    在Redis中,如果想要让消息(或任何键)永不过期,可以通过以下方式实现:1.不设置过期时间默认情况下,Redis中的键是永不过期的,除非明确为其设置了过期时间。因此,只要在设置键值时不使用任何过期时间相关的命令,键值就会一直保存在Redis中。示例SETmyKeymyValue在上面的示例中,......
  • Redis 可以根据消息存储时长 将key 删除吗
    是的,Redis可以根据消息的存储时长(TTL,Time-To-Live)自动删除键。您可以通过设置键的过期时间来实现这一点。以下是一些相关的命令和使用示例:设置过期时间的命令EXPIRE:为键设置过期时间(以秒为单位)。EXPIREkeysecondsPEXPIRE:为键设置过期时间(以毫秒为单位)。PEXPIREkey......
  • Redis 的常用命令
    Redis是一个开源的内存数据结构存储,广泛应用于缓存、消息队列和实时数据分析等场景。下面是Redis的一些常用命令,按数据类型和功能分类列出。通用命令连接与认证:PING:测试服务器连接。PINGAUTH:认证服务器。AUTHpassword服务器信息:INFO:获取服务器的信息和统计......
  • 数据结构实验报告:查找
     一、实验目的1.掌握查找表的结构。2.掌握顺序查找、折半查找、二叉排序树查找和哈希查找。二、实验环境Windows10、VisualC++6.0三、实验任务1.编写程序实现顺序查找和折半查找。(1)顺序查找#include<stdio.h>#include<stdlib.h>#defineLIST_SIZE20typ......
  • Java中的JSON神器,如何轻松玩转复杂数据结构
    哈喽,大家好,我是木头左!一、揭秘JSON世界的基石在Java的世界中,JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,它基于文本,易于阅读和编写,同时也易于机器解析和生成。JSON在日常开发中的应用非常广泛,无论是前后端的数据交互,还是配置文件的读取,都离不开JSON的身影。那......