初识Redis · 简单理解Redis

目录

前言:

分布式系统

开源节流

认识Redis

负载均衡

缓存

微服务


前言:

本文只是作为Redis的一篇杂谈,简单理解一下Redis为什么要存在,以及它能做到和它不能做到的事儿,简单提及一下它对应的优势有什么,不足有什么之类的。

总之,本文只是Redis入门的杂谈,咱们看看即可~


分布式系统

首先提到Redis,咱们除了能想到它快之外,还应该能想到分布式系统,即便没有系统学习过Redis的同学,对于Redis的第一印象大概率就是它能应用在分布式系统上。

那么什么是分布式系统呢?

我们从最简单的单机架构开始谈。

其实到目前为止,挺多公司用的还是单机架构的服务器,什么是单机架构呢?就是上层的应用服务和数据库服务都是由一个服务器来完成的。那么这个服务器就会面临一个老生常谈的问题,它这个单机服务器面临大的吞吐量的时候怎么办?

所以当数据量大起来的时候,一台单机服务器就没有办法处理这么多的数据量,我们就可以引入其他服务器来帮助原来的单机服务器处理多余的数据量。

那么问题来了,我们是将服务器直接通上电,然后就可以直接运行,甚至可以直接处理数据了吗?显然并不是。

在引入了多台主机的情况下,我们势必面临的问题是不仅有服务器和服务器之间的连接问题,甚至有了人与人之间的资源调度问题。因为多台主机,代码量几乎是按照指数级增加的,所以前期的代码开发,到后期的代码维护,开发人员运维人员的调度明显是一个问题。

我们从最简单的分布式开始入手,最开始一台服务器处理应用服务和数据库存储服务,那么我们思考,是否可以将数据库存储服务和应用服务分开:

就像这样,我们就拥有了两台主机,一台是应用服务器的主机,一台是存储服务器的主机,一个专门用来处理应用的上层请求,一个专门用来处理数据库的服务

到现在,最最基本的分布式架构已经出来了,那么我们把数据量往上增加的过程,势必会有一种烦恼:硬件资源和软件资源如何增加?

开源节流

到了这个时候,面对非常庞大的数据量的时候,硬件资源反而是最好提升的,因为服务器处理请求的时候,吃的资源无非就是CPU,内存,硬盘,网络等资源,所以面对硬件资源,我们可以这样提升:主板上面多插几块CPU,多插几块内存,硬盘等同理,对于网络来说我们可以提升网络带宽,可以更换网卡,从万兆网卡更换成千兆网卡。

到这里,我们就简单理解了开源节流中的开源,即非常简单粗暴的增加硬件资源,无脑堆就行,但是我们仍然面临的问题是,主板中的位置是有限的,也就是说硬件资源是没有办法无线堆积的,那么有人就说了,堆积主板呗,只能说想法是美好的,毕竟硬件资源最耗费的就是钱财了~~

那么开源的时候预算到了一定程度,没有办法了,我们是否应该考虑一下涉及到人工成本的节流?

比如Redis存储热点数据的时候,我们使用的是什么数据结构?这样操作下来时间复杂度是多少?空间复杂度是多少?是否还有更多的空间进行优化?

此时就涉及到了人工的优化了,可是随着服务器规模的增大,代码量增大的可不是一点半点,那么人工成本就非常大了,并且改错了一个bug可能就伴随着n个Bug。

所以其实从这里就可以看到,分布式并不是一件太完美的事,虽然增加了数据量的处理,但是处理的成本是真的大~~

认识Redis

当我们访问Redis的官方网站的时候,我们大概率能搜索到以下的关键字:in-memory data store, cache, streaming engine, message broker

翻译过来就就是存储在内存的数据,缓存,流式引擎,消息队列。

即我们可以理解为Redis可以做的事儿有以上这么多,当然实际上比这些多多了,不过你说Redis能做这么多,是因为它一发明出来就能做这么多事儿吗?

显然不是,最开始Redis的初心只是为了作为消息中间件,即用在消息队列上面,那么这里就涉及了生产消费模型,最开始人们用了一段时间后,发现Redis好像不止可以用在消息队列上,比如应用在流式引擎上好像更香。

所以到这里咱们简单理解呢就是Redis最开始发明出来之后发现应用在其他领域好像也是个香饽饽,也就拿去开发了,不过目前的消息队列呢很少有直接使用Redis作为中间件的,有很多其他著名的中间件,咱们可以上网搜搜~

