【Redis】深入理解 Redis 常用数据类型源码及底层实现(1.结构与源码概述)

news2024/12/25 12:27:05

在文章【Redis】不卡壳的 Redis 学习之路:从十大数据类型开始入手中我们介绍了Redis常用的10大数据类型,这10大数据类型可并不是直接在底层通过代码实现的,而是通过不同的底层数据结构组合起来的,这篇我们介绍下Redis常用数据类型的底层数据结构( ̄∇ ̄)/

Redis数据类型的底层数据结构

  • SDS动态字符串
  • 双向链表
  • 压缩列表ziplist
  • 哈希表hashtable
  • 跳表skiplist
  • 整数集合intset
  • 快速列表quicklist
  • 紧凑列表listpack

在哪里看Redis源码

网站地址

github.com/redis/redis

Redis根目录下src文件夹📁

Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的API。

参考书籍推荐

源码概况

Github官网

github.com/redis/redis

Redis基本的数据结构(骨架)

从官网可以看到对于部分关键的.c文件的介绍,最重要的两个:dict.cobject.c

Redis数据库的实现

  • 数据库的底层实现db.c
  • 持久化rdb.c和aof.c

Redis服务端和客户端实现

  • 事件驱动ae.c和ae_epoll.c
  • 网络连接anet.c和networking.c
  • 服务端程序server.c
  • 客户端程序redis-cli.c

其他

  • 主从复制replication.c
  • 哨兵sentinel.c
  • 集群cluster.c
  • 其他数据结构,如hyperloglog.c、geo.c等
  • 其他功能,如pub/sub、Lua脚本

详解字典数据库K-V键值对

键值对是怎样实现的

Redis是key-value存储系统

  • key一般都是string类型的字符串对象

  • value则为Redis对象(redisObject)

    • 可以是字符串对象
    • 也可以是集合数据类型的对象,比如List对象、Hash对象、Set对象和Zset对象

10大类型说明

传统的5大类型
  • String
  • List
  • Hash
  • Set
  • ZSet
新的5大类型
  • bitmap -> 实质String
  • hyperLogLog -> 实质String
  • GEO -> 实质Zset
  • Stream -> 实质Stream
  • bitfield -> 具体看key

在Redis的逻辑中,服务(redisServer)启动加载数据库(redisDb),然后去读取字典(dict),然后去找哈希(dictht),就像Java中的那句——一切皆对象,在Redis中一切皆K-V(dict字典)。

Redis是由C语言编写的,想要深入了解Redis的数据结构,就不得不简单介绍下C语言的文件类型📃(因为接下来我们需要在一堆源码中找到我们需要的文件)和struct结构体(学习数据类型的底层实现)。

  • 在C语言中,源代码文件通常以“.c”作为后缀名,以表示该文件包含C语言源代码。例如,如果编写一个名为“qin.c”的程序,那么它的源代码将保存在名为“qin.c”的文件中。C语言的头文件通常以“.h”作为后缀名,库文件通常以“.lib”或“.a”作为后缀名,可执行文件通常以“.exe”或“.out”作为后缀名。
  • C语言的结构体,需要使用 struct 语句来定义,struct 语句定义了一个包含多个成员的新的数据类型,struct 语句的格式如下:

struct [structure tag] { member definition; member definition; ... member definition; } [one or more structure variables];

structure tag 是可选的,每个 member definition 是标准的变量定义,在结构定义的末尾,最后一个分号之前,可以指定一个或多个结构变量(是可选的),举个🌰方便大家理解:

struct Books { char title[50]; char author[50]; int book_id; } book;

了解这些基础的内容以后,接下来我们就开始深入到Redis数据结构底层的C语言进行源码分析

( ̄∇ ̄)/🎉~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1304502.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多域名和通配符SSL证书的区别

域名SSL证书和通配符SSL证书都是SSL数字证书中用一张证书保护多个域名站点的证书产品,这两种类型的SSL数字证书各自有各自的特色,今天就随SSL盾小编了解多域名SSL证书和通配符SSL证书的区别。 1.保护的域名类型不同:多域名SSL证书默认保护3-…

从视频中提取图片,轻松制作专属视频封面

你是否曾经为如何制作一个吸引人的视频封面而烦恼?现在,我们将向你展示如何从视频中提取图片,并轻松制作专属的视频封面。无论你是视频编辑新手,还是经验丰富的专业人士,这个技巧都能够帮助你快速提升你的视频品质。 …

外包干了3年,技术退步太明显了。。。。。

先说一下自己的情况,本科生生,18年通过校招进入武汉某软件公司,干了差不多3年的功能测试,今年国庆,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能…

4fiddler抓包工具的使用

一、定义 1.1 抓包的定义 说明:客户端向服务器发送请求以及服务器响应客户端的请求,都是以数据包来传递的。 抓包(packet capture):通过工具拦截客户端与服务器交互的数据包 1.2 fiddler的介绍 Fiddler是一个http协议调试代理工具&#…

黄油市场调研:预计2028年将达到717亿美元

