【系统架构师】-案例篇(十四)数据库与分布式
1、规范化
不满足3NF,导致的存储异常
原关系模式
航班(航班编号,航空公司,起飞地,起飞时间,目的地,到达时间,剩余票数,票价)
代理商(代理商编号,代理商名称,客服电话,地址,负责人)
机票代理(代理商编号,航班编号,票价)
旅客(身份证号,姓名,性别,出生日期,电话)
购票(购票单号,身份证号,航班编号,搭乘日期,购票金额)
根据业务,修改后关系模式 机票代理(代理商编号,航班编号,代理商名称,客服电话,票价)
1)数据冗余:代理商名称和客服电话存在于两个关系模式,而且机票代理关系模式中,该代理商代理了多少个航班,则代理商名称和客服电话被重复存储多少次。
2)更新异常:当代理商名称或客服电话变更时,不仅需要修改代理商关系模式,还需要修改机票代理关系模式,否则会造成数据不一致。
反规范化方案
1)增加冗余列:指在多个表中具有相同的属性列,常用来在查询时避免连接操作。
2)增加派生列:指增加的列可以通过表中其他属性列加工计算生成,作用是查询时减少计算量。
3)表重组:如果需要经常查询两个表连接之后的数据,则把这两个表重新组成一个表来减少连接而提高性能。
4)表分割:通过将较大的表分割为多个较小的表来提高查询性能,包括水平分割和垂直分割。
2、不满足3NF存储的不一致解决方案
(1)通过程序实现,当修改代理商关系模式数据时,程序同步修改机票代理关系模式;
(2)通过触发器实现,在代理商关系模式上加修改触发器,当修改代理商关系模式数据时,程序同步修改机票代理关系模式。
三种方案
(1)应用程序同步:指的是通过应用程序在更新数据的同时,同步更新对应的冗余数据,这两个操作会放到同一个事务中,从而保证两个操作的原子性。
(2)触发器同步:触发器是与表事件相关的特殊存储过程,它由执行事件来触发,由数据库管理系统在后台自动执行。常见的方法是在更新数据的表上增加相应事件的触发器,在触发器内容同步更新冗余数据。强一致性
(3)批处理同步:对数据一致性要求不高的场景下。 当更新数据操作执行了一段时间后,根据更新数据进行批量的同步操作,使得冗余数据和更新数据保持一致。
3、仅剩一张机票下,两个代理商的操作如下

1)第一个代理商能够正确售票。第二个代理商查询剩余票数时正确,为l张机票但剩
余票数减一操作时出错,因为该机票已经被第一个代理商售出,此时第二个代理商无票可售。
2)并发操作会带来数据不一致问题具体为:丢失修改、读脏数据、不可重复读。
4、读写锁应用