咱们拿MySQL和Redis来讲,MySQL最大的缺点就是访问慢,数据量一起来,访问速度是会有显著的下降的,而巧了,Redis也可以当作数据库使用,那么我们是不是就可以把MySQL踢出去,直接使用Redis呢?

显然不能,MySQL慢是慢了点,但是人家的存储量比Redis大到哪里去了,那么为什么Redis快呢?因为它是将数据存储到了内存里面

既然是存储到了内存里面,那么按照访问速度金字塔,CPU是最快的,然后是一级缓存二级缓存三级缓存等,最慢的是硬盘,而MySQL读写都是在硬盘,Redis读写都是在内存,你说这速度差的多不多吧!!

而对于Redis来说,还有一个独特的点是它可以进行网络通信,即将自己的内存数据通过网络发送到其他主机上,这就很强了,不过有的时候也会受限于网络等问题。咱们学习进程的时候都知道有一个东西叫做进程的隔离性,而对于Redis来说,它能进行进程间通信,即网络通信,你说它强不强?

好了,我们简单比较了以下MySQL和Redis的区别之后,我们是否会思考,有没有存储量大且速度快的方案?

显然是有的,我们明显可以结合MySQL和Redis使用,比如利用二八原则,即百分之20的数据可以满足百分之80的访问需求。我们就可以把这百分之20的数据放在Redis里面,到时候直接访问redis就可以了,要是访问的不是这20的数据,再访问MySQL就行。

所以根据上文介绍的分布式系统来说,数据量虽然大,但是总有部分数据是经常访问的,我们就把这种数据成为热点数据,其他数据成为冷数据,冷数据咱们就通过MySQL访问,热数据我们大多都是通过Redis访问。

负载均衡

好了,我们现在引入负载均衡的概念了,既然数据量起来了,我们还有多个服务器,那么哪个服务器处理哪个请求呢?最简单的方式是轮询,即A服务器处理了第一个那么就B服务器处理第二个,好了,问题来了,谁来完成这个分配的任务呢?

此时,负载均衡就出现了,负载均衡就像是领导,它不处理请求,它要求的是分发每个请求,即把每个请求根据实际情况分发给不同的服务器,这样就能完成一个削峰填谷的作用。大概率就不能出现某个主机处理的请求太多了导致服务器挂了的情况。

即,负载均衡=领导。

不过既然是领导,既然是要接受所有的请求,虽然不处理,但是仍然是要求负载均衡的接受请求的能力是要大于处理应用服务器的,那么你说会不会数据量大到负载均衡都接受不完的情况?

是非常有可能的,比如双十一,618的时候,就是数据量大爆发的时候,这个时候就可能要引入更多的负载均衡器了。

缓存

可是你别看数据量这么大的时候只有应用服务器在工作,数据多的时候,数据库可是真的烦恼,因为几乎所有的数据都是要从数据库的这里走的,也就是说数据库服务器是一个人默默承担了所有。

那么为了解决问题,根据实际情况出发,我们发现数据库的读频率是远远大于写频率的,所以我们不妨把数据库服务器分为主数据库和从数据库,一个负责读取一个负责写,这样我们引入了两台服务器分别完成读写的操作,自然面临的一个问题就是同步问题

而大多数情况,光把数据库分为了读写数据库还不够,因为有的数据非常频繁的访问,这就导致了有的时候同步不及时,所以引入了缓存:

即我们将数据库分为了三个,其中两个用来读取,一个是普通的从数据库,一个是缓存,用来缓存热点数据,这样数据库的压力一下就下来了。

不过还是那句话,这样后面的维护成本是比较大的,并且同步问题的难度也是越来越大了。此时咱门的Redis就应用到了缓存服务器里面了。不过这里的从数据库存放的可都是全量数据。

微服务

不过如果数据量在极端情况下,非常非常多,多到什么程度呢,多到一张表都需要拆分,此时就需要引入微服务了,即我们将数据量拆分了之后,哪个服务器处理哪个库的哪个表的数据等。

分库分表

这个时候的代码量,以及维护难度是大大的提高了,不过能处理数据的程度也确实提升了不少了。

我们在这里就简单的理解了微服务是什么,即将引入了多台服务器,不过处理的内容比较单一,比如就一个数据库的哪个哪个表。不过具体怎么分,那得看实际情况了。

