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.mzph.cn/news/785035.shtml

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

相关文章

密码算法概论

基本概念 什么是密码学? 简单来说,密码学就是研究编制密码和破译密码的技术科学 例题: 密码学的三个阶段 古代到1949年:具有艺术性的科学1949到1975年:IBM制定了加密标准DES1976至今:1976年开创了公钥密…

Golang | Leetcode Golang题解之第4题寻找两个正序数组的中位数

题目&#xff1a; 题解&#xff1a; func findMedianSortedArrays(nums1 []int, nums2 []int) float64 {if len(nums1) > len(nums2) {return findMedianSortedArrays(nums2, nums1)}m, n : len(nums1), len(nums2)left, right : 0, mmedian1, median2 : 0, 0for left <…

app自动化-Appium学习笔记

使用Appium&#xff0c;优点&#xff1a; 1、支持语言比较多&#xff0c;例如&#xff1a;Java、Python、Javascript、PHP、C#等语言 2、支持跨应用&#xff08;windows、mac、linux&#xff09; 3、适用平台Android、iOS 4、支持Native App(原生app)、Web App、Hybird App…

算法系列--递归,回溯,剪枝的综合应用(1)

&#x1f495;"对相爱的人来说&#xff0c;对方的心意&#xff0c;才是最好的房子。"&#x1f495; 作者&#xff1a;Lvzi 文章主要内容&#xff1a;算法系列–递归,回溯,剪枝的综合应用(1) 大家好,今天为大家带来的是算法系列--递归,回溯,剪枝的综合应用(1) 1.全排…

使用Redis集合List实现消息队列

系列文章目录 文章目录 系列文章目录前言前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型…

高阶DS---AVL树详解(每步配图)

目录 前言&#xff1a; AVL树的概念: AVL树节点的定义&#xff1a; AVL树的插入&#xff08;重点&#xff09; AVL树的旋转&#xff1a; &#xff08;1&#xff09;新节点插入较高左子树的左侧---右单旋 &#xff08;2&#xff09;新节点插入较高右子树的右侧---左单旋 …

unity双层滑动实现

实现功能&#xff1a; 当滑动列表中内容处于顶端的时候&#xff0c;向上滑动优先滑动整个滑动列表&#xff0c;当滑动列表移动到设置位置&#xff0c;即设定的最高处时&#xff0c;继续移动列表内内容。向下移动亦然&#xff0c;当内容处于滑动列表顶端时&#xff0c;移动整个滑…

深入解析Hadoop生态核心组件:HDFS、MapReduce和YARN

这里写目录标题 01HDFS02Yarn03Hive04HBase1&#xff0e;特点2&#xff0e;存储 05Spark及Spark Streaming关于作者&#xff1a;推荐理由&#xff1a;作者直播推荐&#xff1a; 一篇讲明白 Hadoop 生态的三大部件 进入大数据阶段就意味着进入NoSQL阶段&#xff0c;更多的是面向…

[游戏开发][UE5.3]代码生成蓝图文件并在代码中保存文件。

我看网上有人的做法比我更好&#xff0c;我这个更简单 UE5-GAS:读取Excel数据在蓝图创建并更新GE类 - 知乎 数据配表 测试编辑器API 创建编辑器蓝图文件&#xff0c;继承AssetActionUtility.h 创建在编辑器中显示的函数&#xff0c;可以用中文命名方便其他人使用。 右键任意…

从零开始学Python数据分析:菜鸟也能成高手(文末送书)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

【数据结构与算法初阶(c语言)】插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序、归并排序、计数排序-全梳理(万字详解,干货满满,建议三连收藏)

目录 1.排序的概念及其运用 1.1排序的概念 1.2排序运用 1.3常见的排序算法 2.插入排序 2.1 原理演示&#xff1a;​编辑 2.2 算法实现 2.3 算法的时间复杂度和空间复杂度分析 3.希尔排序 3.1算法思想 3.2原理演示 3.3代码实现 3.4希尔算法的时间复杂度 4.冒泡排序 4.1冒泡排…

test01

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

Java的IDEA的工程管理

模块和包的图标&#xff1a; 举个例子&#xff1a; IDEA中创建包&#xff1a; 如图所示&#xff0c;com.LBJ的意思是在com包中创建子包LBJ 参见&#xff1a; IDEA中项目、模块和包的关系_idea中模块和项目-CSDN博客

网站秒收录的6个方法

网站怎么做到秒收录 网站的收录速度对于网站的曝光和流量至关重要。如果能够实现网站的秒收录&#xff0c;将大大提高网站的可见性和访问量。下面介绍几种方法&#xff0c;帮助您实现网站秒收录的目标。 1. 提交sitemap.xml文件 创建并提交sitemap.xml文件是实现网站快速收录…

Netty学习——源码篇9 Netty的Handler其他处理 备份

1 ChannelHandlerContext 每个ChannelHandler被添加到ChannelPipeline后&#xff0c;都会创建一个ChannelHandlerContext&#xff0c;并与ChannelHandler关联绑定。ChannelHandlerContext允许ChannelHandler与其他的ChannelHandler进行交互。ChannelHandlerContext不会改变添加…

U8二次开发-钉钉集成

钉钉开放平台作为企业沟通和协作的重要工具,其技术的每一次迭代都为企业带来了新的机遇和挑战。随着企业对于高效沟通和智能化管理的需求日益增长,钉钉平台的SDK更新显得尤为重要。把传统的U8与钉钉平台集成,可以有效的将业务功能和角色进行前移,打破应用系统二八原则,即8…

dailyneaty、希亦、鲸立婴儿洗衣机怎么样?三款卷王测评PK对决

曾经我还是一直选择手洗婴儿衣物&#xff0c;最终还是加入了买婴儿洗衣机的大军&#xff0c;一方面因为我懒&#xff0c;不想再继续手洗&#xff0c;另一方面是因为我看了科普才知道&#xff0c;当我们清洗衣物时&#xff0c;除了要洗掉衣物表面的污渍&#xff0c;更需要消除掉…

MATLAB——知识点备忘

最近在攻略ADC建模相关方面&#xff0c;由好多零碎的知识点&#xff0c;这里写个备忘录。 Matlab 判断一个数是否为整数 1. isinteger 函数 MATLAB中&#xff0c;可以使用 isinteger 函数来判断一个数是否为整数&#xff0c;例如&#xff1a;要判断x是否为整数可以采用以下代…

科研学习|论文解读——情感对感知偶然信息遭遇的影响研究(JASIST,2022)

原文题目 Investigating the impact of emotions on perceiving serendipitous information encountering 一、引言 serendipity一词最初是由霍勒斯沃波尔创造的&#xff0c;他将其定义为“通过意外和睿智发现你并不追求的事物”。信息研究中大多数现有的偶然性定义从几个角度看…

劳动力规划:对企业加速运营的未来展望

近年来&#xff0c;企业面临着过山车般的经济形势&#xff0c;面对消费水平的上涨、市场波动带来的担忧以及数字化的加速转型&#xff0c;许多企业虽然对未来仍秉持着谨慎乐观的态度&#xff0c;但也同时认为自身缺乏持续增长和成功转型的能力。为了让企业能够实现战略目标、应…