Redis 全景图(1)--- 关于 Redis 的6大模块

news2024/11/25 13:00:41

这是我第一次尝试以长文的形式写一篇Redis的总结文章。这篇文章我想写很久了,只是一直碍于我对Redis的掌握没有那么的好,因此迟迟未动笔。这几天,我一直在看各种不同类型的Redis文章,通过阅读这些文章,引发了我对于Redis这个大知识点的很多思考。我看过的一篇又一篇的文章都帮助着将我脑子里我学过的Redis的零散知识点整合在一起,从而构建一个Redis全局系统观,帮助着我用一个全局的方式看待Redis这个存储系统。接下来,我计划用文字的方式,将我脑子里的Redis蓝图一一描绘出来。

Redis?什么是Redis?Redis就是一个键值对数据库。所以,当别人跟你说Redis的时候,你的脑子里应该立马想到键值对数据库。我一开始以为这就是Redis,其实这并不是,这仅仅是Redis的其中一个模块而已。对于一个完整的Redis,应该是由6大模块组成的:访问模块、索引模块、操作模块、存储模块、高可用集群模块、高可扩展集群模块。

访问模块

访问模块就是我们平时一定会接触的Redis的网络IO线程模型,如图:

Redis是一个典型的client-server模型。首先,客户端先找server-socket建立连接,产生一个事件。IO多路复用器看到这么一个事件就把事件压入队列。文件事件分派器看到队列里有事件就把事件拿出来交给对应的事件处理器进行处理。处理过程是事件处理器会建立一个与客户端socket对应的新socket。只要客户端socket与这个新socket通信,比如说发起了一个请求,新socket就会产生一个事件,然后IO多路复用器就会看到这个事件......重复上面的步骤。

这就是Redis的访问模块。访问模块也就是我们说的网络IO单线程模型。我的理解就是如果我们想访问Redis里面的键值对数据库,底层第一步要做的就是先进入这个键值对数据库,进入的方式就是我上面说的网络IO单线程模型。

索引模块

OK!回到刚才,我刚刚不是说了通过访问模块,我们已经访问到了键值对数据库了吗?那你有没有想过,这个键值对数据库是长什么样子的,又或者说这些键值对在Redis中是怎么存放的,那个画面你想过吗?其实是用一张全局哈希表来存放所有键值对的。这个哈希表由多个哈希桶组成,每个哈希桶存放一个或多个键值对。key很好理解,因为key存放的只是String类型,但是value就不好理解了,value支持很多种数据类型(String、列表、哈希、set、zset)。这些数据类型中,除了String类型之外,其他的几种类型都是数据集合。不过我当时在学习的时候就想象不出这个画面,我就想,一个value能存这么多数据?在我的理解里,我只能理解value是String类型的这种情况(value是String类型的话,value是存一个数据的,这很符合我的印象)。后来,我看到了一篇文章,然后我恍然大悟,原来key-value键值对存放的并不是实际的值,而是指针,这些指针指向数据集合!就像这样:

如果键值对越来越多,越来越多的话,我们就采用rehash,即哈希扩容。这里的哈希扩容是渐进式的,没错,就是你学过的那个渐进式哈希扩容,每次对哈希表进行一次插入或者删除操作,就转移一个桶的数据到新表中,就像这样:

操作模块

OK!通过上面的文字和图片,我们应该大致知道Redis这个键值对数据库里面大概长什么样了,接下来我们来看看操作模块。操作模块其实就是对键值对的一些操作,除了一些最基础的put、get、delete之外,根据value中数据类型的不同,会有不同的操作方法。比如说,假如这个键值对的value的数据类型是列表List,那么针对这种数据类型就提供push进队和pop出队这些对应的操作,就这么简单。

存储模块

这是Redis中最核心的模块了,因为这里知识点最多,但是又不是最难,我花了好多时间去理解这个知识点,理解了之后,感觉有种高山看海,海浪真美的感觉。