黄油富含矿物质和维生素,奶油主要为脂肪和蛋白质组成,黄油主要用于涂抹面包和煎牛排等,随着西餐认可度提升,国内需求持续上行。黄油营养成分为乳制品之首,脂肪含量更高。 黄油主要用于涂抹面包和煎牛排等,随…

二叉树的所有路径

257. 二叉树的所有路径 - 力扣(LeetCode) 题目描述 给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点。 样例输入 示例 1: 输入:root […

以太坊:前世今生与未来

一、引言 以太坊,这个在区块链领域大放异彩的名字,似乎已经成为了去中心化应用(DApps)的代名词。从初期的萌芽到如今的繁荣发展,以太坊经历了一段曲折而精彩的旅程。让我们一起回顾一下以太坊的前世今生,以…

protobuf基础学习

部分内容出自:https://blog.csdn.net/baidu_32237719/article/details/99723353 proto文件来预先定义的消息格式。数据包是按照proto文件所定义的消息格式完成二进制码流的编码和解码。proto文件,简单地说,就是一个消息的协议文件&#xff0c…

【WinRAR】为什么右键没有压缩选项?

我们安装了WinRAR之后想要压缩文件,但是右键点击文件之后发现并没有WinRAR压缩选项,这应该如何设置才能出现右键带有压缩选项呢?方法如下: 首先打开WinRAR,在上面功能中点击选项 – 设置 然后我们在设置界面中切换到集…

Guardrails for Amazon Bedrock 基于具体使用案例与负责任 AI 政策实现定制式安全保障(预览版)

作为负责任的人工智能(AI)战略的一部分,您现在可以使用 Guardrails for Amazon Bedrock(预览版),实施专为您的用例和负责任的人工智能政策而定制的保障措施,以此促进用户与生成式人工智能应用程…

parser

"typescript-eslint/parser": "5.56.0", "vue-eslint-parser": "9.1.0", 代码来自ruoyi-plus vue-eslint-parser是一个专门用于解析Vue.js单文件组件(.vue文件)的ESLint插件。ESLint是一个用于检查和修复Java…

陪诊软件开发|北京陪诊系统功能介绍

随着互联网技术的不断发展,医疗行业也日新月异。在这个数字化时代,陪诊软件成为了重要的创新工具,为患者和医生提供了全新的医疗服务体验。本文将探讨陪诊软件开发的关键要点及其功能,为您揭示医疗行业的又一面向未来的重要突破口…

【Linux】线程的概念理解,从感知理解到全面深入

1.初始线程概念 在伟大的”计算机哲学“操作系统这本书中,一般给出线程的概念为:是在进程内部运行的一个执行分支(执行流),属于进程的一部分,粒度要比进程更加细腻和轻量化。大家对这一概念一看而过既可以…

高频交易双柜台系统如何开通?

市面上的量化系统很多,快速通道也很多,但是可以满足双柜台系统的这个确实是很少的。能满足双柜台系统的,那恐怕只有华锐双柜台系统可以!我们先简单来了解下双柜台系统: 华锐双柜台系统(SST)是…

外贸行业怎么跟进客户?

外贸行业怎么跟进客户? 建立一个完善的跟进系统需要人性化关怀和高效的技术支持。 人性化关怀是指以客户为中心,关注客户的需求和情感,建立真诚、个性化的关系;高效的技术支持则是指利用技术和工具来提高跟进效率和服务质量&#…

QT用户管理效果预览

用户管理效果 QT 用户管理 GITHUB网站 QT版本 CMakeList.txt find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Sql REQUIRED) target_link_libraries(tableView PRIVATE Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::Sql)GitHub代码获取链接 GitHub代码获取链接

《码农的噩梦与修电脑的奇幻之旅》

故事从一个充满梦想的码农学习计算机编程开始。他对编写程序充满了热情,认为自己就像是一位能够编织魔法的巫师,能够创造出炫酷的虚拟世界。 然而,这个充满幻想的故事在码农入门的第一天就遭遇了突如其来的挫折。电脑故障了!所有…

专栏十五:omicverse在单细胞分析中的实际使用体验和小改动

写一些自己的理解吧,一些小步骤,正在更新中。。。 安装 原作者写的很清楚了 大部分直接抄 个别地方:去选择下载适合自己的pytorch版本PyTorch, 比如我的是cuda12,下载命令实际是 pip3 install torch torchvision torchaudio 查看cuda版本命令 nvidia-smi 当然还有个命…

【GIS】1.什么是空间分析?

新坑!!! 本系列文章主要参考CHICAGO大学的空间数据科学中心的相关课程( ̄∇ ̄)/感谢分享~ 什么是空间分析 空间分析不仅仅是指做一个地图这么简单,而是为这些位置空间添加实际的值,并…

thinkphp商城系统之商品模块表设计

5.后台商品模块 商品模块是商城项目最核心的模块,也是最复杂的。如果说你能掌握这个模块,那对你来说绝对是获益匪浅,这模块会涉及到以下知识点: 聊聊电商领域中的SPU和SKU表的设计,告诉你为什么要这么设计复杂的查询…