【redis初阶】浅谈分布式系统
目录
一、常见概念
1.1 基本概念
2.2 评价指标(Metric)
二、架构演进
2.1 单机架构
2.2 应用数据分离架构
2.3 应用服务集群架构
2.4 读写分离/主从分离架构
2.5 引入缓存 ⸺ 冷热分离架构
2.6 数据库分库分表
2.7 业务拆分 ⸺ 引入微服务
redis学习🥳
一、常见概念
在正式引入架构演进之前,为避免读者对架构中的概念完全不了解导致低效沟通,优先对其中一些比
较重要的概念做前置介绍:
1.1 基本概念
应用(Application)/ 系统(System)
为了完成一整套服务的一个程序或者一组相互配合的程序群。生活例子类比:为了完成一项任务,而
搭建的由一个人或者一群相互配的人组成的团队。
模块(Module)/ 组件(Component)
当应用较复杂时,为了分离职责,将其中具有清晰职责的、内聚性强的部分,抽象出概念,便于理
解。生活例子类比:军队中为了进行某据点的攻克,将人员分为突击小组、爆破小组、掩护小组、通
信小组等。
分布式(Distributed)
系统中的多个模块被部署于不同服务器之上,即可以将该系统称为分布式系统。如 Web 服务器与数据
库分别工作在不同的服务器上,或者多台 Web 服务器被分别部署在不同服务器上。生活例子类比:为
了更好的满足现实需要,一个在同一个办公场地的工作小组被分散到多个城市的不同工作场地中进行
远程配合工作完成目标。跨主机之间的模块之间的通信基本要借助网络支撑完成。
集群(Cluster)
被部署于多台服务器上的、为了实现特定目标的一个/组特定的组件,整个整体被称为集群。比如多个
MySQL 工作在不同服务器上,共同提供数据库服务目标,可以被称为一组数据库集群。生活例子类
比:为了解决军队攻克防守坚固的大城市的作战目标,指挥部将大批炮兵部队集中起来形成一个炮兵
打击集群。
分布式 vs 集群。通常不用太严格区分两者的细微概念,细究的话,分布式强调的是物理形态,即工作
在不同服务器上并且通过网络通信配合完成任务;而集群更在意逻辑形态,即是否为了完成特定服务
目标。
主(Master)/ 从(Slave)
集群中,通常有一个程序需要承担更多的职责,被称为主;其他承担附属职责的被称为从。比如
MySQL 集群中,只有其中一台服务器上数据库允许进行数据的写入(增/删/改),其他数据库的数据
修改全部要从这台数据库同步而来,则把那台数据库称为主库,其他数据库称为从库。
中间件(Middleware)
一类提供不同应用程序用于相互通信的软件,即处于不同技术、工具和数据库之间的桥梁。生活例子
类比:一家饭店开始时,会每天去市场挑选买菜,但随着饭店业务量变大,成立一个采购部,由采购
部专职于采买业务,称为厨房和菜市场之间的桥梁。
2.2 评价指标(Metric)
可用性(Availability)
考察单位时间段内,系统可以正常提供服务的概率/期望。例如:年化系统可用性 = 系统正常提供服务
时长 / 一年总时长。这里暗含着一个指标,即如何评价系统提供无法是否正常,我们就不深入了。平时
我们常说的 4 个 9 即系统可以提供99.99% 的可用性,5 个 9 是 99.999% 的可用性,以此类推。我
们平时只是用高可用(High Availability HA)这个非量化目标简要表达我们系统的追求。
响应时长(Response Time RT)
指用户完成输入到系统给出用户反应的时长。例如点外卖业务的响应时长= 拿到外卖的时刻 - 完成点单
的时刻。通常我们需要衡量的是最长响应时长、平均响应时长和中位数响应时长。这个指标原则上是
越小越好,但很多情况下由于实现的限制,需要根据实际情况具体判断
吞吐(Throughput)vs 并发(Concurrent)
吞吐考察单位时间段内,系统可以成功处理的请求的数量。并发指系统同一时刻支持的请求最高量。
例如一条辆车道高速公路,一分钟可以通过 20 辆车,则并发是 2,一分钟的吞吐量是 20。实践中,
并发量往往无法直接获取,很多时候都是用极短的时间段(比如 1 秒)的吞吐量做代替。我们平时用
高并发(Hight Concurrnet)这个非量化目标简要表达系统的追求。
二、架构演进
2.1 单机架构
初期,我们需要利用我们精干的技术团队,快速将业务系统投入市场进行检验,并且可以迅速响应变
化要求。但好在前期用户访问量很少,没有对我们的性能、安全等提出很高的要求,而且系统架构简
单,无需专业的运维团队,所以选择单机架构是合适的。
用户在浏览器中输入www.bit.com,首先经过 DNS 服务将域名解析成 IP 地址 10.102.41.1,随后浏览器访问该 IP 对应的应用服务。
相关软件
Web 服务器软件:Tomcat、Netty、Nginx、Apache 等
数据库软件:MySQL、Oracle、PostgreSQL、SQL Server 等
简单来说:就是将一个项目的应用以及数据库服务部署在一台主机上,并且这台主机完全可以满足用户请求;
2.2 应用数据分离架构
随着系统的上线,我们不出意外地获得了成功。市场上出现了一批忠实于我们的用户,使得系统的访
问量逐步上升,逐渐逼近了硬件资源的极限,同时团队也在此期间积累了对业务流程的一批经验。面对当前的性能压力,我们需要未雨绸缪去进行系统重构、架构挑战,以提升系统的承载能力。但由于
预算仍然很紧张,我们选择了将应用和数据分离的做法,可以最小代价的提升系统的承载能力。
和之前架构的主要区别在于将数据库服务独立部署在同一个数据中心的其他服务器上,应用服务通过
网络访问数据。
简单来说:就是将一个项目的应用以及数据库服务分别部署在不同的主机上,并且被部署的主机根据部署的应用配置不同的资源,比如:部署应用服务的主机cpu性能好,部署数据库服务的主机存储容量多;
2.3 应用服务集群架构
我们的系统受到了用户的欢迎,并且出现了爆款,单台应用服务器已经无法满足需求了。我们的单机
应用服务器首先遇到了瓶颈,摆在我们技术团队面前的有两种方案,大家针对方案的优劣展示了热烈
的讨论:
- 垂直扩展/纵向扩展 Scale Up。通过购买性能更优、价格更高的应用服务器来应对更多的流量。这种方案的优势在于完全不需要对系统软件做任何的调整;但劣势也很明显:硬件性能和价格的增长关系是非线性的,意味着选择性能 2 倍的硬件可能需要花费超过 4 倍的价格,其次硬件性能提升是有明显上限的。
- 水平扩展/横向扩展 Scale Out。通过调整软件架构,增加应用层硬件,将用户流量分担到不同的应用层服务器上,来提升系统的承载能力。这种方案的优势在于成本相对较低,并且提升的上限空间也很大。但劣势是带给系统更多的复杂性,需要技术团队有更丰富的经验。
经过团队的学习、调研和讨论,最终选择了水平扩展的方案,来解决该问题,但这需要引入一个新的
组件 ⸺ 负载均衡:为了解决用户流量向哪台应用服务器分发的问题,需要一个专门的系统组件做流
量分发。实际中负载均衡不仅仅指的是工作在应用层的,甚至可能是其他的网络层之中。同时流量调
度算法也有很多种,这里简单介绍几种较为常见的:
- Round-Robin 轮询算法。即非常公平地将请求依次分给不同的应用服务器。
- Weight-Round-Robin 轮询算法。为不同的服务器(比如性能不同)赋予不同的权(weight),能者多劳。
- 一致哈希散列算法。通过计算用户的特征值(比如 IP 地址)得到哈希值,根据哈希结果做分发,优点是确保来自相同用户的请求总是被分给指定的服务器。也就是我们平时遇到的专项客户经理服务。
相关软件
负载均衡软件:Nginx、HAProxy、LVS、F5 等
2.4 读写分离/主从分离架构
上一节提到,我们把用户的请求通过负载均衡分发到不同的应用服务器之后,可以并行处理了,并且
可以随着业务的增长,可以动态扩张服务器的数量来缓解压力。但是现在的架构里,无论扩展多少台
服务器,这些请求最终都会从数据库读写数据,到一定程度之后,数据的压力称为系统承载能力的瓶
颈点。我们可以像扩展应用服务器一样扩展数据库服务器么?答案是否定的,因为数据库服务有其特
殊性:如果将数据分散到各台服务器之后,数据的一致性将无法得到保障。所谓数据的一致性,此处
是指:针对同一个系统,无论何时何地,我们都应该看到一个始终维持统一的数据。想象一下,银行
管理的账户金额,如果收到一笔转账之后,一份数据库的数据修改了,但另外的数据库没有修改,则
用户得到的存款金额将是错误的。
我们采用的解决办法是这样的,保留一个主要的数据库作为写入数据库,其他的数据库作为从属数据
库。从库的所有数据全部来自主库的数据,经过同步后,从库可以维护着与主库一致的数据。然后为
了分担数据库的压力,我们可以将写数据请求全部交给主库处理,但读请求分散到各个从库中。由于
大部分的系统中,读写请求都是不成比例的,例如 100 次读 1 次写,所以只要将读请求由各个从库分
担之后,数据库的压力就没有那么大了。当然这个过程不是无代价的,主库到从库的数据同步其实是
由时间成本的,但这个问题我们暂时不做进一步探讨。
应用中需要对读写请求做分离处理,所以可以利用一些数据库中间件,将请求分离的职责托管出去。
相关软件
MyCat、TDDL、Amoeba、Cobar 等类似数据库中间件等
2.5 引入缓存 ⸺ 冷热分离架构
随着访问量继续增加,发现业务中一些数据的读取频率远大于其他数据的读取频率。我们把这部分数
据称为热点数据,与之相对应的是冷数据。针对热数据,为了提升其读取的响应时间,可以增加本地
缓存,并在外部增加分布式缓存,缓存热门商品信息或热门商品的 html 页面等。通过缓存能把绝大多
数请求在读写数据库前拦截掉,大大降低数据库压力。其中涉及的技术包括:使用memcached作为本
地缓存,使用 Redis 作为分布式缓存,还会涉及缓存一致性、缓存穿透/击穿、缓存雪崩、热点数据集
中失效等问题。
相关软件:
Memcached、Redis 等缓存软件
2.6 数据库分库分表
随着业务的数据量增大,大量的数据存储在同一个库中已经显得有些力不从心了,所以可以按照业
务,将数据分别存储。比如针对评论数据,可以按照商品ID进行hash,路由到对应的表中存储;针对
支付记录,可以按小时创建表,每个小时表继续拆分为小表,使用用户ID或记录编号来路由数据。只
要实时操作的表数据量足够小,请求能够足够均匀的分发到多台服务器上的小表,那数据库就能通过
水平扩展的方式来提高性能。其中前面提到的Mycat也支持在大表拆分为小表情况下的访问控制。这种
做法显著的增加了数据库运维的难度,对DBA的要求较高。数据库设计到这种结构时,已经可以称为
分布式数据库,但是这只是一个逻辑的数据库整体,数据库里不同的组成部分是由不同的组件单独来
实现的,如分库分表的管理和请求分发,由Mycat实现,SQL的解析由单机的数据库实现,读写分离可
能由网关和消息队列来实现,查询结果的汇总可能由数据库接口层来实现等等,这种架构其实是MPP
(大规模并行处理)架构的一类实现。
相关软件
Greenplum、TiDB、Postgresql XC、HAWQ等,商用的如南大通用的GBase、睿帆科技的雪球DB、
华为的LibrA 等
2.7 业务拆分 ⸺ 引入微服务
随着人员增加,业务发展,我们将业务分给不同的开发团队去维护,每个团队独立实现自己的微服
务,然后互相之间对数据的直接访问进行隔离,可以利用 Gateway、消息总线等技术,实现相互之
间的调用关联。甚至可以把一些类似用户管理、安全管理、数据采集等业务提成公共服务。
redis学习打卡🥳
相关文章:

