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

redis基本架构:一个键值数据库包含什么?(这篇文章主要是一个引导的作用)

我们设计一个简单的smpliekv数据库,来体验简直数据库包含什么

体来说,一个键值数据库包括了访问框架、索引模块、操作模块和存储模块四部分(见
下图)。接下来,我们就从这四个部分入手,继续构建我们的 SimpleKV。

 

采用什么样的访问模式呢?

访问模式通常有两种:一种是通过函数库调用的方式供外部应用使用,比如,上图中的
libsimplekv.so,就是以动态链接库的形式链接到我们自己的程序中,提供键值存储功能;
另一种是通过网络框架以 Socket 通信的形式对外提供键值对操作,这种形式可以提供广
泛的键值存储服务。在上图中,我们可以看到,网络框架中包括 Socket Server 和协议解

不同的键值数据库服务器和客户端交互的协议并不相同,我们在对键值数据库进行二次开
发、新增功能时,必须要了解和掌握键值数据库的通信协议,这样才能开发出兼容的客户
端。
实际的键值数据库也基本采用上述两种方式,例如,RocksDB 以动态链接库的形式使用,
而 Memcached 和 Redis 则是通过网络框架访问。后面我还会给你介绍 Redis 现有的客户
端和通信协议。
通过网络框架提供键值存储服务,一方面扩大了键值数据库的受用面,但另一方面,也给
键值数据库的性能、运行模型提供了不同的设计选择,带来了一些潜在的问题。

举个例子,当客户端发送一个如下的命令后,该命令会被封装在网络包中发送给键值数据
库:

 PUT hello world
键值数据库网络框架接收到网络包,并按照相应的协议进行解析之后,就可以知道,客户
端想写入一个键值对,并开始实际的写入流程。此时,我们会遇到一个系统设计上的问
题,简单来说,就是网络连接的处理、网络请求的解析,以及数据存取的处理,是用一个
线程、多个线程,还是多个进程来交互处理呢?该如何进行设计和取舍呢?我们一般把这
个问题称为 I/O 模型设计。不同的 I/O 模型对键值数据库的性能和可扩展性会有不同的影
响。

举个例子,如果一个线程既要处理网络连接、解析请求,又要完成数据存取,一旦某一步
操作发生阻塞,整个线程就会阻塞住,这就降低了系统响应速度。如果我们采用不同线程
处理不同操作,那么,某个线程被阻塞时,其他线程还能正常运行。但是,不同线程间如
果需要访问共享资源,那又会产生线程竞争,也会影响系统效率,这又该怎么办呢?所
以,这的确是个“两难”选择,需要我们进行精心的设计。

你可能经常听说 Redis 是单线程,那么,Redis 又是如何做到“单线程,高性能”的呢?

这个问题以后再说

如何定位键值对的位置?

索引的类型有很多,常见的有哈希表、B+ 树、字典树等。不同的索引结构在性能、空间消
耗、并发控制等方面具有不同的特征。如果你看过其他键值数据库,就会发现,不同键值
数据库采用的索引并不相同,例如,Memcached 和 Redis 采用哈希表作为 key-value 索
引,而 RocksDB 则采用跳表作为内存中 key-value 的索引。
一般而言,内存键值数据库(例如 Redis)采用哈希表作为索引,很大一部分原因在于,
其键值数据基本都是保存在内存中的,而内存的高性能随机访问特性可以很好地与哈希表
O(1) 的操作复杂度相匹配。
SimpleKV 的索引根据 key 找到 value 的存储位置即可。但是,和 SimpleKV 不同,对于
Redis 而言,很有意思的一点是,它的 value 支持多种类型,当我们通过索引找到一个
key 所对应的 value 后,仍然需要从 value 的复杂结构(例如集合和列表)中进一步找到
我们实际需要的数据,这个操作的效率本身就依赖于它们的实现结构。
Redis 采用一些常见的高效索引结构作为某些 value 类型的底层数据结构,这一技术路线
为 Redis 实现高性能访问提供了良好的支撑

不同操作的具体逻辑是怎样的?

SimpleKV 的索引模块负责根据 key 找到相应的 value 的存储位置。对于不同的操作来
说,找到存储位置之后,需要进一步执行的操作的具体逻辑会有所差异。SimpleKV 的操
作模块就实现了不同操作的具体逻辑:

