Redis 全景图(2)---- 关于 Redis 的三“高”

news2024/11/25 8:19:55

前言

我们继续写第一篇文章没写完的。其实我也不想将我写的一篇 Redis 文章分成几篇中短文来写,但是没办法,我一次写个1万字,会限流,所以将就一下吧。

上篇文章我用了 Redis 的6大模块这个思路来描绘我脑子中的 Redis。其实这6大模块已经包含了我知道的所有知识了。只不过上篇文章,我对 Redis 的5种数据类型和底层的6种数据结构详细描述了很多字,但是对于一些知识就一笔带过,所以这篇文章,我会详细的讲一下上篇文章讲的比较简略的地方。

Redis的三“高”

我感觉 Redis 的三高就是学习 Redis 的主线。因为 Redis 是一个庞大的、功能极其丰富的键值对数据库,关于 Redis 的知识实在是太多了,我之前学的时候就是学的很散,这里学一点,那里学一点。学一下持久化,又学一下缓存。学一下线程模型,又学一下主从复制。学确实是学了,而且感觉掌握的也还行,但是老是记不住。后来我想一下,因为我学的太散了,对这些知识形成不了一个体系,说白了就是构建不了一副属于 Redis 的知识全景图。关于这个三高,其实并不是我想的,是我看了一本书,里面那个作者用三高这条主线来讲述 Redis 的知识点的。我觉得他对于 Redis 的整个大框架的理解很清晰,我就借鉴了一下他的三高的思路,结合我自己的理解,构建了一个属于我自己的三高。

当然,Redis 肯定不止这么点知识,但是我就只会这么点哈哈哈哈。

高性能

Redis 之所以高性能,之所以快,离不开它的线程模型和数据结构。

线程模型

对于线程模型,我们刚刚已经分析了,Redis 在访问模块(网络IO线程模型)是单线程的,在操作模块,对每个读写键值对的请求,它的处理也是单线程的。为什么处理读写请求也要单线程呢?这是因为避免多线程带来的并发问题,而且说实话,你用多线程要加锁吧,要加各种乱七八糟的锁才能保证不会有并发问题出现,那样性价比不高啊,那还不如用单线程呢。插一句题外话,平时我们说的 Redis 是单线程,其实指的是网络IO和操作键值对是单线程,其它都是多线程,比如说数据持久化的时候,AOF 和 RDB 技术,一般用主线程来处理网络IO和操作键值对,而子线程用来记录日志或者内存快照。

数据结构

对于数据结构,那就更加 不用说了,Redis 中的索引模块用哈希表来保存所有键值对,使得 Redis可以很快的定位到某个键值对,从而对这个键值对进行操作。同时,对于 value 中,也提供了4种数据类型来保存数据,这5种数据类型的底层是6种数据结构:哈希表、整数数组、双向链表、压缩列表、动态字符串、跳跃表。正是因为这6种数据结构,才使得 Redis 又快又省。

高可靠性

其实 Redis 对于实现高可靠性的思路也就两种:要么尽量少丢数据,要么尽量服务少中断。这两种思路也很好理解,因为丢数据会导致 Redis 没那么可靠,而服务中断也会导致 Redis 没那么可靠。让数据尽量少丢也就是我们经常听到的数据持久化,数据持久化方式就两种:AOF日志和RDB快照。让服务尽量少中断的办法就是主从复制+哨兵机制。

数据尽量少丢(数据持久化)

Redis 如果宕机了,那 Redis 中的键值对数据就没了,所以必须要经常对 Redis 做持久化,也就是用一些技术将 Redis 中的数据用文件记录下来,如果 Redis 宕机了,通过这些文件就可以快速的恢复数据。其实同步并不一定就是将数据一条一条复制,这是最简单的同步,这样比较麻烦,关于数据持久化这里,Redis 用了两种不一样的同步方式:AOF日志和RDB快照。AOF就是 Redis 每处理一次数据,都将数据以命令的方式记录在一个日志里,一旦 Redis 挂了,直接拿着这个日志一条一条命令执行,就恢复了。但是这样子很慢啊,所以我们就引入了另一种技术:RDB快照。RDB快照就是每隔一段时间就给 Redis 的数据拍张照,然后 Redis 一旦宕机了,拿着这张照片恢复就好了。我刚刚说了,不知道是刚刚还是上篇文章,我忘了,我说 RDB 体现了 Redis 的多线程。为什么这么说呢?因为对于 Redis 而言,它的主线程是处理网络IO和操作键值对数据的,除了这两个要用主线程之外,其余的都是用子线程来完成的。比如说这里的RDB,通过 bgsave 创建一个子线程,在主线程一边处理网络IO和操作键值对的时候,子线程会复制 Redis 中的数据(以快照的方式复制),我们用一个专业的术语,写时复制。所以RDB采用 bgsave + 写时复制 的方式对 Redis 中的数据进行同步。问题是,快照的频率根本不好把握,频率太高浪费子线程资源,频率太低又怕数据丢失,所以一般都是采用 AOF+RDB 混合使用。