【redis初阶】浅谈分布式系统
目录 一、常见概念 1.1 基本概念 2.2 评价指标(Metric) 二、架构演进 2.1 单机架构 2.2 应用数据分离架构 2.3 应用服务集群架构 2.4 读写分离/主从分离架构 2.5 引入缓存 ⸺ 冷热分离架构 2.6 数据库分库分表 2.7 业务拆分 ⸺ 引入微服务 redis学习&…...

CatLog的使用
一 CatLog的简介 1.1 作用 CAT(Central Application Tracking) 是基于 Java 开发的实时应用监控平台,为美团点评提供了全面的实时监控告警服务。 1.2 组成部分 1.2.1 Transaction 1.Transaction 适合记录跨越系统边界的程序访问行为&a…...
头歌python实验:网络安全应用实践-恶意流量检测
第1关:re 库的使用 本关任务:编写一个能正则匹配出 ip 地址的小程序。 re 的主要功能函数 常用的功能函数包括: compile、search、match、split、findall(finditer)、sub(subn)。 re.search 函数 re.search 扫描整个字符串并返回第一个成功的匹配。 函数语法: re…...

大模型WebUI:Gradio全解11——Chatbots:融合大模型的多模态聊天机器人(2)
大模型WebUI:Gradio全解11——Chatbots:融合大模型的聊天机器人(2) 前言本篇摘要11. Chatbot:融合大模型的多模态聊天机器人11.2 使用流行的LLM库和API11.2.1 Llama Index11.2.2 LangChain11.2.3 OpenAI1. 基本用法2. …...

