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

🌸个人主页: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 单机架构](#1.1 单机架构)
    • [1.2 应用服务和数据库服务分离架构](#1.2 应用服务和数据库服务分离架构)
    • [1.3 应用服务集群架构](#1.3 应用服务集群架构)
    • [1.4 读写分离架构/主从分离架构](#1.4 读写分离架构/主从分离架构)
    • [1.5 引入缓存,冷热分离架构](#1.5 引入缓存,冷热分离架构)
    • [1.6 垂直分库](#1.6 垂直分库)
    • [1.7 微服务架构](#1.7 微服务架构)
    • [1.8 分布式系统相关概念](#1.8 分布式系统相关概念)
  • [2. Redis介绍](#2. Redis介绍)
    • [2.1 Redis的特性](#2.1 Redis的特性)
    • [2.2 Redis的使用场景](#2.2 Redis的使用场景)
    • [2.3 Redis不能做的事情](#2.3 Redis不能做的事情)
  • [3. Ubuntu上安装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服务
相关推荐
木鬼与槐3 小时前
MySQL高阶1831-每天的最大交易
数据库·mysql
晴天qt015 小时前
[mysql]mysql排序和分页
数据库·mysql
小张同学(恩师白云)6 小时前
SpringDataJPA基础增删改查
java·数据库
Jasonakeke8 小时前
【重学 MySQL】三十四、加密与解密函数
数据库·mysql
一知半解搞开发8 小时前
Mysql系列-索引简介
java·数据库·mysql
akhfuiigabv8 小时前
使用Neo4j-Cypher-FT实现自然语言查询图数据库
数据库·python·oracle·neo4j
Aa134517650258 小时前
c#中使用sql防注入方式写入数据
数据库·sql·c#
木木ainiks9 小时前
django自用教程
数据库·django·sqlite
akhfuiigabv9 小时前
探索Timescale Vector与Postgres数据库的融合:AI应用的新选择
数据库·人工智能·python
自身就是太阳9 小时前
Maven的高级特性
java·开发语言·数据库·后端·spring·maven