当前位置: 首页 > news >正文

初始分布式系统和Redis特点(

(一)认识redis

    Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合,位图,hyperloglogs等数据类型。内置复制、Lua脚本、LRU收回、事务以及不同级别磁盘持久化功能,同时通过Redis Sentinel提供高可用,通过Redis Cluster提供自动分区。

   起初redis是用来作为一个“消息队列”的,简单理解就是在分布式系统下的生产者消费者模型,但是随着计算机的发展,我们很少会直接使用redis作为消息队列,反而用redis来做一些其他的事情,比如数据库。

   那之前我们学到的mysql和redis哪一个更合适我们?这里我们要先了解,redis存储数据是在内存中存储的,这就使得我们访问速度比较快,而mysql的数据是在硬盘上存储的,这就会导致我们的访问速度比较慢。但是内存空间是有限的,虽然硬盘空间也有限,但是相比内存还是大了不少。

   所以在对于性能要求比较高的情况下,我们可以选择redis,在对性能要求不高的情况下可以使用mysql。我们也可以结合redis和mysql,我们可以将需要频繁访问的数据放到redis中,其他数据放到mysql中,这样就可以解决内存不够大,且效率低的问题,但是凡事有两面性,这样会导致系统的复杂程度提升,如果数据发生修改还会涉及到redis和mysql的数据同步问题。

    这时我们就会有疑问?在内存中存储数据,但我们定义变量不也是在内存中存储的吗?为什么要使用redis,这时因为进程有隔离性,进程间的通信需要基于网络,而redis就可以通过网络将自己内存中的变量给其他进程甚至主机使用(也就是分布式系统中),如果知识单机单进程,那我们完全没有必要使用redis。

(二)分布式系统的演化过程

上述我们说了redis广泛应用于分布式系统上,那什么是分布式系统,我们来看一下他的演化过程

1.单机架构

  只有一台服务器,这个服务器会处理所有的请求,服务器中分为两个模块一个用来处理应用服务,一个用来处理数据库服务,我们也可以划分成一个模块,由着一个模块来处理业务和数据。

  其实我们大部分公司需求量没有那么大,我们现有的计算机资源即使一台主机也足够应对大部分情况,可以支持很高的并发和数据存储。

2.使用分布式系统   

但是随着业务增长,一台主机可能难以应对如此高的并发请求,所以这时候我们可以引入更多的主机和硬件资源来解决这个问题。 

 一台主机的资源包括很多比如:CPU.内存,硬盘,网络等等,服务器每收到一个请求都会消耗一定的资源,如果在高并发的情况下,我们的服务器无法支持这么多请求,就会导致服务器处理请求的速度变慢,甚至发生错误。

那我们可以通过两种方法来解决:

1.开源:引入更多资源(增加服务器,更换cpu,加内存条等等)

2.节流:通过性能测试,找到那个地方效率不高,进行优化(比较难,需要投入很多的人力物力,也不一定能优化多少)

   所以我们还是想通过开源的方式来解决服务器压力过大的场景,但是我们装过机的应该知道,电脑主板的内存条是有限的,不仅是内存条,其他资源也是有上限的,那一台主机扩展到极限,我们就需要引入多台主机,并且在软件上做出对应的调整和适配就可以解决上述服务器压力大的问题,而这种通过引入多台主机的系统方式,就可以称为分布式系统。

   这时我们可以将应用服务和数据库服务进行分离,根据内部业务的不同加强各自的硬件资源

   比如应用服务器需要处理很多业务逻辑,我们就可以加强他的cpu资源,数据库服务器需要存储大量数据,就可以增加他的硬盘空间

3.应用服务集群架构

   如果我们应用服务器的负载仍然很高,我们就需要在引入多个应用服务器,同时引入一个负载均衡,通过一个负载均衡将业务分给多个应用服务器,假设1w个用户请求,有2个应用服务器,此时按照负载均衡的方式,就可以让每个应用服务器来承担5000的访问量(这个事情和之前的多线程有些类似)。

  上述我们增加了应用服务器,但是所有数据还是要经过负载均衡器,那我们负载均衡器能不能承受住这么多数据?

  实际上负载均衡器对于请求量的承担能力要远高于应用服务器的,因为负载均衡器只是给应用服务器分配业务,并没有对数据进行处理,而且就算一个负载均衡器不够用,我们也可以引入多个。

  但除了负载均衡器,上图也只有一个存储服务器,那我们该如何解决呢?我们仍然可以使用开源,节流的方法,但在这里我们可以根据服务器的特性(存储服务器)来进行划分,我们可以将读写进行分离

   我们将存储服务器分为主服务器和多个从服务器,主服务器一般只有一个,从服务器可以有多个,主服务器用来向服务器进行写操作,从服务器数据同步主服务器,应用服务器访问时,可以更多的从从服务器中读取数据

4.引入缓存服务器(redis)

   mysql数据库最大的问题就是响应速度慢,所以我们可以将数据划分成两部分,一部分是高频使用的一般占20%,但是却能满足我们80%的数据需求,一部分是低频使用的大约占总数据的80%(我们称为28原则),我们可以将高频使用的数据放到缓存中,因为缓存的访问速度对比数据库要快很多

  那为什么要二八分呢,其实也不绝对,根据实际场景和业务的不同,会有差异,而之所以只占20%就是因为缓存虽然快,但是太小了。

   上述我们说,服务器负载过大我们可以引入从服务器来帮主服务器实现读写分离降低负载,那如果服务器的内存不够用了该怎么办?这时我们就可以引入多台主机,每个主机存储一些数据,也就是针对之前的数据库进行拆分(分库分表)

5.微服务架构

   之前一个应用服务器做了很多业务,但是这会导致服务器的代码越来越复杂,所以我们可以将这样的服务器功能进行拆分变成更小的服务器

   那我们为什么要引入微服务,就是因为代码复杂后需要更多人力资源进行维护,当人员多了,就需要配套的管理,将人员分为多个组,每个组分工进行处理所以我们需要将服务器的功能拆分由不同的组进行管理也更方便功能的复用。

   引入微服务付出的代价?

  1.系统的性能会下降:因为我们拆分成更多的服务器,那服务器之间还需要通过网络通信的方式传递数据,而网络通信的速度又很慢。

  2.系统复杂程度变高:虽然引入微服务降低了服务器的复杂程度,但是提高了系统的复杂程度,因为服务器更多,出现问题的概率就会变大,这时候我们还需要别的手段来保证不出错。

(三)一些术语的简单理解

1.应用/系统

一个应用,就是一组服务器程序

2.模块/组件

一个应用中会有很多独立的功能,就可以称为一个模块

3.分布式

引入多台主机/服务器一起完成一系列的工作

4.集群

与分布式一样,不过这里的主机不一定真的是一台计算机也可能是不同程序(逻辑上的多个主机)

5.主/从

分布式中的典型结构,服务器可分为主服务器和从服务器,从服务器中的数据要从主服务器中同步

6.中间件

和业务无关的服务比如:数据库,缓存,消息队列

7.可用性

系统整体可用的时间/总时间,就是我们的可用性

8.响应时长

衡量服务器的性能,同一功能下越小就代表服务器的性能越高

9.吞吐和并发

服务器处理请求的能力,也可以衡量服务器的性能

(四)redis的一些特性

1.In-memory data structrue

   mysql是在硬盘中通过“表”的方式来存储数据,又叫关系型数据,redis是在内存中通过“键值对”的方式存储数据,又叫非关系型数据,redis中键值对里的key都是String类型,而value可以是Strings,hashes,lists,sets等数据结构

2.Programmability

  redis是可编程的,我们针对redis的操作可以直接通过简单的交互式命令来进行操作,也可以通过脚本的方式,批量执行操作,比如我们可以使用Lua

3.Extensibility

  redis是可扩展的,redis只给我们提供了一组api,如果我们觉得redis功能不够强大,我们可以通过扩展的方式,来让redis支持更多的数据结构和更多命令(我们可以使用C,C++,Rust来进行扩展)

4.Persistence

 redis数据是可以持久化的,redis把数据存储在内存上,那我们如果开关机,我们的数据会被清空,这种情况是不允许的,所以redis也会把数据存储在硬盘上,内存为主,硬盘为辅,硬盘就相当于内存的备份,如果计算机重启内存数据丢失,我们就会加载硬盘中备份的数据

5.Clustering

   redis是支持集群的,作为一个分布式系统的组件,既然应用于分布式环境上,就要支持集群,就类似于数据库的“分库分表”,一个redis中存储数据有限,引入多个主机,部署多个redis即可

6.High availability

   redis是高可用的,reids也支持主从结构,就像服务器支持主从服务器一样,从结点就相当于主结点的备份

(五)redis为什么这么快?

1.redis数据存储在内存中,比访问硬盘的数据库快很多

2.redis核心功能都比较简单(操作内存的数据结构)

3.redis进行网络通信时使用IO多路复用

4.redis使用单线程模型(更高版本引入了多线程),减少了不必要的线程竞争引发的开销

那之前我们引入多线程不就是因为要提高效率吗?为什么在这里单线程会更快?

   其实多线程提高效率是通过我们cpu多核资源来的,所以更适用于cpu密集型任务,但是redis核心任务我们也说了,只是操作内存的数据结构,对cpu的消耗不大,所以也就不必引入多线程

(六)redis能做什么

1.数据库

   我们可以将redis作为一个数据库,那什么情况下把redis作为一个数据库呢?大多数情况下,我们首先考虑存储更多的数据而不是效率,但是在一些特定的场景下比如搜索引擎,对于性能的要求就比较高,我们需要把所有检索的数据存储在内存的,就是用类似redis这样的数据库来完成

2.缓存

   上述我们说到的二八原则就是把热点数据拿出来放在redis中,redis存的部分数据,而mysql中存储的才是全量数据,redis数据丢失也可以从mysql中加载回来

3.消息队列

  基于redis这个中间件,我们可以实现一个生产者消费者模型,优势:1.解耦合,2.削峰填谷

4.session存储

  我们知道cookie是用来实现用户身份信息的保存,但是需要session的配合,cookie本质只是在浏览器这边存了一个用户身份标识,真正存用户数据的还是服务器中的session,但是我们可能有很多应用服务器,我们登录一个服务器会给我们一个cookie,但是我们下一次访问时可能负载均衡器会给我们分配到其他的应用服务器上,就需要我们重新登录重新上面的请求

  那如何解决上面的问题?

1.想办法让负载均衡器把同一个用户的请求一直分配到同一个服务器

2.把会话数据单独分配一个服务器(redis)

相关文章:

初始分布式系统和Redis特点(

(一)认识redis Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合,位图,hyperlog…...

计算机毕业设计 家电销售展示平台的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…...

Android RecyclerView 缓存机制深度解析与面试题

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点 引言 RecyclerView 是 Android 开发中用于展示列表和网格的强大组件。它通过高效的缓存机制,优化了滑动性能和内存使用。本文将深入…...

管道缺陷检测系统源码分享

管道缺陷检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…...

python定时发送邮件的功能如何实现自动化?

Python定时发送邮件教程?如何用Python发送电子邮件? Python定时发送邮件不仅能够帮助我们自动处理日常的邮件发送任务,还能在特定时间点触发邮件发送,确保信息的及时传达。AokSend将详细探讨如何利用Python实现定时发送邮件的自动…...

工业机器人9公里远距离图传模块,无人机低延迟高清视界,跨过距离限制

在科技日新月异的今天,无线通信技术正以未有的速度发展,其中,图传模块作为连接现实与数字世界的桥梁,正逐步展现出其巨大的潜力和应用价值。今天,我们将聚焦一款引人注目的产品——飞睿智能9公里远距离图传模块&#x…...

IEEE-754 32位十六进制数 转换为十进制浮点数

要将 IEEE-754 32位十六进制数 转换为 十进制浮点数,可以使用LabVIEW中的 Type Cast 函数。以下是一些具体步骤,以及相关实例的整理: 实现步骤: 输入十六进制数:在LabVIEW中,首先需要创建一个输入控制器&am…...

XSS跨站脚本攻击及防护

什么是XSS攻击? XSS(Cross-Site Scripting,跨站脚本攻击)是一种代码注入攻击。攻击者在目标网站上注入恶意代码,当用户(被攻击者)登录网站时就会执行这些恶意代码,通过这些脚本可以读取cookie,session tokens,或者网站其他敏感的网…...

利用ClasserLoader来实现jar包加载并调用里面的方法

1.ClasserLoader介绍? classloader顾名思义,即是类加载。虚拟机把描述类的数据从class字节码文件加载到内存,并对数据进行检验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。…...

【VUE】快速上手

一、快速上手 创建HTML文件引入vue.js <script src"https://unpkg.com/vue3/dist/vue.global.js"></script> <script src"https://cdn.bootcdn.net/ajax/libs/vue/3.3.4/vue.global.prod.js"></script>按照vue.js的语法编写代码…...

在 Docker 中部署无头 Chrome:在 Browserless 中运行

什么是 Browserless&#xff1f; Browserless 是一款基于云的浏览器解决方案&#xff0c;旨在实现高效的浏览器自动化、网页抓取和测试。 它利用 Nstbrowser 的指纹库&#xff0c;实现随机指纹切换&#xff0c;确保流畅的数据收集和自动化。得益于其强大的云基础设施&#xf…...

Meta-Learning数学原理

文章目录 什么是元学习元学习的目标元学习的类型数学推导1. 传统机器学习的数学表述2. 元学习的基本思想3. MAML 算法推导3.1 元任务设置3.2 内层优化&#xff1a;任务级别学习3.3 外层优化&#xff1a;元级别学习3.4 元梯度计算3.5 最终更新规则 4. 算法合并5. 理解 MAML 的优…...

【图像匹配】基于SURF算法的图像匹配,matlab实现

博主简介&#xff1a;matlab图像代码项目合作&#xff08;扣扣&#xff1a;3249726188&#xff09; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本次案例是基于基于SURF算法的图像匹配&#xff0c;用matlab实现。 一、案例背景和算法介绍 前…...

RocketMQ实战与集群架构详解

目录 一、MQ简介 MQ的作用主要有以下三个方面 二、RocketMQ产品特点 1、RocketMQ介绍 2、RocketMQ特点 三、RocketMQ实战 1、快速搭建RocketMQ服务 2、快速实现消息收发 1. 命令行快速实现消息收发 2. 搭建Maven客户端项目 3、搭建RocketMQ可视化管理服务 4、升级分…...

docker容器中的内存占用高的问题分析

文章目录 问题描述原因分析分析1分析2验证猜想 结论和经验 问题描述 运维新增对某服务的监控后发现&#xff1a;内存不断上涨的现象。进一步确认&#xff0c;是因为有多个导出日志操作导致的内存上涨问题。 进一步的测试得出的结果是&#xff1a;容器刚启动是占用内存约为50M…...

纯血鸿蒙NEXT常用的几个官方网站

一、官方文档 https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/Readme-CN.md刚入门查看最多的就是UI开发模块&#xff0c;首先要熟悉组件使用 二、官方API参考 https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/development-i…...

A股上市公司企业创新能力、质量、效率-原始数据+dofile+结果(2006-2023年)

上市公司的创新能力体现在其不断研发新技术、新产品和服务的能力上&#xff0c;这是企业保持竞争优势的关键&#xff1b;质量则是指公司所提供的产品或服务达到高标准的程度&#xff0c;高质量是赢得客户信任和市场份额的基础&#xff1b;效率则涵盖了生产运营中的资源利用程度…...

Selenium:开源自动化测试框架的Java实战解析

背景 在软件开发领域&#xff0c;随着Web应用程序的日益复杂和快速迭代的需求&#xff0c;传统的手动测试方法已经无法满足高效、全面的测试需求。自动化测试作为一种高效、稳定的测试手段&#xff0c;逐渐成为软件开发流程中不可或缺的一环。Selenium&#xff0c;作为一款开源…...

搜索功能技术方案

1. 背景与需求分析 门户平台需要实现对服务信息的高效查询&#xff0c;包括通过关键字搜索服务以及基于地理位置进行服务搜索。面对未来可能的数据增长和性能需求&#xff0c;选择使用 Elasticsearch 来替代 MySQL 的全文检索功能。这一选择的背景与需求可以总结为以下几点&am…...

硬件体系架构的学习

硬件体系架构的学习 RISC全称Reduced Instruction Set Compute&#xff0c;精简指令集计算机&#xff1b; CISC全称Complex Instruction Set Computers&#xff0c;复杂指令集计算机。 SOC片上系统概念 System on Chip&#xff0c;简称Soc&#xff0c;也即片上系统。从狭义…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...