如何用 Python 实现简单的 AI 模型?
💖 欢迎来到我的博客! 非常高兴能在这里与您相遇。在这里,您不仅能获得有趣的技术分享,还能感受到轻松愉快的氛围。无论您是编程新手,还是资深开发者,都能在这里找到属于您的知识宝藏,学习和成长…...

单片机-直流电机实验
1、ULN2003芯片介绍 ULN2003, 该芯片是一个单片高电压、高电流的达林顿晶体管阵列集成电路。不仅可以用来 驱动直流电机,还可用来驱动五线四相步进电机。支持驱动大功率电器 因为 ULN2003 的输出是集电极开路,ULN2003 要输出高电平࿰…...
python【数据结构】
1. 列表 Python 中列表是可变的,这是它区别于字符串和元组的最重要的特点;即,列表可以修改,而字符串和元组不能。 以下是 Python 中列表的方法: 方法描述list.append(x)把一个元素添加到列表的结尾,相当…...

详解Sonar与Jenkins 的集成使用!
本文阅读前提 本文假设读者熟悉Jenkins和SonarQube的基础操作。 核心实现功能 Jenkins中运行的job来调用SonarScanner,最后可实现测试结果与SonarQube中同步查看。 Jenkins中安装Sonar相关插件 配置Sonarqube Dashboard>Manage Jenkins>Systems 指定son…...

