广告
返回顶部
首页 > 资讯 > 数据库 >如何在redis数据库中查找key在内存中的位置
  • 718
分享到

如何在redis数据库中查找key在内存中的位置

2024-04-02 19:04:59 718人浏览 独家记忆
摘要

这篇文章主要介绍“如何在Redis数据库中查找key在内存中的位置”,在日常操作中,相信很多人在如何在redis数据库中查找key在内存中的位置问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,

这篇文章主要介绍“如何在Redis数据库中查找key在内存中的位置”,在日常操作中,相信很多人在如何在redis数据库中查找key在内存中的位置问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何在redis数据库中查找key在内存中的位置”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

一、预先需要了解的知识
1、redis 中的每一个数据库,都由一个 redisDb 的结构存储。其中,redisDb.id 存储着 redis 数据库以整数表示的号码。redisDb.dict 存储着该库所有的键值对数据。redisDb.expires 保存着每一个键的过期时间。
2、当redis 服务器初始化时,会预先分配 16 个数据库(该数量可以通过配置文件配置),所有数据库保存到结构 redisServer 的一个成员 redisServer.db 数组中。当我们选择数据库 select number  时,程序直接通过 redisServer.db[number] 来切换数据库。有时候当程序需要知道自己是在哪个数据库时,直接读取 redisDb.id 即可。
3、既然我们知道一个数据库的所有键值都存储在redisDb.dict中,那么我们要知道如果找到key的位置,就有必要了解一下dict 的结构了:

复制代码 代码如下:

typedef struct dict {

// 特定于类型的处理函数
dictType *type;

// 类型处理函数的私有数据
void *privdata;

// 哈希表(2个)
dictht ht[2];

// 记录 rehash 进度的标志,值为-1 表示 rehash 未进行
int rehashidx;

// 当前正在运作的安全迭代器数量
int iterators;
} dict;
由上述的结构可以看出,redis 的字典使用哈希表作为其底层实现。dict 类型使用的两个指向哈希表的指针,其中 0 号哈希表(ht[0])主要用于存储数据库的所有键值,而1号哈希表主要用于程序对 0 号哈希表进行 rehash 时使用,rehash 一般是在添加新值时会触发,这里不做过多的赘述。所以redis 中查找一个key,其实就是对进行该dict 结构中的 ht[0] 进行查找操作。
4、既然是哈希,那么我们知道就会有哈希碰撞,那么当多个键哈希之后为同一个值怎么办呢?redis采取链表的方式来存储多个哈希碰撞的键。也就是说,当根据key的哈希值找到该列表后,如果列表的长度大于1,那么我们需要遍历该链表来找到我们所查找的key。当然,一般情况下链表长度都为是1,所以时间复杂度可看作o(1)。
二、当redis 拿到一个key 时,如果找到该key的位置。
了解了上述知识之后,我们就可以来分析redis如果在内存找到一个key了。
1、当拿到一个key后, redis 先判断当前库的0号哈希表是否为空,即:if (dict->ht[0].size == 0)。如果为true直接返回NULL。
2、判断该0号哈希表是否需要rehash,因为如果在进行rehash,那么两个表中者有可能存储该key。如果正在进行rehash,将调用一次_dictRehashStep方法,_dictRehashStep 用于对数据库字典、以及哈希键的字典进行被动 rehash,这里不作赘述。
3、计算哈希表,根据当前字典与key进行哈希值的计算。
4、根据哈希值与当前字典计算哈希表的索引值。
5、根据索引值在哈希表中取出链表,遍历该链表找到key的位置。一般情况,该链表长度为1。
6、当 ht[0] 查找完了之后,再进行了次rehash判断,如果未在rehashing,则直接结束,否则对ht[1]重复345步骤。
到此我们就找到了key在内存的中位置了。

到此,关于“如何在redis数据库中查找key在内存中的位置”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

您可能感兴趣的文档:

--结束END--

本文标题: 如何在redis数据库中查找key在内存中的位置