(1)加写锁 (2)加读锁 (3)加写锁 (4)被阻塞(5)得到通知 (6)加写锁
读写锁的缺点:读写锁会造成读写操作的互相阻塞,实际使得用户的操作被串行化,降低了系统的并发性能。设计不好的情况下,可能会出现资源的交叉锁定,形成死锁。
5、分布式数据库
分布式数据库是用计算机网络将物理上分散的多个数据库单元连接起来组成的一个逻辑上统一的数据库。每个被连接起来的数据库单元称为站点或节点。
常见实现技术:读写分离、数据分片、数据索引、数据缓存、负载均衡等。
6、多读少写场景,分布式数据库实现方式
系统应采用的分布式数据库实现方式为一主多从分布、读写分离。
原因:在购物网站中,读操作远多于写操作,在原始的数据库中,当写入的时候必须要锁住数据表,当小数据量的时候并不会出现瓶颈问题。当数据量暴增时,读写数据必然会受到很大的影响。如果把读操作和写操作分离开来,性能将大大提高。
6.1、读写分离主从复制的优点
①避免数据库单点故障:主服务器实时、异步复制数据到从服务器,当主数据库宕机时,可在从数据库中选择一个升级为主服务器,从而防止数据库单点故障。
②提高查询效率:根据系统数据库访问特点,可以使用主数据库进行数据的插入、删除及更新等写操作,而从数据库则专门用来进行数据查询操作,从而将查询操作分担到不同的从服务器以提高数据库访问效率。
6.2、基于Mysql binlog分析主从复制的过程
当在从库上启动复制时,首先创建I/O线程连接主库,
主库随后创建Binlog Dump线程读取数据库事件并发送给I/O线程,
I/O线程获取到事件数据后更新到从库的中继日志Relay Log中去,
从库上的SQL线程读取中继日志Relay Log中更新的数据库事件并应用。
6.3、主从复制中同步、异步、半同步区别
(1)同步复制:主数据库需要等待所有备数据库均操作成功才可以响应用户,影响用户体验。这种方式保证了系统的一致性,但牺牲了数据的可用性。
(2)异步复制:当用户请求更新数据时,主数据库处理完请求后可直接给用户响应,而不必等待备数据库完成同步,备数据库会异步进行数据的同步,用户的更新操作不会因为备数据库未完成数据同步而导致阻塞。这种方式保证了系统的可用性,但牺牲了数据的一致性。
(3)半同步复制:用户发出写请求后,主数据库会执行写操作,并给备数据库发送同步请求,但主数据库不用等待所有备数据库回复数据同步成功便可响应用户,也就是说主数据库可以等待一部分备数据库同步完成后响应用户写操作执行成功。
6.4、Redis与Mysql一致性
读数据时先读取Redis中的key,如读到且未失效则返回key对应的数据:
如读不到或key失效,则读取数据库,并同步Redis;
写数据时先写数据库,并设置内存对应的key失效。
相关文章:
【系统架构师】-案例篇(十四)数据库与分布式
1、规范化 不满足3NF,导致的存储异常 原关系模式 航班(航班编号,航空公司,起飞地,起飞时间,目的地,到达时间,剩余票数,票价) 代理商(代理商编号…...
Golang实现递归复制文件夹
代码 package zdpgo_fileimport ("errors""os""path/filepath""strings" )// CopyDir 复制文件夹 // param srcPath 源文件夹 // param desPath 目标文件夹 // return error 错误信息 func CopyDir(srcPath, desPath string) error {…...
【漏洞复现】用友U8 CRM uploadfile 文件上传致RCE漏洞
0x01 产品简介 用友U8 Cloud是用友推出的新一代云ERP,主要聚焦成长型、创新型企业,提供企业级云ERP整体解决方案。 0x02 漏洞概述 用友 U8 CRM客户关系管理系统 uploadfle.php 文件存在任意文件上传漏洞,未经身份验证的攻击者通过漏洞上传…...
键盘盲打是练出来的
键盘盲打是练出来的,那该如何练习呢?很简单,看着屏幕提示跟着练。屏幕上哪里有提示呢?请看我的截屏: 截屏下方有8个带字母的方块按钮,这个就是提示,也就是我们常说的8个基准键位,我…...
构建sqli-labs学习环境与掌握SQL注入技术教程
根据提供的文档内容,以下是关于安装sqli-labs学习环境和SQLI-LABS教学的详细步骤和知识点: 安装sqli-labs学习环境 环境准备 操作系统:CentOS 7.6主机名:xuegod63IP地址:192.168.1.63 关闭防火墙和SELinux 禁用并…...
力扣HOT100 - 1143. 最长公共子序列
解题思路: 动态规划 class Solution {public int longestCommonSubsequence(String text1, String text2) {int m text1.length(), n text2.length();int[][] dp new int[m 1][n 1];for (int i 1; i < m; i) {char c1 text1.charAt(i - 1);for (int j 1…...
【贪心算法题目】
1. 柠檬水找零 这一个题目是一个比较简单的模拟算法,只需要根据手里的钱进行找零即可,对于贪心的这一点,主要是在20元钱找零的情况下,此时会出现两种情况:10 5 的组合 和 5 5 5 的组合,根据找零的特点&a…...
yarn常用命令
Yarn 是一个快速、可靠且安全的依赖管理工具,用于替代 npm。以下是一些常用的 Yarn 命令,用于不同的包管理和项目依赖安装场景: 初始化一个新的项目 yarn init这个命令会引导你创建一个 package.json 文件。 安装依赖 yarn add [package]…...
nginx+nginx-http-flv-module在Linux服务器搭建
需求 在服务器搭建点播/视频平台的话需要在服务器搭建nginx和rtmp模块 rtmp模块 rtmp 模块有 nginx-rtmp-module ,但是我们这里使用 nginx-http-flv-module 来替代。因为后者是基于前者开发的,前者拥有的功能后者都有,后者是国内的开发开…...
多线程(八)
一、wait和notify 等待 通知 机制 和join的用途类似,多个线程之间随机调度,引入 wait notify 就是为了能够从应用层面上,干预到多个不同线程代码的执行顺序.( 这里说的干预,不是影响系统的线程调度策略 内核里的线程调度,仍然是无序的. 相当于是在应用程序…...
投骰子——(随机游戏的控制)
精华点在于:利用封装,函数之间的良好调用,从而清晰明了的解决问题。 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> # include<stdlib.h> # include<time.h> # include"math.h" # define ARR_LEN 10 # d…...
找出最长等值子数组
问题 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。 如果子数组中所有元素都相等,则认为子数组是一个 等值子数组 。注意,空数组是 等值子数组 。 从 nums 中删除最多 k 个元素后,返回可能的最长等值子数组的长度。 子数组 是数…...
Go 切片常用操作与使用技巧
1.什么是切片 在 Go 语言中的切片(slice)是一种灵活的动态数组,它可以自动扩展和收缩,是 Go 语言中非常重要的数据结构之一。切片是基于数组实现的,它的底层是数组,可以理解为对底层数组的抽象。它会生成一…...
2024 中青杯高校数学建模竞赛(A题)数学建模完整思路+完整代码全解全析
你是否在寻找数学建模比赛的突破点?数学建模进阶思路! 作为经验丰富的数学建模团队,我们将为你带来2024 长三角高校数学建模竞赛(A题)的全面解析。这个解决方案包不仅包括完整的代码实现,还有详尽的建模过…...
开源与闭源:AI模型发展的双重路径之争
前言 随着人工智能(AI)技术的飞速发展,AI模型的应用已经渗透到各行各业,从医疗、金融到制造、教育,无不受到AI技术的深刻影响。在讨论一个AI模型“好不好”“有没有发展”时,绕不过“开源”和“闭源”两条…...
微信小程序---小程序文档配置(2)
一、小程序文档配置 1、小程序的目录结构 1.1、目录结构 小程序包含一个描述整体程序的 app 和多个描述各自页面的 page 一个小程序主体部分由三个文件组成,必须放在项目的根目录 比如当前我们的《第一个小程序》项目根目录下就存在这三个文件: 1…...
15:00面试,15:08就出来了,问的问题有点变态。。。
从小厂出来,没想到在另一家公司又寄了。 到这家公司开始上班,加班是每天必不可少的,看在钱给的比较多的份上,就不太计较了。没想到8月一纸通知,所有人不准加班,加班费不仅没有了,薪资还要降40%…...
电磁兼容(EMC):去耦电容设计详解
目录 1. 概念 2. 去耦电容工作机理 3. 去耦电容大小选择 4. 去耦电容PCB布局 电容在电路中不同作用有不同的称呼去耦电容、旁路电容、储能电容,而这些作用又可以统称为滤波。本文将详细解读一下三者之间的差别,并着重说明一下去耦电容的设计方法。 …...
《数组逆序输出》
描述 编写程序,输入10个整数n存入,再按逆序重新存放后再输出。 输入描述 输入共10个数。 输出描述 输出共1行,每个数字用空格隔开。 样例输入 1 -5 -4 -3 -2 -1 0 1 2 3 4 样例输出 1 4 3 2 1 0 -1 -2 -3 -4 -5 提示 对于100%的数据…...
必应崩了?
目录 今天使用必应发现出现了不能搜索,弹出乱码的情况。 搜了一下,发现其他人也出现了同样的问题。 使用Edge浏览器的话,可以试着改一下DNS,有可能会恢复正常(等官方修复了记得改回来) 使用谷歌浏览器打开…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
