当前位置: 首页 > news >正文

redis存储结构

一、整体结构图

二、redisDb结构体

        Redis是一个高性能的键值存储系统,它支持多种类型的数据结构,如字符串、列表、集合、散列等。Redis数据库由多个数据库组成,每个数据库用一个redisDb结构体来表示。

  • dict *dict;

dict指向一个字典结构的指针,字典内部是存储Redis数据库中所有的键值对。键是字符串,值是Redis中的对象类型。字典内部是使用哈希表来实现,这使得 Redis 能够提供高效的查找性能,时间复杂度接近 O(1)。

  • dict *expires;

这个字段同样也是字典结构,存储了键的过期时间。当键被设置了一个过期时间后,这个字典会记录键和它的过期时间。这样,Redis可以自动地删除过期的键。

  • dict *blocking_keys;

这个字段用于记录那些因为某些操作(如列表的BLPOP或BRPOP命令)而阻塞的键和相应的客户端。当有新数据可用时,这些客户端会被唤醒。

  • dict *ready_keys;

这个字段与blocking_keys相对应,它记录了那些已经准备好可以解除阻塞状态的键和相应的客户端。当一个阻塞操作的条件满足时,客户端会从blocking_keys转移到ready_keys。

  • dict *watched_keys;

这个字段记录了被WATCH命令监控的键和相应的客户端。WATCH命令是事务的一部分,用于在事务执行前监控键,如果这些键在MULTI和EXEC之间被修改,事务将不会执行。

  • int id;

这个字段是一个整数,用于唯一标识每个数据库。Redis默认有16个数据库,每个数据库都有一个从0到15的ID。

  • long long avg_ttl;

这个字段记录了数据库中所有键的平均生存时间(Time To Live,TTL)。TTL是一个键在被自动删除前可以存活的时间。avg_ttl可以帮助了解数据的存活周期。

三、dict结构体

        dictEntry 是 Redis 中字典(dict)数据结构的一部分,用于存储键值对。dictEntry 实例会被插入到一个哈希表中。哈希表由数组和链表组成,数组中的每个槽位可以指向一个 dictEntry 或者一个链表的头结点,如果多个键的哈希值映射到同一个槽位,则它们会形成一个链表。字典在 Redis 中扮演着重要角色,它不仅用于存储数据库中的键值对,还用于存储过期时间、阻塞键、监视键等信息。dictEntry 的内部结构如下:

typedef struct dictEntry {void *key;    // 键的指针union {void *val;   // 值的指针uint64_t u64; // 用于存储64位整数的值double d;    // 用于存储浮点数的值} v;struct dictEntry *next; // 指向哈希表中下一个条目的指针,用于解决哈希冲突
} dictEntry;
  • void *key

        这是指向键的指针。在 Redis 中,键通常是字符串,但这里使用 void * 类型是为了保持泛用性,允许键可以是任何类型的数据。

  • union { ... } v:

        这是一个联合体,用于存储值。由于Redis支持多种数据类型,联合体提供了一种方式来存储不同类型的值:

        void *val;:如果值是一个指针类型,比如指向一个更复杂的数据结构,那么可以使用这个字段。

        uint64_t u64;:如果值是一个64位的整数,可以使用这个字段来直接存储整数值。

        double d;:如果值是一个浮点数,可以使用这个字段来存储浮点数值。

  • unsigned long next

        这是指向链表中下一个 dictEntry 的指针。在 Redis 字典的哈希表中,如果两个键的哈希值相同,它们会被链接在同一链表中,next 就是用来维护这种链表结构的。

  • unsigned long hash

        这是一个无符号长整型变量,存储了键的哈希值。哈希值用于快速定位键在字典中的位置,从而加速键的查找过程。

  • unsigned long prev

        在较新版本的 Redis 中,dictEntry 还包含了一个 prev 成员,它是指向链表中前一个 dictEntry 的指针。这使得字典能够更高效地遍历链表,以及在删除元素时更容易找到前一个元素。

四、redisObject结构体

        redisObject是Redis中用于表示各种数据类型的基础结构体。在 Redis 内部,每当你存储一个键值对时,值部分实际上是一个 redisObject 的实例,它封装了数据本身以及关于数据的一些元信息。Redis支持多种数据类型,如字符串、列表、集合、有序集合、散列等。每种数据类型都可以通过redisObject进行抽象和统一管理。以下是redisObject的基本结构和相关说明:

typedef struct redisObject {unsigned type:4;       // 对象类型,4位用于存储类型信息unsigned encoding:4;    // 对象编码,4位用于存储编码信息unsigned lru:LRU_BITS;  // 访问时间戳,用于LRU淘汰算法int refcount;           // 对象的引用计数void *ptr;              // 指向实际数据的指针
} robj;
  • unsigned type