服务尽量少中断

这个感觉和 kafka 消息队列有点像。主从复制就是将一份数据保存在多个 Redis 副本上。听名字就知道了,“主”就是主 Redis,“从”就是副本 Redis。当主 Redis 挂了的时候,副本 Redis 随时顶上来,这个过程背后就用到了哨兵。哨兵的作用就是6个字:监控、选主、通知。具体是怎么搞的,细节我倒是没太理解,所以就不细说了,等我了解了再完善这里。

高可扩展

高可扩展主线就两个知识点:数据分片和负载均衡。其实严格意义上讲根本都算不上两个知识点,算一个知识:用数据分片的方式实现了负载均衡的思想。这是不是和 SpringIOC 很像:用依赖注入的方式实现了控制反转的设计思想。

数据分片

与其拘泥于数据分片的具体细节,倒不如讲讲为什么要进行数据分片。我们知道,在持久化的过程中,如果 Redis 的数据量很大的话,你用 Redis 是很难进行数据同步的,比如说你的 Redis 有 25G 的数据,你对这 25G 的数据进行数据持久化,那岂不是废了。所以我们就想着把 Redis 中的数据分成好几等份,然后通过 RDB+AOF 技术对每份数据进行同步,那这样同步就很快了,就像这样:

至于数据分片的一些具体细节,我就不细讲了,因为我还没学会哈哈哈哈,等我学会了我再来完善这里。

小结

在这一篇文章中,我讲了 Redis 的三高:高性能、高可靠、高可扩展。 Redis 之所以有高性能,是因为 Redis 的网络IO线程模型以及它底层的6种数据结构。Redis 之所以高可靠,是因为 Redis 中有 AOF和RDB,主从复制+哨兵机制这些技术。AOF 和 RDB 使得 Redis 宕机了客户以快速恢复,主从复制+哨兵机制是为了提高 Redis 的容错性,减少宕机时间。Redis 之所以可以扩展,是因为它采用数据分片的方式,使得 Redis 只需要添加分片既可获得扩展。

下篇文章,我们会讲 Redis 应用于缓存,也是最后一篇文章了!

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

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

相关文章

生女儿一定要把她打扮成自己喜欢的样子

不仅女儿喜欢我也很喜欢 一套上身满满的美式学院风 有蓝、杏两种颜色 条纹短袖衬衫搭配短款百褶裙 简约百搭,时尚单品 全棉面料,舒适透气

2024年第三期丨全国高校大数据与人工智能师资研修班邀请函

2024年第三期 杭州线下班 数据采集与机器学习实战(Python) 线上班 八大专题 大模型技术与应用实战 数据采集与处理实战(Python&八爪鱼) 大数据分析与机器学习实战(Python) 商务数据分析实战&…

windows无法使用hadoop报错:系统找不到路径

在windows下安装hadoop-3.1.4,进行环境变量配置后,打开window命令行窗口测试hadoop命令,报错,如图所示: 方案:由于JAVA_HOME路径有空格导致,可修改hadoop下\etc\hadoop\hadoop_env.cmd文档中set JAVA_HOME以…

提效提速的快捷回复工具

在数字化交流日益增长的今天,客服工作显得尤为重要。为了提升对话质量和回复速度,同时减少重复劳动,我同事给我介绍了一款快捷回复工具,叫做客服宝聊天助手。我用了几天真心觉得好好用,今天特地分享这个软件给你们&…

Kubernetes(k8s):如何进行 Kubernetes 集群健康检查?

Kubernetes(k8s):如何进行 Kubernetes 集群健康检查? 一、节点健康检查1、使用 kubectl 查看节点状态2、查看节点详细信息3、检查节点资源使用情况 2、Pod 健康检查2.1、 使用 kubectl 查看 Pod 状态2.2、 查看特定 Pod 的详细信息…

弱电工程有哪些系统?一站式解决方案

随着科技的不断进步,现代建筑不仅仅是砖石和水泥的堆砌,它们已经转化为拥有高度智能化的复杂结构。在这些建筑的核心,弱电工程扮演着至关重要的角色。今天,我们将深入探讨弱电工程的各个组成部分以提供的解决方案。 弱电工程涵盖…

【软路由】iStoreOS全量备份或数据迁移思路

背景:之前是在我的i3小主机上面搭建了iStoreOS,因为有段时间爱折腾,于是乎不知道什么情况就造成首页无法登录,改了的东西无法回滚,好在使用“万能重启”法又可以登录了,于是我就在想把这玩意定期备份一下。…

PCB的电气/物理特性检查项目需思考的问题

在PCB设计、制造和装配过程中,为确保产品性能和质量,电子工程师必须进行电气特性和物理特性检查,然而对很多新人来说如何高效进行检查是个难题,所以下面将分别探讨这些检查时需要考虑的问题。 1、PCB电气特性检查项目①导线参数分…