对于 GET/SCAN 操作而言,此时根据 value 的存储位置返回 value 值即可;
对于 PUT 一个新的键值对数据而言,SimpleKV 需要为该键值对分配内存空间;
对于 DELETE 操作,SimpleKV 需要删除键值对,并释放相应的内存空间,这个过程由
分配器完成。

如何实现重启后快速提供服务?

impleKV 虽然依赖于内存保存数据,提供快速访问,但是,我也希望 SimpleKV 重启后
能快速重新提供服务,所以,我在 SimpleKV 的存储模块中增加了持久化功能

 从这张对比图中,我们可以看到,从 SimpleKV 演进到 Redis,有以下几个重要变化:

 

相关文章:

redis基本架构:一个键值数据库包含什么?(这篇文章主要是一个引导的作用)

我们设计一个简单的smpliekv数据库,来体验简直数据库包含什么 体来说,一个键值数据库包括了访问框架、索引模块、操作模块和存储模块四部分(见 下图)。接下来,我们就从这四个部分入手,继续构建我们的 Simpl…...

HIS信息管理系统 HIS源码

HIS(Hospital Information System)是覆盖医院所有业务和业务全过程的信息管理系统。 HIS系统以财务信息、病人信息和物资信息为主线,通过对信息的收集、存储、传递、统计、分析、综合查询、报表输出和信息共享,及时为医院领导及各…...

微信小程序之富文本那些事

文章目录 前言一、video的处理二、img的处理总结 前言 小程序中使用富文本编辑器,由于rich-text受限 部分富文本内容无法渲染或排版错乱。以img和video为例,处理起来让人头疼。网上各种长篇大论,实际上没有任何帮助。接下来我们就一起聊聊im…...

kaggle新赛:RSNA 2023 腹部创伤检测大赛赛题解析(CV)

赛题名称:RSNA 2023 Abdominal Trauma Detection 赛题链接: https://www.kaggle.com/competitions/rsna-2023-abdominal-trauma-detection 赛题背景 腹部钝力创伤是最常见的创伤性损伤类型之一,最常见的原因是机动车事故。腹部创伤可能导致…...

【JavaEE初阶】Servlet (二) Servlet中常用的API

文章目录 HttpServlet核心方法 HttpServletRequest核心方法 HttpServletResponse核心方法 Servlet中常用的API有以下三个: HttpServletHttpServletRequestHttpServletResponse HttpServlet 我们写 Servlet 代码的时候, 首先第一步就是先创建类, 继承自 HttpServlet, 并重写其…...

redis 存储原理与数据模型

文章目录 一、redis的存储结构1.1 存储结构1.2 存储转换 二、字典(dict)实现2.1 数据结构2.2 哈希冲突2.3 扩容2.4 缩容2.5 渐进式rehash2.6 scan 命令2.7 expire机制 三、跳表(skiplist)实现3.1 理想跳表3.2 redis跳表 一、redis的存储结构 1.1 存储结构 1.2 存储转换 二、字…...

初识mysql数据库之事务的隔离性