引入微服务,解决了人的问题,付出的代价?
1.系统的性能下降~~(要想保证性能不下降太多,只能引入更多的机器,更多的硬件资源 =>充钱~~)
拆出来更多的服务,多个功能之间要更依赖网络通信,网络通信的速度很可能是比硬盘还慢的!!!幸运的是,硬件技术的发展,网卡现在有 万兆 网卡,读写速度已经能过超过硬盘读写了~~
2.系统复杂程度提高, 可用性收到影响~~
服务器更多了,出现问题的概率就更大了~~
这就需要一系列的手段,来保证系统的可用性~~
(更丰富的监控报警,以及配套的运维人员)
微服务的优势:
1.解决了人的资源分配问题.
2.使用微服务, 可以更方便于功能的复用
3.可以给不同的服务进行不同的部署

小结:

在分布式系统中,我们接触到的名词有:

应用/系统:即一个服务器程序。
模块/组件:即一个应用中独立的功能
分布式:引入多个服务器,每个服务器协同工作
集群:其实就是分布式上的多个主机,不过集群偏逻辑上
主从结构:比如数据库可以分为主从数据库,服务器节点也是
中间件:和业务无关的功能,比如消息队列,数据库,更多的是为了协助整个服务器工作。
可用性:系统整体可用的时间/总时间
响应时间:肯定是越短越好
吞吐量和并发:一条高速公路,两个车道,并发量为2,一分钟过了100辆车,吞吐量为100.


感谢阅读!

本文主要还是通过分布式系统简单引入Redis~~所以较为粗糙~~后面会越来越详细的!!

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

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

相关文章

网络通讯协议UDP转发TCP工具_UdpToTcpRelay_双向版

UDP/TCP网络转发器程序说明书 1. 程序概述 本程序是一个高性能网络数据转发工具,支持UDP和TCP协议之间的双向数据转发,并具备以下核心功能: 协议转换:实现UDP↔TCP协议转换数据转换:支持十六进制/ASCII格式的数据转…

MCP 服务搭建与配置学习资源部分汇总

MCP 服务搭建与配置学习资源汇总 目录 图文教程GitHub 示例项目视频课程不同开发语言实现案例 图文教程 Cherry Studio 配置 MCP 服务教程 – 介绍如何在 Cherry Studio 客户端中配置 MCP 服务器,让 AI 模型能够自主调用本地/网络工具来完成任务,提升…

Selenium中`driver.get(htmlfile)`方法可能出现的超时问题

针对Selenium中driver.get(htmlfile)方法可能出现的超时问题,以下是几种改进方案及具体实现方法: 1. 设置页面加载超时时间 通过set_page_load_timeout()方法直接控制页面加载的最大等待时间。若超时,会抛出TimeoutException异常&#xff0c…

20分钟了解 MMAction2 框架设计

步骤3:构建一个识别器 # 修改此处 predictions[0].pred_score -> predictions[0].pred_scores.item print(Scores of Sample[0], predictions[0].pred_scores.item)步骤4:构建一个评估指标 # 修改此处 data_sample[pred_score].cpu().numpy() ->…

单轨小车悬挂输送机安全规程

导语 大家好,我是社长,老K。专注分享智能制造和智能仓储物流等内容。欢迎大家使用我们的仓储物流技术AI智能体。 新书《智能物流系统构成与技术实践》 新书《智能仓储项目出海-英语手册,必备!》 完整版文件和更多学习资料&#xf…

C++之多态

文章目录 一、多态的概念 多态的定义与类型 二、多态的实现 三、虚函数 虚函数的概念 虚函数的重写/覆盖 协变 析构函数的重写/覆盖 override,final关键字 override final 纯虚函数与抽象类 三个概念辨析 四、多态实现的原理 虚函数表指针 动态绑定与静态绑定 …

深入理解 HTML5 Audio:网页音频播放的新时代

在网页开发领域,音频的嵌入和播放一直是一个重要且不断演进的话题。HTML5 的出现,为网页音频播放带来了标准化的解决方案,极大地改善了开发者和用户的体验。 一、HTML5 之前的音频播放状况 在 HTML5 诞生之前,互联网上缺乏统一的网页音频播放标准。当时,大多数音频播放依…

重载和重写的区别

重载 在同一个类中定义多个同名方法, 但参数列表不同(参数类型、参数个数或参数顺序不同)返回值类型不同。 public class MathOperations {int add(int a, int b) {return a b;}double add(double a, double b) {return a b;} }重写 子…

机器视觉+深度学习,让电子零部件表面缺陷检测效率大幅提升

在精密加工的3C电子行业中,一抹0.1毫米的油渍,一粒肉眼难辨的灰尘或将引发整机性能隐患。当制造业迈入微米级品质竞争时代,产品表面看似微不足道的脏污缺陷,正成为制约企业高质量发展的隐形枷锁。分布无规律的污渍斑点、形态各异的…