本文链接: https://www.lsjlt.com/news/61116.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何在redis数据库中查找key在内存中的位置
    这篇文章主要介绍“如何在redis数据库中查找key在内存中的位置”,在日常操作中,相信很多人在如何在redis数据库中查找key在内存中的位置问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,...
    99+
    2022-10-18
  • JS中如何查找数字在数组中的索引位置
    这篇文章主要为大家展示了“JS中如何查找数字在数组中的索引位置”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JS中如何查找数字在数组中的索引位置”这篇文章吧。算...
    99+
    2022-10-19
  • Java 查询 List 中存在的数据在集合中的索引位置
    在 Java 开发中,我们经常需要查询某些数据在 List 集合中的索引位置。如果我们使用传统的方式,比如逐条查询或者使用循环遍历,可能会造成时间复杂度较高的问题。本文将介绍如何使用 Java 优雅地查询 List 集合中存在的数据在集合中...
    99+
    2023-09-25
    java list windows
  • 内存数据库如何在springboot中进行配置
    内存数据库如何在springboot中进行配置?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1.springboot的Maven工程结构2. 首先引入依赖jar包 pom.xm...
    99+
    2023-05-31
    springboot 内存数据库
  • python中如何查找redis里的数据
    python中查找redis数据的方法:1、打开终端;2、输入命令创建命令脚本;3、给脚本添加查找redis数据的代码;4、输入命令执行脚本连接redis即可。具体操作步骤如下:打开终端命令行模式。输入以下命令创建命令脚本。cat yisu...
    99+
    2022-10-19
  • 如何查看sql数据库的存储位置
    要查看SQL数据库的存储位置,可以执行以下步骤:1. 打开SQL Server Management Studio(SSMS)或其他...
    99+
    2023-09-22
    sql数据库
  • 数据在redis中保存的时间怎么设置
    在Redis中,可以使用EXPIRE命令来设置数据的过期时间。EXPIRE命令的语法如下:EXPIRE key seconds其中,...
    99+
    2023-09-05
    redis
  • 如何在MongoDB中实现数据的地理位置查询功能
    如何在MongoDB中实现数据的地理位置查询功能摘要:在现代数据驱动的应用程序中,地理位置查询功能变得越来越重要。本文将介绍如何在MongoDB中实现地理位置查询功能,并提供具体的代码示例。介绍:MongoDB是一个全功能的非关系型数据库,...
    99+
    2023-10-22
    MongoDB 查询功能 地理位置
  • 数据库中如何查找正在执行语句及kill掉
    小编给大家分享一下数据库中如何查找正在执行语句及kill掉,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!--查询Oracle正在...
    99+
    2022-10-18
  • 如何在html中调整内容的位置
    这篇文章给大家介绍如何在html中调整内容的位置,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。html是什么html的全称为超文本标记语言,它是一种标记语言,包含了一系列标签.通过这些标签可以将网络上的文档格式统一,使...
    99+
    2023-06-06
  • 查看数据库中存在触发器的表
    这次在项目中,我们为了做数据库同步,采用了触发器机制,为数据库做迁移时,我们需要获取数据库中那些表使用了触发器,方便制作数据库安装包。 构思: 触发器在MSSQL作为一个对象进行管理,那么我们就可以通过s...
    99+
    2022-10-18
  • Redis数据库如何在Spring Boot中使用
    本篇文章为大家展示了Redis数据库如何在Spring Boot中使用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。redis介绍Redis是目前业界使用最广泛的内存数据存储。相比memcached...
    99+
    2023-05-31
    springboot redis
  • C语言中数据是如何存储在内存中的
    目录前言‍数据类型介绍‍整形数据在内存中存储‍浮点型数据在内存存储前言 在计算机内存中,数据的存储方式都是以0和1的形式存储,也就是二进制的形式,数据是如何向...
    99+
    2022-11-13
  • C++浅析数据在内存中如何存储
    目录一、数据类型二、原码反码补码三、大小端整型提升一、数据类型 数据类型有7种:    char         ...
    99+
    2022-11-13
    C++数据存储 C++数据在内存中存储
  • C语言中数据在内存如何存储
    目录数据类型类型的基本归类整形有符号数和无符号数是否char 等于signed char呢?浮点型构造类型(自定义类型)指针类型空类型整形在内存中的存储原码,反码,补码正整数负整数大...
    99+
    2022-11-12
  • 在Navicat中查看已保存的数据库密码
    将数据库连接导出,导出时勾选密码。 将导出的文件用记事本打开,可以看到root账号下对应的密码已经被加密。 解密。 需要在下面的网址下,运行此PHP代码。 改最下面的密文即可。 网站连接:代码在线运行 - 在线工具 ...
    99+
    2023-09-06
    php mysql
  • 如何在SpringBoot项目中使用redis数据库
    今天就跟大家聊聊有关如何在SpringBoot项目中使用redis数据库,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。REmote DIctionary Server(Redis) ...
    99+
    2023-06-07
  • 如何在redis中限制内存的使用大小
    如何在redis中限制内存的使用大小?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。记录一次生产环境问题排查过程:生产环境部署方式:nginx + uwsgi +...
    99+
    2023-06-15
  • 如何在Linux中配置MariaDB数据库
    这篇文章将为大家详细讲解有关如何在Linux中配置MariaDB数据库,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。什么是Linux系统Linux是一种免费使用和自由传播的类UNIX操作系统...
    99+
    2023-06-07
  • 如何在Django中配置mysql数据库
    这篇文章将为大家详细讲解有关如何在Django中配置mysql数据库,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1、先安装好MySQL的驱动mysqlclient:pip ins...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作