初始分布式系统和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? Browserless 是一款基于云的浏览器解决方案,旨在实现高效的浏览器自动化、网页抓取和测试。 它利用 Nstbrowser 的指纹库,实现随机指纹切换,确保流畅的数据收集和自动化。得益于其强大的云基础设施…...
Meta-Learning数学原理
文章目录 什么是元学习元学习的目标元学习的类型数学推导1. 传统机器学习的数学表述2. 元学习的基本思想3. MAML 算法推导3.1 元任务设置3.2 内层优化:任务级别学习3.3 外层优化:元级别学习3.4 元梯度计算3.5 最终更新规则 4. 算法合并5. 理解 MAML 的优…...
【图像匹配】基于SURF算法的图像匹配,matlab实现
博主简介:matlab图像代码项目合作(扣扣:3249726188) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本次案例是基于基于SURF算法的图像匹配,用matlab实现。 一、案例背景和算法介绍 前…...
RocketMQ实战与集群架构详解
目录 一、MQ简介 MQ的作用主要有以下三个方面 二、RocketMQ产品特点 1、RocketMQ介绍 2、RocketMQ特点 三、RocketMQ实战 1、快速搭建RocketMQ服务 2、快速实现消息收发 1. 命令行快速实现消息收发 2. 搭建Maven客户端项目 3、搭建RocketMQ可视化管理服务 4、升级分…...
docker容器中的内存占用高的问题分析
文章目录 问题描述原因分析分析1分析2验证猜想 结论和经验 问题描述 运维新增对某服务的监控后发现:内存不断上涨的现象。进一步确认,是因为有多个导出日志操作导致的内存上涨问题。 进一步的测试得出的结果是:容器刚启动是占用内存约为50M…...
纯血鸿蒙NEXT常用的几个官方网站
一、官方文档 https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/Readme-CN.md刚入门查看最多的就是UI开发模块,首先要熟悉组件使用 二、官方API参考 https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/development-i…...
A股上市公司企业创新能力、质量、效率-原始数据+dofile+结果(2006-2023年)
上市公司的创新能力体现在其不断研发新技术、新产品和服务的能力上,这是企业保持竞争优势的关键;质量则是指公司所提供的产品或服务达到高标准的程度,高质量是赢得客户信任和市场份额的基础;效率则涵盖了生产运营中的资源利用程度…...
Selenium:开源自动化测试框架的Java实战解析
背景 在软件开发领域,随着Web应用程序的日益复杂和快速迭代的需求,传统的手动测试方法已经无法满足高效、全面的测试需求。自动化测试作为一种高效、稳定的测试手段,逐渐成为软件开发流程中不可或缺的一环。Selenium,作为一款开源…...
搜索功能技术方案
1. 背景与需求分析 门户平台需要实现对服务信息的高效查询,包括通过关键字搜索服务以及基于地理位置进行服务搜索。面对未来可能的数据增长和性能需求,选择使用 Elasticsearch 来替代 MySQL 的全文检索功能。这一选择的背景与需求可以总结为以下几点&am…...
硬件体系架构的学习
硬件体系架构的学习 RISC全称Reduced Instruction Set Compute,精简指令集计算机; CISC全称Complex Instruction Set Computers,复杂指令集计算机。 SOC片上系统概念 System on Chip,简称Soc,也即片上系统。从狭义…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
day36-多路IO复用
一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...