这个成员变量表示对象的类型。在 Redis 中,数据可以是字符串(REDIS_STRING)、列表(REDIS_LIST)、集合(REDIS_SET)、有序集合(REDIS_ZSET)、哈希表(REDIS_HASH)、流(REDIS_STREAM)等类型之一。

  • unsigned encoding

这个变量表示对象的编码方式,即数据如何在内存中存储。不同的编码方式可以节省内存或者提高读写速度。例如,字符串可以是普通的编码(REDIS_ENCODING_RAW),也可以是压缩后的编码(REDIS_ENCODING_EMBSTR 或REDIS_ENCODING_LZF)。列表可以是双向链表(REDIS_ENCODING_LINKEDLIST),也可以是压缩列表(REDIS_ENCODING_ZIPLIST)。

  • unsigned lru:LRU_BITS:

这是一个用于存储对象最近访问时间戳的字段。Redis使用这个字段来实现LRU(最近最少使用)淘汰算法,从而在内存不足时淘汰一些不常用的键。

  • void *ptr

这是指向实际数据的指针。对于字符串来说,这可能是一个指向字符串的指针;对于列表、集合等复合数据类型,这可能是指向数据结构(如链表、跳跃表)的指针。

  • int refcount

这是引用计数,用于跟踪有多少地方引用了这个对象。在 Redis 中,对象可以被共享,引用计数机制帮助 Redis 管理内存,当引用计数降到零时,对象会被销毁。

  • int free

这个成员在某些 Redis 版本中存在,用于在对象被销毁时预留一些空间,以便下次创建类似大小的对象时减少内存分配的开销。

相关文章:

redis存储结构

一、整体结构图 二、redisDb结构体 Redis是一个高性能的键值存储系统,它支持多种类型的数据结构,如字符串、列表、集合、散列等。Redis数据库由多个数据库组成,每个数据库用一个redisDb结构体来表示。 dict *dict; dict指向一个字典结构的指…...

SQL Server 数据误删的恢复

在日常的数据库管理中,数据的误删操作是难以避免的。为了确保数据的安全性和完整性,我们必须采取一些措施来进行数据的备份和恢复。本文将详细介绍如何在 SQL Server 中进行数据的备份和恢复操作,特别是在发生数据误删的情况下。假设我们已经…...

墨烯的C语言技术栈-C语言基础-018

char c; //1byte字节 8bit比特位 int main() { int a 10; //向内存申请四个字节,存储10 &a; //取地址操作符 return 0; } 每个字节都有地址 而a的地址就是它第一个字节的地址 要先开始调试才可以查看监控和查看内存 左边是地址 中间是内存中的数据 最后面的是…...

C端与B端 - 第一弹 - 理解和区分C端与B端软件开发

作者:逍遥Sean 简介:一个主修Java的Web网站\游戏服务器后端开发者 主页:https://blog.csdn.net/Ureliable 觉得博主文章不错的话,可以三连支持一下~ 如有疑问和建议,请私信或评论留言! 前言 在软件开发领域…...

穿越多元宇宙的.NET:一场跨平台的星际旅行

概述 在软件开发的浩瀚宇宙中,.NET无疑是一颗耀眼的恒星,散发着多平台开发的光芒。从单一的.NET Framework出发,我们如今已拥有一个多元化的.NET宇宙,每个变体都是一个独特的星球,拥有自己的生态系统和生存法则。本文将…...

Python自学第五天

# 嵌套 字典嵌套字典 # 字典列表 now {pet:cat,color:black} now1 {pet:cat,color:pipe} wq [now,now1] # 这里是中括号 不是花括号 花括号打印不出来 for ff in wq:print(ff) # 创建20个外星人 打印前三个 并且显示一共创建了多少个外星人 now [] for wq in range(20):# 这…...

Cookie-Monster:一款针对Web浏览器的安全分析与数据提取工具

关于Cookie-Monster Cookie-Monster是一款针对常见Web浏览器的安全分析与数据提取工具,该工具可以帮助广大研究人员提取并分析Edge、Chrome和Firefox浏览器中的Cookie数据。 Cookie-Monster适用于红队和蓝队成员,能够提取WebKit主密钥,找到具…...

C语言的结构体

结构体定义 结构体指针...

C语言 写一个函数days,实现某日在本年中是第几天计算。

写一个函数days, 【定义一个结构体变量(包括年、月、日)。计算该日在本年中是第几天,注意闰年问题&#xff08;即将闰年情况包含在内&#xff09;】 由主函数将年、月、日传递给days函数,计算后将日子数传回主函数输出。 ​#include <stdio.h>typedef struct {int yea…...

