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 应用于缓存,也是最后一篇文章了!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI学习-线性回归推导

线性回归 1.简单线性回归2.多元线性回归3.相关概念熟悉4.损失函数推导5.MSE损失函数 1.简单线性回归 ​ 线性回归:有监督机器学习下一种算法思想。用于预测一个或多个连续型目标变量y与数值型自变量x之间的关系,自变量x可以是连续、离散,但是目标变量y必…

SQLynx发布3.0.0版本:带来更流畅便捷的SQL开发体验

作为新一代的一站式数据库管理开发工具, SQLynx自发布上线以来,一直受到广大用户的好评与鼓励。 为了给用户提供更高效、更便捷、更可靠的数据库管理开发体验,SQLynx今日正式发布3.0.0版本,同步在麦聪软件官网上线,全…

通知中心架构:打造高效沟通平台,提升信息传递效率

随着信息技术的快速发展,通知中心架构作为一种关键的沟通工具,正逐渐成为各类应用和系统中必不可少的组成部分。本文将深入探讨通知中心架构的意义、设计原则以及在实际场景中的应用。 ### 什么是通知中心架构? 通知中心架构是指通过集中管…

【零基础学数据结构】顺序表

目录 1.了解数据结构 什么是数据结构? 为什么要进行数据管理? 2.顺序表 顺序表概要解析: ​编辑顺序表的分类: 差别和使用优先度: 1.创建顺序表 1.1顺序表分为静态顺序表和动态顺序表 1.2顺序表的初始化…

【C++STL详解(二)】——string类模拟实现

目录 前言 一、接口总览 二、默认成员函数 1.构造函数 2.拷贝构造 写法一:传统写法 写法二:现代写法(复用构造函数) 3.赋值构造 写法一:传统写法 写法二:现代写法(复用拷贝构造) 4.析构函数 三、…

JVM原理

java 代码执行过程 ● 1.用javac代码编译为class ● 2.装载class ClassLoader ● 3.执行class,包括解释执行和编译执行 内存管理 jvm 内存区域 程序计数器(线程私有) 空间相对比较小,为数不多不会发送OutofMemoryError&#x…

数据文件大小扩容或缩容必备技能

欢迎关注“数据库运维之道”公众号,一起学习数据库技术! 本期将为大家分享“数据文件大小扩容或缩容必备技能” 。 关键词:Resize Datafile、ORA-03297、高水位线 表空间跟数据文件是一对多的关系,数据文件存放到磁盘或ASM磁盘组。当磁盘空间…

OSX-02-Mac OS应用开发系列课程大纲和章节内容设计

本节笔者会详细介绍下本系统专题的大纲,以及每个专题章节的组织结构。这样读者会有一个全局的概念。 在开始前还是在再介绍一下下面这个框架图,因为比较重要,在这里再冗余介绍一下。开发Apple公司相关产品的软件时,主要有两个框架…

JavaScript基础(5)之对象的方法和调用

JavaScript基础5之对象的方法和调用 对象对象使用语法属性和访问方法和调用null遍历对象 内置对象Math属性方法 基本数据类型和引用数据类型堆栈空间分配区别:简单类型的内存分配复杂类型的内存分配 对象 对象是 JavaScript 数据类型的一种,之前已经学习…

AI音乐GPT时刻来临:Suno 快速入门手册!

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…

回溯算法|78.子集

力扣题目链接 class Solution { private:vector<vector<int>> result;vector<int> path;void backtracking(vector<int>& nums, int startIndex) {result.push_back(path); // 收集子集&#xff0c;要放在终止添加的上面&#xff0c;否则会漏掉自…

Leaflet使用多面(MultiPolygon)进行遥感影像掩膜报错解决之道

目录 前言 一、问题初诊断 1、山重水复 2、柳暗花明 3、庖丁解牛 4、问题定位 二、解决多面掩膜问题 1、尝试数据修复 2、实际修复 3、最终效果 三、总结 前言 之前一篇讲解遥感影像掩膜实现&#xff1a;基于SpringBoot和Leaflet的行政区划地图掩膜效果实战&#xff0…

Docker实例

华子目录 docker实例1.为Ubuntu镜像添加ssh服务2.Docker安装mysql docker实例 1.为Ubuntu镜像添加ssh服务 (1)访问https://hub.docker.com&#xff0c;寻找合适的Ubuntu镜像 (2)拉取Ubuntu镜像 [rootserver ~]# docker pull ubuntu:latest latest: Pulling from library/ub…

开源大模型AI代理操作系统:像Windows一样,操控AI代理

去年&#xff0c;AutoGPT的出现让我们见识到了AI代理强大的自动化能力&#xff0c;并开创了一个全新的AI代理赛道。但在子任务调度、资源分配以及AI之间协作还有不少的难题。 因此&#xff0c;罗格斯大学的研究人员开源了AIOS&#xff0c;这是一种以大模型为核心的AI代理操作系…

【智能算法】蜜獾算法(HBA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2021年&#xff0c;FA Hashim等人受到自然界中蜜獾狩猎行为启发&#xff0c;提出了蜜獾算法&#xff08;(Honey Badger Algorithm&#xff0c;HBA&#xff09;。 2.算法原理 2.1算法思想 蜜獾以其…

C++重载和模板

重载与模板 函数模板可以被另一个模板或一个普通非模板函数重载。 与往常一样&#xff0c;名字相同的函数必须具有不同数量或类型的参数。 如果涉及函数模板&#xff0c;则函数匹配规则会在以下几方面受到影响&#xff1a; 对于一个调用&#xff0c;其候选函数包括所有模板…

成都欣丰洪泰文化传媒有限公司引领电商新风向

在当今数字化时代&#xff0c;电子商务行业日新月异&#xff0c;竞争激烈。然而&#xff0c;在这股浪潮中&#xff0c;成都欣丰洪泰文化传媒有限公司凭借其独特的战略眼光和创新精神&#xff0c;正引领着电商领域的新浪潮。本文将探讨成都欣丰洪泰文化传媒有限公司如何在激烈的…

C++ //练习 11.12 编写程序,读入string和int的序列,将每个string和int存入一个pair中,pair保存在一个vector中。

C Primer&#xff08;第5版&#xff09; 练习 11.12 练习 11.12 编写程序&#xff0c;读入string和int的序列&#xff0c;将每个string和int存入一个pair中&#xff0c;pair保存在一个vector中。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#x…

Linux简单介绍

Linux简单介绍 编译器VMware虚拟机Ubuntu——LinuxOS为什么使用LinuxOS&#xff1f; 目录结构Windows目录结构Linux操作系统home是不是家目录&#xff1f; Linux常用命令终端命令行提示符与权限切换命令tab 作用&#xff1a;自动补全上下箭头pwd命令ls命令mkdir命令touch命令rm…

笔记: JavaSE day15 笔记

第十五天课堂笔记 数组 可变长参数★★★ 方法 : 返回值类型 方法名(参数类型 参数名 , 参数类型 … 可变长参数名){}方法体 : 变长参数 相当于一个数组一个数组最多只能有一个可变长参数, 并放到列表的最后parameter : 方法参数 数组相关算法★★ 冒泡排序 由小到大: 从前…