[Redis] 分布式系统与Redis介绍

news2025/1/11 17:10:09

🌸个人主页:https://blog.csdn.net/2301_80050796?spm=1000.2115.3001.5343
🏵️热门专栏:
🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm=1001.2014.3001.5482
🍕 Collection与数据结构 (92平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm=1001.2014.3001.5482
🧀线程与网络(96平均质量分) https://blog.csdn.net/2301_80050796/category_12643370.html?spm=1001.2014.3001.5482
🍭MySql数据库(93平均质量分)https://blog.csdn.net/2301_80050796/category_12629890.html?spm=1001.2014.3001.5482
🍬算法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12676091.html?spm=1001.2014.3001.5482
🍃 Spring(97平均质量分)https://blog.csdn.net/2301_80050796/category_12724152.html?spm=1001.2014.3001.5482
感谢点赞与关注~~~
✒️ 从今天开始,Redis专栏开始更新,欢迎订阅!!
在这里插入图片描述

目录

  • 1. 分布式系统演进
    • 1.1 单机架构
    • 1.2 应用服务和数据库服务分离架构
    • 1.3 应用服务集群架构
    • 1.4 读写分离架构/主从分离架构
    • 1.5 引入缓存,冷热分离架构
    • 1.6 垂直分库
    • 1.7 微服务架构
    • 1.8 分布式系统相关概念
  • 2. Redis介绍
    • 2.1 Redis的特性
    • 2.2 Redis的使用场景
    • 2.3 Redis不能做的事情
  • 3. Ubuntu上安装Redis

1. 分布式系统演进

1.1 单机架构

演进一般都是从单机架构开始的,所谓的单机架构就是一台服务器负责所有的服务.包括应用服务和数据库服务.

在这里插入图片描述
这台服务器中的应用服务,就是我们使用Java中的Spring写出的web项目,而数据库服务就是MySQL中的数据库服务器.(MySQL数据库是客户端服务器结构的).而MySQL的客户端在应用服务端被使用,用来调用数据库服务器中的数据.

1.2 应用服务和数据库服务分离架构

如果在用户量和吞吐量都增长之后,有时候一台主机并不可以满足我们的业务场景的时候,我们有以下的解决方案:

  1. 开源(硬件层面): 我们引入更多的硬件资源和更多的主机来解决问题.但是并不是在引入多台主机之后就可以解决问题,这需要软件层面的适配.
  2. 节流(软件层面): 对软件的性能上进行优化,这对程序员的水平要求非常高.

一旦我们的系统引入了多台主机,我们就把这个系统称为分布式系统.

但是引入分布式系统也是一种无奈之举,引入分布式系统会让我们项目的难度大大增高,也会让出现bug的概率大大提高.

我们引入两台主机之后,我们就可以把应用服务和数据库服务部署到两台服务上.这就叫做应用和数据库分离.
在这里插入图片描述
其中应用服务里面包含好多复杂的业务逻辑,可能会比较吃内存和CPU,而存储服务器中是数据库服务,其中需要更大的存储空间.可以配置更大硬盘的服务器,甚至还可以加上SSD硬盘(固态硬盘).

1.3 应用服务集群架构

如果我们的用户访问量依然在不停的增加.这时候应用服务器的CPU和内存就会被吃满,这时候一台机器就有可能顶不住,这时候我们就需要为应用服务器引入多台主机.
在这里插入图片描述
在引入多台应用服务器之后,我们就需要一个负载均衡服务器(网关服务器)来完成请求任务的分配.用户的请求会先到达网关服务器,这时候网关服务器就会给各个应用服务器分配任务,一般情况下是将任务平均分配给各个服务器.
这个网关服务器的职责就像一个组中的组长一样,要视情况把任务分配给每个组员.
如果请求变得更多了,网关服务器分配任务也分配不过来了,这是我们就需要引入多台网关服务器.

1.4 读写分离架构/主从分离架构

上面在应用服务器引入了多台主机,接下来我们要想提高系统性能,我们需要在数据库服务器中也引入多台服务器.
一般情况下,我们给数据库引入多台主机的时候,一般采用的是主从分离的架构.一般是一主多从的架构.
在这里插入图片描述
这里的主数据库主要是用来写操作.是因为主数据库只有一台,而一般情况的业务场景下,写的频率要远远低于读.所以我们就让主数据库来干,之后通过网络把从服务器的数据进行同步,而读的操作比较频繁,就交给多台从服务器来干.

1.5 引入缓存,冷热分离架构

但是如果从数据库中访问数据的时候,有一个很严重的问题,就是比较慢,这就使得系统的性能大大下降,这时候我们就需要引入缓存来解决问题.
在这里插入图片描述
这时候我们就需要对数据分出"冷热",冷的数据就是客户端不经常访问的数据,我们把他们放入到数据库中,热的数据就是客户端经常访问的数据.我们就需要把热数据放在缓存中,由于缓存的访问速度比硬盘快,这时候就可以使得系统的性能提升.
这其中,缓存中我们一般就用的是Redis来存储数据,而数据库使用的就是MySQL存储.其中缓存中存储的是20%左右的热点数据,可以满足用户80%的访问需求,而数据库中存储的是全量数据,可以保证用户访问数据的完整性.

1.6 垂直分库

垂直分库就是针对数据库的进一步拆分,就是在一台主机上分库分表.把原来一台数据库服务器中的数据库拆分为多个数据库,也就是一个主数据库,多个从数据库,和上面的主从分离架构的原理相同.
在这里插入图片描述
但是具体数据库服务器上的分库分表如何实现,就是看具体的业务场景了.

1.7 微服务架构

我们之前的架构,在一个服务器中可能实现的是多种多样的业务,这就会导致这台服务器的代码变得越来越复杂.所以我们为了提高项目的可维护性,我们就引入了微服务架构.一个服务器维护其中一个业务板块.
在这里插入图片描述
这其中,一个部门中不同的组可能开发的是不同的功能,这时候一个组可能就分发的是专门维护与开发这个功能的服务器集群.说白了,一方面,微服务可以给不同的服务部署不同的服务器,另一方面,微服务解决了"人力"的问题,.
那么拆分微服务有什么劣势呢?

  1. 导致系统的性能下降
    这是由于引入的服务器较多,在不同的主机在进行交互的时候(不同板块的功能相互依赖的时候), 就需要通过网络来交互,就是网络的性能拖慢了系统整个的性能.
  2. 系统的复杂度提高
    服务器的数量增加,使得维护的概率大大提升,bug出现的概率提高,这就需要专门的运维团队来对微服务集群来进行维护.

1.8 分布式系统相关概念

  1. 应用/系统: 一个应用/系统就是一个/一组服务器程序.
  2. 模块/组件: 一个服务器程序应用中有多个功能,每个功能就是一个模块或者组件.
  3. 分布式: 引入多个服务器/主机协同配合完成一系列的工作.(这里的主机说的是物理层面上的多个主机)
  4. 集群: 引入多个服务器/主机协同配合完成一系列工作.(这里的主机说的是逻辑上的多个主机)
    但是一般情况下,我们对分布式的概念和集群的概念并不会做过多的区分.
  5. 主从结构: 这是分布式系统中一种常见的结构,它们是多个服务器结点,其中一个是主,通常需要承担更多的职责,剩下的都是从,从服务器的数据一般要从主服务器同步过来.
  6. 中间件: 一类为不同应用程序提供通信的软件,这些是和业务无关的一些服务,也就是功能更加通用的服务,比如数据库,消息队列,缓存等.
  7. 可用性: 系统整体的可用时间/总时间,这是一个系统/应用的头等大事,一个应用的可用性必须至少达到4个9(99.99%)的高可用性.
  8. 响应时长: 指的是用户通过网络向系统发起请求之后,用户收到相应的时间,他是衡量一个服务器性能好坏的关键指标,具体性能要求要看业务场景,越小越好.
  9. 吞吐/并发: 衡量一个系统在一定时间内处理请求的数量,它用来衡量一个系统处理请求的能力,也是衡量一个系统性能的关键指标.

2. Redis介绍

Redis是一个可以在缓存中存储数据的中间件,一般可以用作数据库和数据缓存,它可以在分布式系统中大展手脚.

2.1 Redis的特性

  1. 在内存中存储数据
    相比MySQL,MySQL主要是通过表的形式来组织上数据并存储在硬盘中,我们一般把像MySQL这样的数据库称为关系型数据库,但是Redis主要是以键值对的形式来组织数据,并且把数据存储在缓存中,其中key是String类型的数据,val则是存储一些常见的数据结构,比如list,set,String等.我们把像Redis这样的数据库称为非关系型数据库.
  2. 可编程
    Redis可以使用交互式的命令来执行一些操作,也可以通过脚本的方式来批量执行一些操作.
  3. 可扩展
    Redis可以在原有功能的基础上进行扩展,我们可以通过C/C++/Rust语言来扩展Redis的功能(扩展的东西可以看做是一个动态链接库),比如我们可以为Redis扩展更多支持的数据结构以及支持更多的命令.
  4. 持久化
    存储在内存中的数据是不持久的,但是Redis可以解决这个不持久的问题,Redis储存数据的时候,以内存为主,硬盘为辅,也就是存储在内存中的数据会在硬盘中有一份备份,当服务器以外退出或主机断电恢复之后,Redis就会把数据从硬盘中重新复制到内存中.
    在这里插入图片描述
  5. 支持分布式集群
    Redis可以部署在不同的服务器上,一个Redis可以存储的数据是有限的,因此可以给每个服务器都部署一个Redis结点,拥有多个Redis结点,每个Redis中存储数据的一部分.
  6. 高可用
    高可用的特点主要就突出的是"冗余"这个词.Redis也和数据库一样可以主从复制.主结点和从结点中存储的是相同点的数据,为主结点中的数据做一个备份.
    在这里插入图片描述
  7. Redis最主要的特点------“快”
    为什么Redis可以如此之快,主要有以下几点原因:
    • 在内存中存储数据,访问内存中的数据比访问硬盘中的数据要快到上千乃至上万倍.
    • Redis的核心功能都是比较简单的逻辑,核心的功能都是操作内存中一些比较简单的数据结构.
    • 从网络的角度上讲,Redis使用的IO多路复用(使用一个线程实现管理多个Socket).
    • Redis使用的主要是单线程模型,避免了多线程之间的线程竞争产生的不必要的开销.

2.2 Redis的使用场景

  1. 用作数据库存储数据
    大多数的情况下,我们使用数据库存储数据的时候,有限考虑的是"大",但是有些时候我们还是优先考虑的是"快",比如热榜等.
  2. 用作缓存
    在缓存中保存的数据是少量的经常被访问到的数据,全量数据一般都是由MySQL存储的,即使Redis中的数据丢失了,我们也可以通过MySQL把数据同步过来.
  3. 用作消息队列
    消息队列其实就可以看做一个生产者消费者模型,生产者消费者模型最大的优势就是可以解耦合和削峰填谷.对于分布式系统来说,在服务器和服务器之间,我们会经常用Redis作为消息队列(生产者消费者模型).
  4. 用作分布式系统中的会话存储
    我们知道Cookie用来保存用户的信息,这需要session的配合.假如我们在一个分布式系统中,我们存储一个session在一个服务器中,如果用户在下一个请求中访问到了另一台服务器的话,用户就需要重新登陆,这时候我们就可以把session提取出来,在另外的一组机器上存储session,个这个机器中部署的就是Redis.而且可以保证session的持久化存储.每次用户在访问多台服务器的时候,首先就要经过Redis存储的Session进行校验.
    在这里插入图片描述

2.3 Redis不能做的事情

Redis最不能做的事情就是-----存储大规模的数据.

3. Ubuntu上安装Redis

  1. 连接云服务器
    在这里插入图片描述
  2. apt list|grep "redis" 查看所有的Redis有关的软件包.
    在这里插入图片描述
  3. apt install redis安装Redis,弹出的选项选择"y",遇到粉色的弹窗直接ESC退出.
    在这里插入图片描述
  4. 配置Redis的配置文件
    cd /etc/redis 进入Redis配置文件目录,会出现Redis的配置文件.
    在这里插入图片描述
  5. vim redis.conf进入配置文件,点击i进入编辑模式
    bind 127.0.0.1 ::1改为0.0.0.0 ::1
    protected-mode yes改为protected-mode no.
  6. 修改配置文件之后重启服务service redis-server restart
  7. 启动redis服务service redis-server start
  8. 打开redis客户端并连接redis服务器.redis-cli
    也可以使用redis-cli 主机号 -h 端口号 -p连接
    在这里插入图片描述
  9. 测试连接.ping
    在这里插入图片描述
    返回pong就说明连接成功了
  10. Ctrl+d退出
    在这里插入图片描述
  11. service redis-server stop停止redis服务

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

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

相关文章

研1日记6

1. 一般输入参数为batch_sizenum_featuresheightwidth 当高度和宽度不一样时,分别计算即可。 2.ReLU函数的表达式为:f(x) max(0, x)。 3.Pytorch中最大池化层Maxpool的作用说明及实例使用(附代码)-CSDN博客 4.假设x的形状是(A…

设计模式 第一次复学

创建者模式 单例模式(Singleton Pattern) 单例模式(Singleton)确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。 单例模式实现分为两种饿汉式和懒汉式,即创建时机,一个是类…

衡石分析平台使用手册-系统指引

首页​ 首页是用户进入衡石系统后的第一个页面,这里汇聚了平台最新动态信息、行业模板案例、用户的操作记录等,引导用户快速方便地使用平台功能。 首页包括以下版块,可以帮助用户继续之前的工作,开启新的工作,使用内置…

Spire.PDF for .NET【文档操作】演示:创建 PDF 文档

通过代码创建 PDF 文档具有多种优势。例如,您可以轻松合并动态内容,如用户输入、数据库记录或实时数据。基于代码的 PDF 生成允许更大的自定义和自动化,最大限度地减少创建高度定制文档时的手动干预。在本文中,您将学习如何使用Sp…

A*(A star)搜索算法

A*搜索算法是一种启发式算法,利用现有的信息进行搜索的一种方法。 首先,定义横纵相邻方格之间的距离为10,对角相邻方格的距离为14(本文设定可以向8个方向前进,也可以根据需求设置为4个,比如只能横纵相邻方格…

简单的spring batch学习

前言 公司批量任务是数据库执行的,想修改成java执行批量任务,所以简单了解了下springbatch批量任务框架,此处是其学习笔记,具体学习视频地址为bilibili springbatch,以下为其学习笔记内容以及源码信息 一、课程目标 …

sobel_dir 方向图和sobel的一些想法

怎么使用呢! 1,通过方向图可以提取 直线 或水平线region区域,提出来的dirregion区域 2,通过sobel的幅度度,分割出变化剧烈的区域 fuduregion 3,两个region相交,可以准确定位幅度范围内方向的…

ngrok | 内网穿透,支持 HTTPS、国内访问、静态域名

前言 当我们需要把本地开发的应用展示给外部用户时,常常会因为无法直接访问而陷入困境。 就为了展示一下,买服务、域名,搭环境,费钱又费事。 那有没有办法,让客户直接访问自己本机开发的应用呢? 这种需…

Qt信号和槽【2】

文章目录 1. 带参数的信号槽2. 信号和槽存在的意义3. 信号和槽断开连接4. lambda表达式定义槽函数 1. 带参数的信号槽 Qt的信号和槽也支持带参数。 当信号带有参数的时候,槽的参数必须和信号的参数一致,此时发射信号的时候,就可以给信号函数…

Material xxx SDF Material doesn‘t have _Stencil property

Unity 中导入第三方package后出现警告:Material xxx SDF Material doesnt have _Stencil property,原因是导入的库使用了TextMesh Pro组件,这时组件里的文本无法正常显示; 解决方法是导入两个包:TMP Essential Resour…

VScode 的简单使用

目录 1. VScode 的使用 1.1 常用插件 1.2 常用快捷键 1. VScode 的使用 1.1 常用插件 1.2 常用快捷键 也可以“ CTRLD ”;使用“CTRL滚轮”即可; ctrl /-,是用来展开/收起代码的; 比如:js 的多行注释是 shiftalt…

python的sqlalchemy使用@contextmanager来定义上下文管理器

Python通过函数名调用函数的几种场景 华为或超聚变服务器安装linux 你知道":“和”//"在python里面代表什么吗?这篇《python运算符》介绍,你肯定不想错过 SQLAlchemy通过contextmanager简化回滚操作 如何理解python的sqlalchemy这种orm框架&am…

某城user_dun,js逆向分析

声明: 该文章为学习使用,严禁用于商业用途和非法用途,违者后果自负,由此产生的一切后果均与作者无关。 本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责,若有侵权,请联系作者立即删除! 前言 这次会简单的讲解…

Windows下Python和PyCharm的应用(三)__Numpy与矩阵

1、背景介绍 矩阵运算是Python语言的基石。 而支持矩阵运算的基础语言包就是Numpy。 参考链接: Python中Numpy的使用_numpy在python中的用法-CSDN博客 这篇博客介绍的numpy比我的这篇博客介绍的更加的详细。本博客只是根据本人 的实际应用,对最关键的…

scRNA-data中的R值

愿武艺晴小朋友一定得每天都开心 当我们测序拿得到各个样本中基因的表达值&#xff0c;就可以用基因表达值来表征样本间的相关性 代码如下&#xff1a; #样本间相似性&#xff1a;R值 相关性 捕获到的基因在两个样本间表达趋势一致性 exp_RNA <- AverageExpression(fasti…

[SDK]-组合框 和 列表框控件

前言 各位师傅大家好&#xff0c;我是qmx_07&#xff0c;今天给大家讲解组合框和列表框控件的相关知识 组合框 组合框由一个列表和一个选择字段,该列表显示用户可以选择的选项 创建组合框&#xff1a; CreateWindow(L"Combobox",//窗口类名L"",//标题C…

使用Python控制Excel应用:打开与关闭工作簿的技术性探讨

目录 引言 一、安装必要的库 1. xlwings 2. openpyxl 二、使用xlwings打开和关闭Excel工作簿 2.1 启动和退出Excel 2.2 打开和关闭工作簿 2.3 创建新工作簿 三、使用openpyxl打开和关闭Excel工作簿 3.1 打开工作簿 3.2 保存和关闭工作簿 四、案例分析 4.1 读取Exc…

linux下的虚拟化

1.下载并且安装 下载客户机和工具 完成之后打开客户机&#xff0c;并且进行安装&#xff1b;安装之后会出现配置软件的界面&#xff0c;我们按照自己的需求进行相关配置即可 这个界面会有我们需要的各种相关设置 在设置自己的超级用户密码以及自己账户及密码之后就完成了虚拟机…

家庭教育系列—投资理财

文章目录 1. 背景介绍2. 趋势容量核心模式3. 一进二模式3. 龙头博弈3.1 空间板博弈3.2 大长腿博弈3.3 反核博弈3.4 龙头反抽博弈 1. 背景介绍 要符合当前市场、顺势而为 打板也好、超短也罢&#xff0c;只是基于市场的形势战略性的选择的一个战术。不管是打板、半路、低吸&…

CAD恢复原始菜单栏

CAD2024菜单栏为ribbon功能区&#xff0c;若想恢复之前菜单栏格式&#xff0c;可采用以下方式&#xff1b;