Dart逆向之函数调用

我们从Blutter恢复的部分IL中可以看到Dart调用函数的逻辑 // 0x180490: r16 <int> // 0x180490: ldr x16, [PP, #0x8a0] ; [pp0x8a0] TypeArguments: <int> // 0x180494: r30 Instance_MethodChannel // 0x180494: ldr lr, [P…

如何白嫖Grok3 API? 如何使用Grok3 API调用实例?怎么使用Grok3模型?

前段时间&#xff0c;Grok3&#xff08;想要体验Grok3的童鞋可以参考本文&#xff1a;Grok 上线角色扮演功能&#xff0c;教你课后作业手到擒来&#xff0c;Grok3使用次数限制&#xff1f;如何使用Grok3? Grok3国内支付手段如何订阅升级Premium - AI is all your need!&#x…

《超短心法》速读笔记

文章目录 书籍信息概览主线行业篇战法一 人气涨停战法战法二 四维主线战法 主线龙头篇战法三 龙头起爆战法战法四 六合强庄控盘战法战法五 筹码战法之七星连珠 趋势牛股篇战法六 趋势擒龙之暴涨形态战法七 趋势破位起爆战法战法八 强中选强多头战法 涨停晋级篇战法九 强势涨停狙…

git仓库迁移包括提交记录日志

网上找了很多资料都不好用&#xff0c;直到看到一个亲测有效后&#xff0c;整理如下&#xff1a; 1、进入仓库目录下&#xff0c;并且切换到要迁移的分支上 前提是你本地已有旧仓库的代码&#xff1b;如果没有的话&#xff0c;先拉取。 2、更改仓库地址 git remote set-url …

powerDesign 逆向 mysql 生成 物理模型,并用VBS脚本整理comment

学习自&#xff1a;https://www.cnblogs.com/xmyjcs/p/8536233.html 文章目录 Reverse Engineer格式化模型执行 VBS 脚本 Reverse Engineer 下面 DBMS 可以通过 ODBC&#xff08;Open Database Connectivity&#xff0c;开放数据库连接&#xff09;连接&#xff0c; 需要自己先…

Qt文件读写

Qt文件读写&#xff08;Stream流形式&#xff09; 文件读写相关类 1. QFile类 QFile主要用于文件的打开、关闭等功能&#xff1b; [override virtual] bool QFile::open(QIODevice::OpenMode mode);Reimplements: QIODevice::open(QIODevice::OpenMode mode). Opens the fi…

[特殊字符]【高并发实战】Java Socket + 线程池实现高性能文件上传服务器(附完整源码)[特殊字符]

大家好&#xff01;今天给大家分享一个 Java Socket 线程池 实现的高性能文件上传服务器&#xff0c;支持 多客户端并发上传&#xff0c;代码可直接运行&#xff0c;适合 面试、项目实战、性能优化 学习&#xff01; &#x1f4cc; 本文亮点&#xff1a; ✅ 完整可运行代码&a…

Python proteinflow 库介绍

ProteinFlow是一个开源的Python库,旨在简化蛋白质结构数据在深度学习应用中的预处理过程。以下是其详细介绍: 功能 数据处理:支持处理单链和多链蛋白质结构,包括二级结构特征、扭转角等特征化选项。 数据获取:能够从Protein Data Bank (PDB)和Structural Antibody Databa…

WebPages 对象

WebPages 对象 引言 在Web开发领域&#xff0c;WebPages 对象是前端工程师和开发者常用的工具之一。它提供了丰富的API&#xff0c;使我们能够轻松地与网页元素进行交互。本文将深入探讨WebPages对象的概念、特性以及在实际开发中的应用。 概念 WebPages对象是现代浏览器提…

Mysql表的操作(2)

1.去重 select distinct 列名 from 表名 2.查询时排序 select 列名 from 表名 order by 列名 asc/desc; 不影响数据库里面的数据 错误样例 &#xff1a; 但结果却有点出乎意料了~为什么会失败呢&#xff1f; 其实这是因为书写的形式不对&#xff0c;如果带了引号&#xff0c;…

先占个日常,等会写。

引入一个重要的概念 “struct” &#xff08;译为中文&#xff1a;结构体&#xff09; 可用作设出比较复杂的一些变量类型 语法 &#xff1a;struct point name { int x; int y; int z;} point 和 name是任意命名的名字&#xff0c;含义是&#xff0c;声明一个变量类型为st…