小学生古诗文大会往届真题测一测和独家详细解析(1-4期)

最近,古诗文大会主办方已经通过官微发布往期真题测一测,为2024年的小学生古诗文大会预热。主办方发布在官微的往期真题测一测形式是每期发布四道题目,两道单选题、两道填空题,孩子们可以在留言区回复答案。不过主办方并没有公布答…

论文笔记:基于多粒度信息融合的社交媒体多模态假新闻检测

整理了ICMR2023 Multi-modal Fake News Detection on Social Media via Multi-grained Information Fusion)论文的阅读笔记 背景模型实验 背景 在假新闻检测领域,目前的方法主要集中在文本和视觉特征的集成上,但不能有效地利用细粒度和粗粒度…

C++多线程:单例模式与共享数据安全(七)

1、单例设计模式 单例设计模式,使用的频率比较高,整个项目中某个特殊的类对象只能创建一个 并且该类只对外暴露一个public方法用来获得这个对象。 单例设计模式又分懒汉式和饿汉式,同时对于懒汉式在多线程并发的情况下存在线程安全问题 饿汉…

JUC:原子类型的使用(原子整数、原子引用、原子数组、字段更新器、累加器)

文章目录 原子类型AtomicInteger 原子整数AtomicReferenc 原子引用AtomicStampedReference 带版本号的原子引用AtomicMarkableReference 仅记录是否修改的原子引用AtomicXXXArray 原子数组AtomicXXXFieldUpdater 字段更新器LongAdder累加器 原子类型 AtomicInteger 原子整数 …

Web Animations API 动画

Element.animate() dom.animate动画可以避免污染dom原有的css动画 参考资料 Element.animate() - Web API 接口参考 | MDN Element: getAnimations() method - Web APIs | MDN .tunnel{width:200px;height:200px;background-color:#38f;}<div class"tunnel" …

文件夹0字节:原因、恢复与防范全攻略

在我们日常使用电脑的过程中&#xff0c;有时候会遇到一种奇怪的现象&#xff1a;某个原本包含大量文件的文件夹突然变成了0字节。这种突如其来的变化令人措手不及&#xff0c;不禁让人担心重要的数据是否已经彻底丢失。那么&#xff0c;文件夹0字节到底是怎么回事&#xff1f;…

氟化氢冷凝装置配套PFA烧瓶PFA冷凝管PFA接收瓶等

一、装置清单及说明&#xff1a; 1. PFA烧瓶 材质为PFA&#xff0c;半透明&#xff0c;耐受强酸强碱&#xff0c;常用500ml 1000ml&#xff0c;其他规格等可自行选择&#xff0c;若需要3颈及以上建议选择500ml以上规格&#xff0c;可根据要求选择有液位计&#xff0c;可看出瓶…

Redis 应用问题解决——缓存穿透、缓存击穿、缓存雪崩、分布式锁

缓存穿透 key对应的数据在数据源不存在&#xff0c;每次针对此key的请求从缓存获取不到&#xff0c;请求都会压到数据源&#xff0c;从而可能压垮数据源。比如用一个不存在的用户id获取用户信息&#xff0c;不论缓存还是数据库都没有&#xff0c;若黑客利用此漏洞进行攻击可能…

大屏可视化项目示例--基于Vue3+vite2+echart+mock+axios+dataV

图例&#xff1a; 项目环境&#xff1a; Vite、Echarts、Npm、Node、axios、mock、vue3、dataV。 项目地址&#xff1a; IofTV-Screen-Vue3: &#x1f525;(IofTV-Screen Vue3版本)一个基于 vue3、vite、Echart 框架的物联网可视化&#xff08;大屏展示&#xff09;模板&…

状态压缩DP

哈密顿路径问题&#xff1a; 一般设 表示 状态下&#xff0c;为最后一个最值情况 。 一般有两种稍微不同的写法&#xff0c;单纯就是写法不同&#xff0c;思路方法都相同。 第一个例题为第一种转移方法&#xff0c;有当前转移后面。 后面的都是由前面转移目前。 G. Shuff…

学习网安(19)

防火墙——安全产品 功能&#xff1a; 杀毒&#xff1a; 针对病毒&#xff0c;特征篡改系统中的文件 杀毒软件针对处理病毒程序 防火墙&#xff1a; 针对木马&#xff0c;特征系统窃密 防火墙针对处理木马 种类&#xff1a; 硬件防火墙&#xff1a; 各个网络安全厂商…

PCL点云库出现错误:..\dist.h(523): error C3861: “pop_t”: 找不到标识符

工程代码&#xff1a;简单地测试了k-d树的最近邻搜索功能 #include<pcl/point_cloud.h> #include<pcl/kdtree/kdtree_flann.h>#include<iostream> #include<vector> #include<ctime>using namespace std;int main(int argc, char** argv) {//使…