《笔记》青蛙跳台阶——斐波那契数列
斐波那契数列 斐波那契数列(Fibonacci Sequence)是一个经典的数学数列,其特点是每一项都是前两项的和。数列的前两项通常定义为 0 和 1(或 1 和 1),后续每一项都是前两项的和。 斐波那契数列的定义 斐波那…...

SpringBoot3动态切换数据源
背景 随着公司业务战略的发展,相关的软件服务也逐步的向多元化转变,之前是单纯的拿项目,赚人工钱,现在开始向产品化\服务化转变。最近雷袭又接到一项新的挑战:了解SAAS模型,考虑怎么将公司的产品转换成多租…...

OSPF - 特殊区域
OSPF路由器需要同时维护域内路由、域间路由、外部路由信息数据库。当网络规模不断扩大时,LSDB规模也不断增长。如果某区域不需要为其他区域提供流量中转服务,那么该区域内的路由器就没有必要维护本区域外的链路状态数据库。 OSPF通过划分区域可以减少网…...
Linux 系统下磁盘相关指令:df、du、fdisk、lsblk
文章目录 I df、du、fdisk、lsblk指令df命令用于显示文件系统的磁盘空间使用情况du命令用于估算目录或文件的磁盘空间使用情况fdisk命令用于对磁盘进行分区操作lsblk指令查看设备信息II 应用du估算目录或文件的磁盘空间使用情况lsblk查看服务器上查看硬盘个数III 知识扩展磁盘阵…...
基于单片机的肺功能MVV简单测算
肺功能MVV一般是指肺部每分钟的最大通气量。 MVV本身是最大值的英文缩写,在临床上,肺功能MVV表示肺部每分钟最大通气量,用以衡量气道的通畅度,以及肺部和胸廓的弹性、呼吸肌的力量。 肺部每分钟的最大通气量的参考值男性与女性之…...