存储模块,研究的就是value中的5种数据类型和底层的6种数据结构,就像这个图:

String ——(动态字符串)

String这种数据类型真的是万金油,名字虽然叫String,但是它还可以存文本,数据.....感觉啥都能存。String类型的底层数据结构是动态字符串,动态字符串提供了丰富的String操作命令:增减、排序、查找、计数.....比如我之前实习的公司,它就用String来做计数器,用来记录用户的刷新次数,防止一个用户一直刷新。

List ——(双向链表、压缩链表)

List这种数据类型的底层是双向链表的话,我们其实可以用Redis来做一个轻量的消息队列,具体怎么实现,我之前好像写过一篇文章:能否把 Redis 当做消息队列来用呢?-CSDN博客

而如果List的底层用压缩列表来实现的话,就体现出Redis很快很省。因为压缩列表,压缩嘛,肯定省,而且数据被压缩成连续的,所以查找起来就很快。

Hash ——(压缩列表、哈希表)

Hash这种数据类型的底层实现可以是压缩列表或者是哈希表。如果底层实现是哈希表的话,那么Redis就可以用于缓存,比如说缓存用户的基本信息。怎么缓存用户的基本信息?就是key是用户ID,value是用户的基本信息。

Set ——(哈希表、整数数组)

Set这种数据类型的特点就是无序且不重复。之所有有这种特点,就是因为它底层的数据结构。哈希表是散列的是吧,散列那肯定就无序啊,而哈希表我们都学过不允许存重复的元素,所以数据就不重复。即哈希表是无序不重复的,因此Set也是无序不重复的。如果你用Redis来做消息队列的话,那么这个Set可以帮助保持消息队列的幂等性(即消息不被重复消费)。假如你理解不了这个例子,那换一个更加简单的,你肯定可以理解的例子。有一个数组a[5]=[2,4,2,4,7,6],你用一下Set,直接变成了[2,4,7,6],这你能理解了吧!

ZSet —— (压缩列表、跳跃表)

ZSet 和 Set 很像,只不过比起 Set,ZSet是有序的,就这点不同,其他的感觉大差不差。比如说a[5]=[2,4,2,4,7,6],你用一下ZSet,直接变成了[2,4,6,7]。所以Redis可以用于排行榜。

其实Zset本身并没有什么好讲的,但是ZSet底层用跳跃表这种数据结构来实现,跳跃表就可以好好讲讲了。假如我们用跳跃表这种数据结构来支持ZSet这种数据类型,那么在对ZSet这个有序集合的插入删除查找都是非常快的。跳跃表的原理我口头说不清,我觉得还是展示图片比较实在。我这里不谈跳跃表的插入删除操作,就谈跳跃表的查找操作。

说实话,其实我也不是很理解,暂时有点乱。不过关键的一点就是:通过上一层的元素来确定目标元素所在的区间。

我感觉跳跃表的查找就好像搭地铁一样,快线+慢线互相搭配,从而最快达到目的地。

高可用集群模块

高可用集群模块其实就是主从复制+哨兵机制,还有AOF和RDB技术。事实上感觉面试的AOF和RDB技术这两个问的多一点,而主从复制+哨兵机制问的并不算多,也有可能是主从复制+哨兵机制相对而言比较复杂吧。关于Redis实现高可用的思想和kafka消息队列很像,特别是主从复制+哨兵机制那一块,感觉一模一样哈哈哈。

高可扩展集群模块

这个模块也没什么好讲的,Redis就是通过数据分片来实现高扩展的。这一块感觉面试也问的不多,所以我也仅仅是做了简单的了解,并没有深挖太多。

总结

