返回顶部
首页 > 资讯 > 数据库 >如何在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://lsjlt.com/news/61116.html(转载时请注明来源链接)

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

猜你喜欢
  • 如何在redis数据库中查找key在内存中的位置
    这篇文章主要介绍“如何在redis数据库中查找key在内存中的位置”,在日常操作中,相信很多人在如何在redis数据库中查找key在内存中的位置问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,...
    99+
    2024-04-02
  • 如何查找Discuz数据库所在位置?
    如何查找Discuz数据库所在位置? Discuz是一款常见的开源论坛系统,许多网站都在使用这款系统来搭建在线社区。在开发和维护过程中,我们可能需要查找Discuz数据库所在位置以方便...
    99+
    2024-03-10
    - 数据库 - 位置 - discuz 数据丢失
  • linux如何在Whois数据库中查找
    ...
    99+
    2024-04-02
  • JS中如何查找数字在数组中的索引位置
    这篇文章主要为大家展示了“JS中如何查找数字在数组中的索引位置”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JS中如何查找数字在数组中的索引位置”这篇文章吧。算...
    99+
    2024-04-02
  • redis的数据存在什么位置
    redis的数据是存在内存里吗?首先要明白redis是一个数据库,redis是一个内存数据库,所有数据基本上都存在于内存当中,会定时以追加或者快照的方式刷新到硬盘中。      ...
    99+
    2024-04-02
  • 内存数据库如何在springboot中进行配置
    内存数据库如何在springboot中进行配置?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1.springboot的Maven工程结构2. 首先引入依赖jar包 pom.xm...
    99+
    2023-05-31
    springboot 内存数据库
  • Java 查询 List 中存在的数据在集合中的索引位置
    在 Java 开发中,我们经常需要查询某些数据在 List 集合中的索引位置。如果我们使用传统的方式,比如逐条查询或者使用循环遍历,可能会造成时间复杂度较高的问题。本文将介绍如何使用 Java 优雅地查询 List 集合中存在的数据在集合中...
    99+
    2023-09-25
    java list windows
  • 怎么在sql数据库中查找数据
    要在SQL数据库中查找数据,可以使用SELECT语句。以下是使用SELECT语句的一些常见用法:1. 查询所有数据:```S...
    99+
    2023-10-08
    sql数据库
  • 如何查看sql数据库的存储位置
    要查看SQL数据库的存储位置,可以执行以下步骤:1. 打开SQL Server Management Studio(SSMS)或其他...
    99+
    2023-09-22
    sql数据库
  • python中如何查找redis里的数据
    python中查找redis数据的方法:1、打开终端;2、输入命令创建命令脚本;3、给脚本添加查找redis数据的代码;4、输入命令执行脚本连接redis即可。具体操作步骤如下:打开终端命令行模式。输入以下命令创建命令脚本。cat yisu...
    99+
    2024-04-02
  • redis作缓存需要在数据库中存入数据吗
    使用redis作为缓存,数据还需要存入数据库中吗?    我的答案是:redis只是缓存,不是数据库如mysql,所以redis中有的数据库,mysql中一定有。用户请求先去请求redi...
    99+
    2024-04-02
  • C语言中数据是如何存储在内存中的
    目录前言‍数据类型介绍‍整形数据在内存中存储‍浮点型数据在内存存储前言 在计算机内存中,数据的存储方式都是以0和1的形式存储,也就是二进制的形式,数据是如何向...
    99+
    2024-04-02
  • C语言中数据在内存如何存储
    目录数据类型类型的基本归类整形有符号数和无符号数是否char 等于signed char呢?浮点型构造类型(自定义类型)指针类型空类型整形在内存中的存储原码,反码,补码正整数负整数大...
    99+
    2024-04-02
  • C++浅析数据在内存中如何存储
    目录一、数据类型二、原码反码补码三、大小端整型提升一、数据类型 数据类型有7种:    char         ...
    99+
    2022-11-13
    C++数据存储 C++数据在内存中存储
  • 如何在html中调整内容的位置
    这篇文章给大家介绍如何在html中调整内容的位置,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。html是什么html的全称为超文本标记语言,它是一种标记语言,包含了一系列标签.通过这些标签可以将网络上的文档格式统一,使...
    99+
    2023-06-06
  • Redis数据库如何在Spring Boot中使用
    本篇文章为大家展示了Redis数据库如何在Spring Boot中使用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。redis介绍Redis是目前业界使用最广泛的内存数据存储。相比memcached...
    99+
    2023-05-31
    springboot redis
  • 数据库中如何查找正在执行语句及kill掉
    小编给大家分享一下数据库中如何查找正在执行语句及kill掉,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!--查询Oracle正在...
    99+
    2024-04-02
  • 如何在MongoDB中实现数据的地理位置查询功能
    如何在MongoDB中实现数据的地理位置查询功能摘要:在现代数据驱动的应用程序中,地理位置查询功能变得越来越重要。本文将介绍如何在MongoDB中实现地理位置查询功能,并提供具体的代码示例。介绍:MongoDB是一个全功能的非关系型数据库,...
    99+
    2023-10-22
    MongoDB 查询功能 地理位置
  • 如何在Linux系统中查找不存在的PHP进程
    标题:如何在Linux系统中查找不存在的PHP进程 在Linux系统中,查找特定的PHP进程需要使用一些特定的命令和技巧。有时候,我们可能需要查找那些已经不存在但仍然占据系统资源的PH...
    99+
    2024-04-02
  • 如何查看redis数据占用的内存
    这篇文章主要介绍如何查看redis数据占用的内存,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体查看步骤如下:redis-cli auth 密码info# Memoryused_m...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作