如何用Python编程实现自动整理XML发票文件
传统手工整理发票耗时费力且易出错,而 XML 格式发票因其结构化、标准化的特点,为实现发票的自动化整理与保存提供了可能。本文将详细探讨用python来编程实现对 XML 格式的发票进行自动整理。 一、XML 格式发票的特点 结构化数据:XML 格式发票…...

腾讯云AI代码助手编程挑战赛-百事一点通
作品简介 百事通问答是一款功能强大的智能问答工具。它依托海量知识储备,无论你是想了解生活窍门、学习难点,还是工作中的专业疑惑,只需输入问题,就能瞬间获得精准解答,以简洁易懂的方式呈现,随时随地为你…...
Spring学习笔记1
目录 1 什么是spring2 spring的优势3 IOC的概念和作用3.1 无参数构造函数的实例化方式3.2 使用工厂中的普通方法实例化对象 4 Bean4.1 Bean相关概念4.2 Bean对象的作用范围 5 DI5.1 构造函数注入5.2 set方法注入5.3 复杂类型数据注入5.4 基于注解的IOC5.4.1 包扫描5.4.2 Compon…...
LeetCode 2185. Counting Words With a Given Prefix
🔗 https://leetcode.com/problems/counting-words-with-a-given-prefix 题目 给一个字符串数组,返回其中前缀为 pref 的个数 思路 模拟 代码 class Solution { public:int prefixCount(vector<string>& words, string pref) {int count…...

图漾相机基础操作
1.客户端概述 1.1 简介 PercipioViewer是图漾基于Percipio Camport SDK开发的一款看图软件,可实时预览相机输出的深度图、彩色图、IR红外图和点云图,并保存对应数据,还支持查看设备基础信息,在线修改gain、曝光等各种调节相机成像的参数功能…...
前端开发中页面优化的方法
前端页面优化是指通过改进网页的加载速度、提高用户体验和SEO优化等手段来优化页面性能的过程。以下是一些常见的前端页面优化方法: 压缩和合并文件:通过压缩CSS和JavaScript文件,并将多个文件合并成一个文件,减少网络传输和HTTP请…...

Qt QDockWidget详解以及例程
Qt QDockWidget详解以及例程 引言一、基本用法二、深入了解2.1 窗口功能相关2.2 停靠区域限制2.3 在主窗体布局 引言 QDockWidget类提供了一个可以停靠在QMainWindow内的小窗口 (理论上可以在QMainWindow中任意排列),也可以作为QMainWindow上的顶级窗口浮动 (类似一…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...

EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...