以上就是我脑图中的Redis的6大模块。假如你想要对键值对进行操作,首先你需要通过访问模块(网络IO单线程模型),然后你才可以进入到Redis的内部。在Redis内部,键值对是怎么存放的呢?其实是通过全局哈希表来存放所有键值对的,我也配了图,这就是索引模块。知道了Redis里面长什么样了,就到了真正对键值对进行操作了,操作模块其实就是一些简单的操作(put、get、delete),加上value中不同数据类型提供的一些不同的操作。最后是存储模块,存储模块研究的问题是value中的值是用什么结构进行存储的,我们研究了5种数据类型以及这5种数据类型背后的6种底层数据结构,我也配了图,顺便说了一下这5种数据类型的一些使用场景。

其实这篇文章还没写完,但是CSDN的文章评分机制是,如果写太长的话,文章评分会降低,然后影响推流,所以我只好拆开来写了。

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

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

相关文章

浅谈AI未来发展趋势与挑战

对于AI大模型未来发展趋势与挑战的个人看法: 1、未来的发展趋势: AI大模型未来发展趋势可以从以下几个关键方面来讨论: 1. 能源与计算效率 绿色计算与节能技术:随着硬件技术的发展,预计未来的AI大模型将进一步降低能…

双向长短期BiLSTM的回归预测-附MATLAB代码

BiLSTM是一种带有正反向连接的长短期记忆网络(LSTM)。 BiLSTM通过两个独立的LSTM层,一个按时间顺序处理输入,另一个按时间倒序处理输入,分别从正向和反向两个方向捕捉输入序列的特征。具体地,正向LSTM按时…

docker 部署 nali 开源 IP 地理信息归属查询软件

前言 早前用到一个小巧开源的 IP 归属地查询软件,官方提供了 Dockerfile,使用了一段时间觉得还不错,非常简单便捷。 部署 docker 启动 由于该项目会在首次启动自动下载 IP 数据库,所以最好通过挂载目录的方式,将数据库目录挂在到本地,避免…

Windows 电脑麦克风 自动启用/禁用 小玩具!

WinMicrophone Windows 系统的 麦克风设备(启用/禁用)切换驱动!它是小巧且快速的,它能够自动的检测并切换麦克风的情况。 您可以在软件包仓库中找到发布版本的exe包,无需安装!其能够大大增大您在Windows中…

elementUI this.$msgbox msgBox自定义 样式自定义 富文本

