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

devtools/2025/1/16 3:36:38/

🌸个人主页: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不能做的事情
    • 2.4 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使用的主要是单线程模型,避免了多线程之间的线程竞争产生的不必要的开销.

虽然说redis是把数据存储在内存中的,相对与MySQL这种把数据存储在硬盘中的数据库比较快,但是和直接操作内存中的变量来相比的话(就比如在内存中直接new一个Hash表),这种就会慢的很多,这是因为redis需要通过网络来和服务器交互,是网络拖慢了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最不能做的事情就是-----存储大规模的数据.

2.4 Redis的客户端服务器结构

Redis和我们之前学过的MySQL一样,都是客户端服务器结构.当然,和MySQL一样,Redis的客户端和服务器可以在不同的主机上,也可以在不同的主机上,在同一个主机上的时候,我们就可以通过主机的环回IP通过Redis客户端来访问到Redis的服务器,在不同主机上的时候,我们需要知道服务器的IP之后,客户端才可以连接到Redis服务器.服务器和客户端之间通过网络来进行交互.
在这里插入图片描述
Redis的客户端有很多种形态.

  • 第一种就是自带命令行的客户端,这种客户端和MySQL中的小黑框差不多,它一般是安装在Linux操作系统上面的,我们可以通过redis-cli命令来打开redis的客户端,并连接到本地的服务器.当然,我们也可以通过redis-cli 主机号 -h 端口号 -p连接远程的服务器.
  • 第二种就是图形化客户端,这种客户端和MySQL中的workbeanch差不多,它一般是安装在Windows操作系统上面.这种客户端在官方网站上并没有提供出来,虽然说微软有开发这种客户端,但是它有诸多的限制,操作起来非常不方便.一般我们不用这种客户端.
  • 第三种就是基于redis提供的api自行开发的客户端,类似与MySQL中的JDBC,可以通过java代码来操作数据库.

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.ppmy.cn/devtools/111533.html

相关文章

微调大模型实践

微调大模型试验 其中,重点关注:数据清洗,数据合成方法,sft 的 task 种类、sft 的数据量级 数据加载 国内用户建议到 https://modelscope.cn/datasets 下载数据,但是下载后发现并不能和huggingface datasets无缝衔接&…

设计之道:ORM、DAO、Service与三层架构的规范探索

引言: 实际开发中,遵守一定的开发规范,不仅可以提高开发效率,还可以提高项目的后续维护性以及项目的扩展性;了解一下本博客的项目设计规范,对项目开发很有意义 一、ORM思想 ORM(Object-Relation…

【机器学习-监督学习】决策树

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈Python机器学习 ⌋ ⌋ ⌋ 机器学习是一门人工智能的分支学科,通过算法和模型让计算机从数据中学习,进行模型训练和优化,做出预测、分类和决策支持。Python成为机器学习的首选语言,…

【网络通信基础与实践第二讲】包括互联网概述、互联网发展的三个阶段、互联网的组成、计算机网络的体系结构

一、互联网概述 计算机网络是由若干节点(node)和连接这些节点的链路(link)组成。 网络之间还可以通过路由器互联起来,这就构成了一个覆盖范围更大的计算机网络。这样的网络称为互联网。 网络把许多计算机连接在一起…

Java高级Day40-QQ项目全代码

114.多用户通信系统(QQ)项目 QQServer包 //ManageClientThread// public class ManageClientThread {//返回public static HashMap<String, ServerConnectClientThread> getHm(){return hm;}private static HashMap<String,ServerConnectClientThread> hm new H…

用Python设置PDF中图片的透明度

在PDF文档的设计与内容创作过程中&#xff0c;图像的透明度设置是一个重要的操作。尤其是在处理图文密集型PDF文档时&#xff0c;设置适当的图片透明度能够极大地提升视觉表达的层次感与专业性。设置PDF图像的透明度能够让图像更好地融入背景&#xff0c;实现平滑过渡的效果&am…

git svn 日记

1. git log -p -1 --name-only 该命令用于查看最新的一次提交记录的详细信息&#xff0c;包括文件更改情况。 git log&#xff1a;显示 Git 仓库的提交历史。-p&#xff1a;显示每次提交的差异 (diff)&#xff0c;也就是文件内容的修改部分。-1&#xff1a;表示只显示最近的一…

【HTML】元素的分类(块元素、行内元素、行内块元素)

元素的分类 块元素行内元素行内块元素转换 块元素 独占一行&#xff0c;宽度默认为容器的100%&#xff0c;可以设置宽、高、行高、内外边距&#xff1b;布局时&#xff0c;块元素可以包含块元素和行内元素 <div>div</div><p>p</p><h3>h1-h6</…