2-50 基于matlab的遗传模拟退火算法的聚类算法

基于matlab的遗传模拟退火算法的聚类算法&#xff0c;以模糊K-均值聚类算法为基础&#xff0c;对各样本的聚类中心进行优化&#xff0c;输出聚类可视化结果。聚类类别数可自由输入。程序已调通&#xff0c;可直接运行。 2-50 遗传模拟退火算法的聚类算法 - 小红书 (xiaohongshu…...

电脑屏幕录制软件,分享4款(2024最新)

在今天&#xff0c;我们的电脑屏幕成为了一个多彩多姿的窗口。通过它我们可以浏览网页、观看视频、处理文档、进行游戏……有时&#xff0c;我们想要记录下这些精彩瞬间&#xff0c;与朋友分享&#xff0c;或者作为教程留存&#xff0c;这时&#xff0c;电脑屏幕录制就显得尤为…...

机械学习—零基础学习日志(高数16——函数极限性质)

零基础为了学人工智能&#xff0c;真的开始复习高数 这里我们继续学习函数极限的性质。 局部有界性 充分条件与必要条件 极限存在是函数局部有界的充分条件。什么是充分条件&#xff0c;什么是必要条件呢&#xff1f;我这里做了一点小思考&#xff0c;和大家分享&#xff0c…...

初识c++——list

一、list 1、list结构 c中list为双向带头循环列表&#xff1a; 二、list接口 1、构造 using namespace std; #include<iostream> #include<list> #include<vector> int main() {list<int> lt; //构造空的listlist<int> lt1(10, 1); //构造的l…...

angular入门基础教程(八)表单之双向绑定

绑定表单数据 为了让表单使用 Angular 的特性实现数据绑定&#xff0c;需要导入 FormsModule。 这个比 vue 要繁琐点&#xff0c;不复杂&#xff0c;但是比 react 的自己手动实现要方便&#xff0c;ng 帮我们实现了双向绑定 import { Component } from "angular/core&qu…...

【C++】C++中的find方法介绍

目录 一.find方法基本用法 1.查找字符 2.查找子字符串 3.查找子字符串&#xff08;从指定位置开始&#xff09; 4.查找字符范围 5.查找不包含特定字符的范围 二.使用string::npos返回无效位置 三.总结 在C中&#xff0c; std::string 类的 find 成员函数用于查找子字…...

JVM—HotSpot虚拟机对象探秘

1、对象的创建 对象只是普通对象&#xff0c;不包括数组和Class对象 类加载检查&#xff1a;当虚拟机遇到字节码New指令时&#xff0c;先检查这个指令的参数是否可以在常量池定位到一个类的符号引用&#xff0c;并且加载这个符号引用代表的类是否被加载、解析、验证、初始化过。…...

AI测试:人工智能模型的核心测试指标,分类判别、目标检测、图像分割、定量计算分别有哪些指标?

在前面的人工智能测试技术系列文章中&#xff0c;我们详细介绍了人工智能测试的技术方法和实践流程。在了解人工智能测试方法后&#xff0c;我们需要进一步学习和研究如何衡量这些方法的有效性&#xff0c;即人工智能模型测试指标的选择。测试指标的选择主要取决于模型的类型和…...

探索LLM世界:新手小白的学习路线图

随着人工智能的发展&#xff0c;语言模型&#xff08;Language Models, LLM&#xff09;在自然语言处理&#xff08;NLP&#xff09;领域的应用越来越广泛。对于新手小白来说&#xff0c;学习LLM不仅能提升技术水平&#xff0c;还能为职业发展带来巨大的机遇。那么&#xff0c;…...

Linux基础命令大全 持续更新中......

最近重新学习了linux基础知识&#xff0c;并整理出了以下内容&#xff0c;以供参考 最近几日后续会持续更新内容哦 用户管理 加括号的代表可以不写 useradd &#xff08;参数选项&#xff09; 用户名 添加新用户 passwd &#xff08;参数选项&#xff09; 用户名 用…...

CPU的起源与发展历程

CPU的起源与发展历程 文章目录 CPU的起源与发展历程前言指令概念电子管&#xff08;真空管&#xff09;体系结构冯诺依曼架构哈佛架构 晶体管集成电路指令集与微架构微处理器x86架构CISC与RISC的提出MIPS架构ARM架构RISC-V架构FPGA 总结 前言 ​ 从古至今&#xff0c;人类为了…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...

基于Java+VUE+MariaDB实现(Web)仿小米商城

仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意&#xff1a;运行前…...

python爬虫——气象数据爬取

一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用&#xff1a; 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests&#xff1a;发送 …...