架构设计 相关文档,希望互相学习,****************************
****************************共同进步
知识总览
共19章内容,主要包括:
1)1绪论、2计算机系统、3信息系统、4信息安全技术、5软件工程
2)6数据库设计、7系统架构设计基础知识
3)8系统质量属性与架构评估、9软件可靠性、
10软件架构演化与维护、11未来信息综合技术
4)12信息系统架构设计、13层次式架构设计、14云原生架构设计、
15面向服务架构设计、16嵌入式系统架构设计、17通信系统架构设计、
18安全架构设计、19大数据架构设计

每天进步一点点,加油!小伙伴们!💪
本文学习 第6章 数据库设计基础知识,以下为个人笔记,希望有所帮助,共同学习。
包括:数据库基础概念、
关系数据库、
数据库设计、
应用程序与数据库交互、
NoSQL 数据库
分布式数据库
数据库优化技术
分布式缓存技术 Redis
第6章 数据库设计基础知识

本章节学习数据库基础概念、关系数据库、数据库设计、应用程序与数据库交互、NoSQL 数据库等内容。侧重于概念知识,知识点会涉及单选题(约占 2~5 分)和案例题(25 分),考查的知识点多源于教材,扩展内容较少。
6.1-6.2数据库基础概念、关系数据库
6.3-6.4 数据库设计、应用程序与数据库交互
6.5-6.6 NoSQL 数据库、分布式数据库
6.7 数据库优化技术

6.7.1 集中式数据库

集中式数据库性能优化最常见的是:反规范化设计,主要包括++增加冗余列、增加派生列、重新组 表、水平分割表、垂直分割表++。
(1)增加冗余列:是指在多个表中具有相同的列,用来在查询时避免连接操作。
(2)增加派生列:指增加的列可以通过表中其他数据计算生成,作用是在查询时减少计算量,从而加快查询速度。
(3)重新组表:指如果许多用户需要查看两个表连接出来的结果数据,则把这两个表重新组成一个表来减少连接,从而提高性能。
(4)水平分割表:按记录进行分割,把数据放到多个独立的表中,主要用于表数据规模很大、 表中数据相对独立或数据需要存放到多个介质上时使用。
(5)垂直分割表:对表进行分割,将主键与部分列放到一个表中,主键与其他列放到另一个 表中,在查询时减少 I/O 次数。
反规范化设计的优点:避免进行表之间的连接操作,从而可以提高数据操作的性能;缺点:是会造成数据的重复存储,浪费了磁盘空间,会产生数据的不一致性问题。若要避免数据不一致的问题, 可以通过设置触发器、采用事务机制(适用于单体数据库中)、应用保证(适用于异构数据库之间) 以及批处理脚本的方式。
例题:1.反规范化:是指在()阶段有意地引入冗余,以提高数据库 的读性能。
A.需求分析 B 概念结构设计 C.逻辑结构设计 D.物理结构设计
6.7.2 分布式数据库