目录 一、理解隔离性 二、隔离级别 1. 不同的隔离级别的简单概述 2. 查看隔离级别 2.1 查看全局隔离级别 2.2 查看会话隔离级别 3. 设置隔离界别 4. 读未提交(Read Uncommitted) 4.1 读未提交测试 5. 读提交(Read Committed&#x…...

今天学学消息队列RocketMQ:消息类型

RocketMQ支持的消息类型有三种:普通消息、顺序消息、延时消息、事务消息。以下内容的代码部分都是基于rocketmq-spring-boot-starter做的。 普通消息 普通消息是一种无序消息,消息分布在各个MessageQueue当中,以保证效率为第一使命。这种消息…...

小程序附件下载并预览功能

一、实现的功能: 1、word、excel、图片等实现下载并预览 2、打开文件后显示文件名称 二、代码: // 判断文件类型whatFileType(url) {let sr url.lastIndexOf("."); // 最后一次出现的位置let fileType url.substr(sr 1); // 截取url的…...

数据库缓存服务——NoSQL之Redis配置与优化

目录 一、缓存概念 1.1 系统缓存 1.2 缓存保存位置及分层结构 1.2.1 DNS缓存 1.2.2 应用层缓存 1.2.3 数据层缓存 1.2.4 硬件缓存 二、关系型数据库与非关系型数据库 2.1 关系型数据库 2.2 非关系型数据库 2.3 关系型数据库和非关系型数据库区别: 2.4 非…...

【雕爷学编程】MicroPython动手做(13)——掌控板之RGB三色灯

知识点:什么是掌控板? 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片,支持WiFi和蓝牙双模通信,可作为物联网节点,实现物联网应用。同时掌控板上集成了OLED…...

.Net Core上传组件_.Net Core图片上传组件_Uploader7.0

一、.Net Core上传组件Uploader7.0简介 1.当前版本v7.0,前端框架丰富升级 2.前端jquery框架封装,cover.js, 腾讯云cos-js-sdk-v5.min.js 3.后端,支持Asp.Net 和 Asp.Net Core 矿建 4.数据传输模式支持:WebScoket 、Ajax、Form 模式上传到…...

Exadata磁盘损坏导致磁盘组无法mount恢复(oracle一体机磁盘组异常恢复)---惜分飞

Oracle Exadata客户,在换盘过程中,cell节点又一块磁盘损坏,导致datac1磁盘组(该磁盘组是normal方式冗余)无法mount Thu Jul 20 22:01:21 2023 SQL> alter diskgroup datac1 mount force NOTE: cache registered group DATAC1 number1 incarn0x0728ad12 NOTE: ca…...

左值引用与右值引用的区别?右值引用的意义?

左值引用与右值引用的区别?右值引用的意义? 1 区别1.1 功能差异1.2 左值引用1.3 右值引用1.3.1 实现移动语义1.3.2 实现完美转发 2 引用的作用3 区分左值和右值3.1 左值3.2 右值 1 区别 左值引用是对左值的引用;右值引用是对右值的引用。 &…...

2023年深圳杯数学建模D题基于机理的致伤工具推断

2023年深圳杯数学建模 D题 基于机理的致伤工具推断 原题再现: 致伤工具的推断一直是法医工作中的热点和难点。由于作用位置、作用方式的不同,相同的致伤工具在人体组织上会形成不同的损伤形态,不同的致伤工具也可能形成相同的损伤形态。致伤…...

Vue的router学习

,前端路由的核心是什么呢?改变URL,但是页面不进行整体的刷新。 vue-router是基于路由和组件的  路由用于设定访问路径, 将路径和组件映射起来;  在vue-router的单页面应用中, 页面的路径的改变就是组件的切换; 使用router需要…...

Inpaint Anything: 自动化抹除视频元素

自动化抹除视频元素 不用逐帧抠图,直接SAM Tracking Video Inpainting就能实现自动化抹除奔跑吧idol。 https://github.com/geekyutao/Inpaint-Anything 目录 网站演示参考文献 网站 https://huggingface.co/spaces/InpaintAI/Inpaint-Anything 演示 原理就是&a…...

Flutter 开发者工具 Android Studio 开发Flutter应用

Flutter 开发者工具 在 Android Studio 开发Flutter应用 🔥 Android Studio 版本更新 🔥 Android Studio Check for Update Connection failed ​ 解决方案 如果是运行的是32位的android studio需要在andriod studio的启动目录下找到studio.exe.vmoptio…...

后端byte[]传给前端接收默认变成string字符串

创建时间:2023.7.28 建议:最好直接用字符串,我是没办法要求保密,存取都是字符串,程序里面是byte数组 既然他到前端会转换成字符串那么就是被转码了 那我们反向转码就好了 这是在后端处理,反正前端也是乱…...

UE5 动画蓝图模板(Animation Blueprint Template)

文章目录 前言准备内容创建动画蓝图使用动画蓝图模板示例1示例2总结前言 本文基于虚幻5.2版本介绍制作动画蓝图模板,本教程要求使用虚幻5.0及以上版本。 准备内容 使用第三人称游戏内容包,已添加可忽略。 选择第三人称游戏,添加到项目。 创建动画蓝图 在 Characters 文件…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

C++ 基础特性深度解析

目录 引言 一、命名空间(namespace) C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用(reference)​ C 中的引用​ 与 C 语言的对比​ 四、inline(内联函数…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

SpringCloudGateway 自定义局部过滤器

场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

Map相关知识

数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...