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

前言

我们继续写第一篇文章没写完的。其实我也不想将我写的一篇 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 应用于缓存,也是最后一篇文章了!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

WPF-基础及进阶扩展合集(持续更新)

目录 一、基础 1、GridSplitter分割线 2、x:static访问资源文件 3、wpf触发器 4、添加xaml资源文件 5、Convert转换器 6、多路绑定与多路转换器 二、进阶扩展 1、HierarchicalDataTemplate 2、XmlDataProvider从外部文件获取源 3、TextBox在CellTemplate中的焦点问题…

这些策略助力打造多元化、公平和包容性招聘流程

多样性、公平和包容(DEI)是企业招聘员工的最佳策略。顾名思义,DEI描述了三个关键组成部分: “多元化”,这取决于吸引、招聘、雇佣和留住多元化的员工队伍; “公平”部分是指确保不歧视和平等就业机会; “包容”要求建立一个尊重、支持和包容的环境&am…

【学习】兼容性测试为何如此重要

兼容性测试是软件测试中非常重要的一环,旨在确保软件在不同的平台、浏览器、操作系统等环境下能够正常运行,并且不会出现兼容性问题。本文将介绍兼容性测试的概念、重要性、实施步骤及实践案例,帮助读者更好地理解兼容性测试在软件开发中的重…

【解决问题】排查linux手动删除文件,但是文件标记为deleted,资源未释放

背景: 生产环境我们把程序生成的数据文件手动删除后,但是空间并没有释放,导致硬盘被占用,不够用 问题排查: 1.查看占用文件状态 使用命令: lsof | grep deleted 查看 文件已经删除了,但是都是…

人事管理系统的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)请假加班招聘考勤

本项目包含可运行源码数据库LW,文末可获取本项目的所有资料。 推荐阅读300套最新项目持续更新中..... 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含ja…

idea编译一直失败处理

切换分支的时候,明明代码正常,但是编译的时候一直失败。。。。特别是多个项目的时候,经常失败。 配置 -Djps.track.ap.dependenciesfalse idea默认是增量编译,设置这个false之后就从头开始编译了。 设置之后,点击编译&…

Linux系统中安装一些常用的插件备用

Linux系统中安装一些常用的插件备用 1.安装wget yum -y install wget 2.安装vim yum -y install vim-enhanced 3.更换yum源为国内的阿里云源(选择) 1、备份CentOS-Base.repo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.…

划重点!实物黄金和现货黄金的区别

有人说虽然现货黄金不是实物黄金,但却胜于实物黄金,我们认为如果从投资的便利性,以及潜的获利空间这两个主要的方面来说,上述的观点是相当正确的。但投资者在正式参与之前,最好还是认真了解一下实物黄金和现货黄金的主…

建立统一网络身份认证平台,赋能用户信息安全

“近年来,层出不穷的网络谣言、网络暴力事件以及网络水军、网络黑灰产犯罪屡禁不止、屡打不绝,其主要原因是网络实名制落实不到位。”全国人大代表、黑龙江省大庆市公安局网络警察分局副局长贾晓亮接受记者采访时表示,网络信息安全问题是我们…

深度学习实战74-基于Transformer的ViT模型的搭建与实际应用,ViT模型的原理介绍

大家好,我是微学AI,今天给大家介绍一下深度学习实战74-基于Transformer的ViT模型的搭建与实际应用,ViT模型的原理介绍。Vision Transformer (ViT)是一种基于Transformer架构的深度学习模型,专门用于计算机视觉任务。与传统的卷积神经网络不同,ViT将输入图像分割成固定大小…

【C++】入门知识

1. 命名空间 在C/C中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称都将存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的就是对标识符的名称进行本地化,以避免命名冲突或名字污染,…

外汇110:交易中,是否真的存在确定性?

我们看问题的角度不同,得到的结果必然也是不一样的。我们不能否认任何一种可能性,但一切需要从逻辑出发。交易中,最大的确定性就是市场是不确定的,什么样的行情都可能发生。当然,绝对的确定性是不存在的,但…

制定合理的薪酬计划是激励员工的最佳方式

想要在竞争日益激烈的环境中取得成功的雇主必须有一个精心设计的薪酬计划,以激励员工,控制薪酬成本,并确保公平,最好的薪酬计划反映了雇主的文化,因此,雇主应该建立一种薪酬理念,福利项目也应该…

Mysql实战--为什么表数据删掉一半,表文件大小不变

经常会有同学来问我,我的数据库占用空间太大,我把一个最大的表删掉了一半的数据,怎么表文件的大小还是没变? 那么今天,我就和你聊聊数据库表的空间回收,看看如何解决这个问题。 这里,我们还是针…

Python字符串操作方法一览表

字符串操作 你患得患失太在意从前又太担心将来,有句话说的好昨天是段历史,明天是个谜团而今天是天赐的礼物 像珍惜礼物那样珍惜今天。—— 龟大仙《功夫熊猫3》 1.字符串连接 例子: str1 "Hello" str2 "World" resul…

stm32HAL库创建项目

stm32cubeMX 作用进行初始化芯片使编程者直接调用函数根据创作者的想法经行编写减少了查看芯片手册所消耗的时间 创建项目 打开软件 双击标记处选择mcu即芯片 在此处搜索芯片型号 在双击检索到的芯片 点击此处经行,文件位置,打开方式,项目…

天眼护航 安全无界:天通哨兵PS02—电力巡检保护的智能利器

在电力行业中,输电线路的安全稳定运行对于保障社会经济活动至关重要。然而,广阔的输电线路常常穿越复杂的地形和恶劣的自然环境,给电力巡检和保护工作带来了巨大挑战。 为了提高巡检效率和响应速度,更好地保障电力设施的安全运行…

谷歌google广告和必应Bing广告,是否二选一?

搜索引擎广告凭借其精准定向、高度可见性和高效转化能力,成为众多企业拓展海外市场、提升品牌影响力的重要手段。其中,谷歌Google与必应Bing作为全球两大主流搜索引擎,各自拥有庞大的用户群体与独特的市场优势。面对这两大广告平台&#xff0…

小问题/小技巧/小知识汇总(记录贴)

目录 第一章、小问题①使用了Lombok的Data注解,但是getter方法失效,报错空指针异常③什么是字典项查询④workbench 导出包错误:could not get mysql version⑤一个自定义导包后出现的小问题⑥使用org.json将xml转json的时候出错⑦报错MySQLSy…

一文秒解四大经典限流算法

阅读前提:没有最好的算法,只有最适合的算法! 限流算法: 固定窗口限流算法 滑动窗口限流算法 漏桶限流算法 令牌桶限流算法 固定窗口限流算法 介绍 固定窗口限流算法(Fixed Window Rate Limiting Algorithm&#…