分布式数据库的性能优化可以采用:主从复制、读写分离、分表、分库等技术。
1.主从复制
主从复制:是建立一个和主数据库完全一样的数据库环境,称为从数据库。好处是:
1)做数据的热备。作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作, 避免数据丢失。
2)架构的扩展。业务量越来越大,I/O 访问频率过高,单机无法满足,此时做多库的存储, 降低磁盘 I/O 访问的频率,提高单个机器的 I/O 性能。
3)读写分离。使数据库能支持更大的并发。
在 MySQL 数据库中,主从数据库同步的模式有全同步、半同步、异步三种方式。主从数据库之间通过 binlog(二进制日志)进行数据的同步。
binlog 日志有 3 种模式:1)基于 SQL 语句的复制:每一条更新的语句(insert、update、delete)都会记录在 binlog 中, 进而同步到从库的 relaylog 中,被从库的 SQL 线程取出来,回放执行。
该模式的优点: binlog 的 日志量可能会比较少,比如一个涉及行数为 1000 行的 update 语句,同步这一个语句,就同步了 1000 行的数据。
缺点:同步的 SQL 语句里如果含有绑定本地变量的函数、关键字,可能造成主从不一 致的情况。比如 SQL 语句中有 time 函数,如果主从数据库的服务器时间不是精确相等,就会造成结果不一致。
2)基于行的复制:不记录 SQL 语句,只记录哪个记录更新前和更新后的数据,可以保证主从之间的数据绝对相同。缺点:1 条 SQL 更新 1000 行的数据无法再偷懒,必须原原本本同步 1000 行的数据量。
3)混合复制:以上两种模式的混合,选取两者的优点。对于有绑定本地特性、评估可能造成 主从不一致的 SQL 语句,则自动选用基于行的复制,其他的选择基于 SQL 语句的复制。
2.读写分离
读写分离:设置不同的主、从数据库分别负责不同的操作。
(1)主数据库负责数据的写操作
(2)从数据库负责数据的读操作。
通过角色分担的策略,分别提升读写性能,有效减少数据并发操作的延迟。
3.分表
分表也叫分片,可以提升数据库并发以及 I/O 的性能。分表重在单个实例内部, 将一张大表分成若干小表,业务同时访问多个表。分表的方式有两种:++垂直切分、水平切分++。
(1)垂直切分:把一个大表切分为多个表,列不同。例如交易 ID、状态、用户、金额、商品等,作为一个热表;另外的 交易备注、物流信息等众多其他属性可作为另一个表。
(2)水平切分:把一个大表分为多个表,列相同、行分开,每个表都包含相同列。例如一个表包含的是交易 ID 从 1 到 999999 的交易数据,包含的是交易 ID 从 1000000 到 9999999 的交易另一个表。
4.分库
分库是:将原本存放在一个实例上众多分类的数据(表),分开存放到不同的实例上, 有利于差异化管理。
例如,一个简单的电商网站,包括用户、商品、订单三个业务模块,可以将用户数据、商品数据、订单数据分开放到三台不同的数据库服务器上,而不是将所有数据都放在一台数据库服务器上。
例题:
- 分布式数据库系统除了包含集中式数据库系统的模式结构之外,还增加了几个模式级别,其中()定义分布式数据库中数据的整体逻辑结构,使得数据使用方便,如同没有分布一样。
A. 分片模式 B.全局外模式
C. 分布模式 D. 全局概念模式
答案:D
6.8 分布式缓存技术 Redis