看这个效果是不是很炫?突出重点提示内容,对于用户交互相当的棒! 下来说说具体实现: let self = this const h = self.$createElement; this.$msgbox({title: null,message: h("p", {style: "margin-top:10px"}, [h("i", {class: "el-i…

CCF-CSP真题202203-1《未初始化警告》(哈希表)

题目背景 一个未经初始化的变量,里面存储的值可能是任意的。因此直接使用未初始化的变量,比如将其赋值给另一个变量,并不符合一般的编程逻辑。代码中出现这种情况,往往是因为遗漏了初始化语句、或是打错了变量名。对代码中使用了…

Go 之 Gin 框架

Gin 是一个 Go (Golang) 编写的轻量级 web 框架,运行速度非常快,擅长 Api 接口的高并发,如果项目的规模不大,业务相对简单,这个时候我们也推荐您使用 Gin,特别适合微服务框架。 简单路由配置 package mai…

算法题->移动零的C语言和JAVA的双指针解法

使用C语言和JAVA代码通过双指针进行解题 题目描述:给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 理解题意:不改变数组中非零元素的顺序,并把0元素放在非零元素后面. 链接: https://leetcode.cn/problems/m…

springboot项目学习-瑞吉外卖(4)续

1.任务 菜品的添加功能(涉及到两张表的数据添加) 2.菜品添加 功能页面如上,该页面有两个注意点 菜品分类:点击菜品分类后,会展示当前已有菜品:这个功能的实现要从category表里查询数据,然后再做展示口味做法配置&#…

2核2G服务器优惠价格轻量61元一年,CVM价格313元15个月

腾讯云2核2G服务器多少钱一年?轻量服务器61元一年,CVM 2核2G S5服务器313.2元15个月,轻量2核2G3M带宽、40系统盘,云服务器CVM S5实例是2核2G、50G系统盘。腾讯云2核2G服务器优惠活动 txybk.com/go/txy 链接打开如下图:…

PCL 计算点与圆的距离(3D)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 3D中的圆可以有圆心、半径以及法线来进行表示,如下图所示: 这里我们假设: Δ = P − C \Delta=P-C Δ

数据结构与算法 循环双链表基本运算与对称算法

一、实验内容 1、实现循环双链表的各种基本运算的算法 (1)初始化循环双链表h (2)依次采用尾插法插入a,b,c,d,e元素 (3)输出循环双链表h; (4)输出循环双链表h长度&am…

【蓝桥杯第十三届省赛】(部分详解)

九进制转十进制 #include <iostream> #include<math.h> using namespace std; int main() {cout << 2*pow(9,3)0*pow(9,2)2*pow(9,1)2*pow(9,0) << endl;return 0; }顺子日期 #include <iostream> using namespace std; int main() {// 请在此…

Python耗时统计-可嵌套-生成Timeline-chrome://tracing/预览

Python耗时统计-可嵌套-生成Timeline-chrome://tracing/预览 一.效果二.代码 本文演示了如何用chrome://tracing查看python嵌套代码的耗时成分 一.效果 二.代码 import time import os import threading import queuedef singleeton(cls):单例instance{}def _singleton(*args,…

Docker Swarm安装部署应用

一、Docker Swarm核心概念 1、什么是Docker Swarm GitHub地址 Docker Swarm 是 Docker 官方推出的容器集群管理工具&#xff0c;基于 Go 语言实现。使用它可以将多个 Docker 主机封装为单个大型的虚拟 Docker 主机&#xff0c;快速打造一套容器云平台。 Docker Swarm 是生产…

使用Flink实现MySQL到Kafka的数据流转换

使用Flink实现MySQL到Kafka的数据流转换 本篇博客将介绍如何使用Flink将数据从MySQL数据库实时传输到Kafka&#xff0c;这是一个常见的用例&#xff0c;适用于需要实时数据connector的场景。 环境准备 在开始之前&#xff0c;确保你的环境中已经安装了以下软件&#xff1a;…

【微服务】OpenFeign+Sentinel集中处理远程调用异常

文章目录 1.微服务基本环境调整1.对10004模块的application.yml调整2.启动nacos以及一个消费者两个提供者3.测试1.输入http://localhost:8848/nacos/index.html 来查看注册情况2.浏览器访问 http://localhost:81/member/nacos/consumer/get/13.结果 2.使用OpenFeign实现微服务模…

wpsword求和操作教程

wpsword求和怎么操作&#xff1a; 1、首先&#xff0c;单纯的数据是无法求和的&#xff0c;所以我们必须要“插入”一个“表格” 2、接着将需要求和的数据填入到表格中。 3、填完后&#xff0c;进入“布局”选项卡。 4、然后打开其中的“公式” 5、在其中选择求和公式“SUM”并…

【C语言】Infiniband驱动mlx4_reset

一、注释 这个 mlx4_reset 函数负责重置 Mellanox 设备。它保存了设备的 PCI 头信息&#xff0c;然后重置了设备&#xff0c;之后还原保存的 PCI 头信息。请注意&#xff0c;该函数是用英文注释的&#xff0c;下面提供中文注释的版本。以下是该函数的流程&#xff1a; 1. 为保…

制造出海,灵途科技助力割草机器人、泳池清洁机器人全方位感知

近年来&#xff0c;越来越多的中国企业开始对外开拓&#xff0c;走向海外市场、挖掘和满足全球消费者的需求。在消费机器人领域&#xff0c;中国企业出海成绩亮眼&#xff01;在2024 ces 和上海AWE展会上&#xff0c;多家机器人公司展示了家用智能割草机器人、泳池清洁机器人的…