6.8.1 基本概念
Redis 是一种分布式缓存技术,也是一种键值对数据库类型。
Redis 用作缓存组件时,其基于内存的读写特性,比基于磁盘读写的数据库性能要高很多,适合缓存高频热点的数据, 来提高读性能,降低对数据库服务器的查询请求,提高系统性能。
Redis 以 key-value(键 值对)的形式为数据的保存格式。键(key)可以是一个字符串,值(value)可以是任意类型的数据,如整型、字符型、数组、列表、集合等。例如:键值对:("20231234","张三"),其 key:"20231234" 是该数据的唯一标识,而 value:"张三"是该数据实际存储的内容。
6.8.2 数据类型
Redis 支持的数据类型: string 、hash 、set 、list 、zset 、pub/sub 。
(1)string 类型:是 Redis 基本类型。用于缓存层或计数器,如视频播放量、文章浏览量等。
(2)hash 类型:代替 string 类型,节省空间,描述用户信息较为方便。
(3)set 类型:无序集合,每个值不能重复。可用于去重、抽奖、初始化用户池等。
(4)list 类型:双向链表结构,可以模拟栈、队列等形式。可用于回复评论、点赞。
(5)zset 类型:有序集合、每个元素有一个分数。如首页推荐 10 个最热门的帖子。
6.8.3 访问方式
引入 Redis 后,热点数据存放在 Redis 中,但由于存在"一份数据存放了多个位置",所以要考虑数据的一致性问题。
读写数据的基本步骤为:
(1)读数据:
①根据 key 读缓存;
②读取成功则直接返回;
③若 key 不在缓存中,则根据 key 读数据库;
④读取成功后,写缓存;
⑤成功返回。
(2)写数据:
①根据 key 值写数据库;
②成功后更新缓存 key 值;
③成功返回。
6.8.4 过期策略
在使用 Redis 时,一般会设置 Redis 缓存空间的大小,不会让数据无限制地存放到 Redis 中, 对于设置了过期时间的数据可以采用两种方式去淘汰这些数据:
(1)定期删除。Redis 每隔一段时间就会抽取一些设置了过期时间的 key。这里的抽取是随机 进行的,因为无法对所有的 key 进行遍历,会给系统带来很大的负担。但是这样也会导致一些 key 到了过期时间也仍然没有被删除。
(2)惰性删除。查询 key 的时候 Redis 会对 key 进行检测,发现如果已经达到过期时间,则 删除。惰性删除的缺点是如果这些过期的 key 没有被访问,那么它们就一直无法被删除,而且一直 占用内存。
除了上述两种方式,Redis 又提供了一些淘汰机制,主要有: volatile-lru(最近最少使用):从已设置过期时间的 key 中,移出最近最少使用的 淘汰。
volatile-lfu(最不经常使用):从 key 中选择最不经常使用的进行淘汰。
volatile-random(随机淘汰算法):从已设置过期时间的 key 中随机选择 key 淘汰。
volatile-ttl(生存时间淘汰):从已设置过期时间的 key 中,移出将要过期的 key。
allkeys-lru:从所有 key 中选择最近最少使用的进行淘汰。
allkeys-lfu:从所有 key 中选择最不经常使用的进行淘汰。
allkeys-random:从所有 key 中随机选择 key 进行淘汰。
6.8.5 数据持久化
在实际应用中,一旦服务器宕机,内存中的数据将全部丢失。一个解决方案是,从后端数据库恢复这些数据,但这种方式存在两个问题:
一是,需要频繁访问数据库,会给数据库带来巨大的压力;
二是,这些数据是从慢速数据库中读取出来的,性能肯定比不上从 Redis 中读取来得快,这会导致使用这些数据的应用程序响应变慢。
所以,对 Redis 实现数据的持久化,避免从后端数据库中进行恢复,是至关重要的。
6.8.6 缓存异常问题
Redis 在提高数据查询效率与保护数据库方面都起到了至关重要的作用,但是在实际应用中可能会出现 Redis 异常的情况,常见的异常问题与对应的解决方案:
(1)缓存穿透
缓存穿透:大量请求访问了没有缓存的 key,即大量的 key 在 Redis 里是不存在的,导致请求直接访问数据库,数据库压力增大。可能的原因如下:
1)恶意攻击,造成大量访问不存在的 key。例如登录时使用无效的用户名,在软考网站查询成绩时输入不存在的身份证号、准考证号。
解决方案:
①针对比较少的请求来源 IP,主动限制其访问次数,或者拉入黑名单;
②应用程序来检查 key 的合法性,提前拒绝不合法的请求;
③使用布隆过滤器。
2)大量请求访问数据库里有但 Redis 没有的 key。如:新业务刚刚上线,Redis 是空的。
解决方案:
①预热 Redis,运行一个批处理脚本,将可能会大量访问的数据预先加载到 Redis,业务再"开张";
②最前端进行流量控制,逐步把请求释放进来。给一段时间,让 Redis 逐步加载热数据;
③如果是在数据库里也没有的 key,也需要在 Redis 中设置 key,使其值为 null 或空。
(2)缓存雪崩
缓存雪崩:大量请求访问到缓存中的 key,这些 key 是存在的,但同时到了过期时间, 从而导致请求直接访问数据库,数据库压力增大。缓存雪崩可能进而影响一系列的雪崩,影响到上下游的所有应用服务。可能的原因如下:
1)Redis 故障,比如 Redis 宕机,网络出现抖动等。
解决方案:
①使用主从复制提高可用性,使用 cluster 集群方案降低故障时影响的范围;
②如果出现故障,则可以采取服务降级、熔断、限流等措施。
2)大量的 key 采用了相同的过期时间,例如在同一时刻设置了大量的 key,但过期时间都是 5 分钟。
解决方案:过期时间加上一个随机值,使得众多 key 均匀过期。
(3)缓存击穿
缓存击穿:少量热点的 key 缓存时间失效了,使得请求直接访问数据库。
可能的原因:热点的 key 设置了太短的过期时间。例如秒杀业务下的"库存数量"。
解决方案:
①将 key 设置较长的过期时间。对于非常重要的 key,则设置永久有效。但需要解决好与数据库中的 key 的一致性问题;
②使用分布式锁。如果热点 key 失效了,要控制好访问后端数据库的流量。只允许一个请求去访问数据库,取出最新的 key,存放到 Redis,其他请求则必须等待。但分布式锁也要防止出现异常的情况。
6.8.7 redis集群
Redis 也可采用集群的方式部署,包括:主从复制集群、哨兵集群、Cluster 集群方式。
集群切片的方式:主要分为++客户端分片、代理分片、服务器端分片++三种方式。
ok, 今天就到这里吧 🤗
相关系列文章,欢迎点赞、收藏,提供意见!
****
计算机系统基础知识 1分:概述、计算机硬件、计算机软件
操作系统 3分:进程管理、存储管理、文件管理、设备管理
数据库技术 3分:数据库设计、关系代数、范式、事务并发、数据库安全、新技术
嵌入式技术 3分:嵌入式硬件、嵌入式操作系统、嵌入式软件开发
计算机网络 3分(超纲较多):OSI七层模型、TCP/IP协议族、网络生命周期、IP地址
其他计算机系统基础知识 1分:计算机语言、多媒体、系统工程
系统性能 1分:性能指标、性能设计
信息系统基础知识 3分:信息系统生命周期、开发方法、五大典型系统
信息安全技术基础 5分:安全属性、信息安全技术、网络安全技术、安全协议
软件工程 12分:概述、需求工程、系统设计、运维、测试、基于构件;
面向对象技术 3分:面向对象基础、分析设计、UML关系、图
项目管理 1分:进度管理、配置管理、质量管理、风险管理
系统架构设计 20分:架构概念、生命周期、ABSD、DSSA、架构风格、
架构复用、质量属性、架构评估
软件可靠性 2分:可靠性建模、软件可靠性设计
软件架构的演化和维护1分:架构演化分类、评估、面向对象架构演化
未来信息综合技术 3分:信息物理系统、人工智能、边缘计算、机器人、数字李生、云计算
数学与经济管理 2分:最小生成树、最短路径、网络与最大流量、线性规划、决策论
知识产权和标准化 2分:知识产权属性、保护期限、产权人确定、侵权判定
专业英语 5分:完形填空,大学英语3级难度,自学
|----------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------|
| 【架构专栏】架构考试介绍 | 【架构专栏】架构知识点 |
| 【架构专栏】第1章 绪论 | 【架构专栏】第11章 未来信息综合技术 |
| 【架构专栏】第2章 计算机基础知识 | 【架构专栏】第12章 信息系统架构设计理论与实践 |
| 【架构专栏】第3章 信息系统基础知识 | 【架构专栏】第13章 层次式架构设计理论与实践 |
| 【架构专栏】第4章 信息安全技术基础知识 | 【架构专栏】第14章 云原生架构设计理论与实践 |
| 【架构专栏】第5章 软件工程基础知识 | 【架构专栏】第15章 面向服务架构设计理论与实践 |
| 【架构专栏】第6章 数据库设计基础知识 | 【架构专栏】第16章 嵌入式系统架构设计理论与实践 |
| 【架构专栏】第7章 系统架构设计基础知识 | 【架构专栏】第17章 通信系统架构设计理论与实践 |
| 【架构专栏】第8章 系统质量属性与架构评估 | 【架构专栏】第18章 安全架构设计理论与实践 |
| 【架构专栏】第9章 软件可靠性基础知识 | 【架构专栏】第19章 大数据架构设计理论与实践 |
| 【架构专栏】第10章 软件架构的演化和维护 | |
[架构专栏 知识点]
希望有所帮助,互相学习、共同进步,欢迎点赞、收藏!
