系统架构设计师之数据库

早期数据库有三种:层次式数据库、网络型数据库、关系型数据库。

目前常见关系型数据库和非关系型数据库。

根据数据库存储体系分:

关系型数据库:把复杂数据结构归为二元关系;

键值(Key-Value)数据库:非关系型数据库,键为唯一标识;

列存储数据库:column-Based;

文档型数据库:可以是XML、JSON、BSON格式,呈树状结构,可视为值可查的键值数据库;

搜索引擎数据库

文件系统的缺点:数据冗余(Data Redundancy)、数据不一致性(Data Inconsistency)、数据孤立(Data Isolation)

NoSql数据库:列式存储数据库、键值对存储数据库、文档型数据库、图数据库

NoSql体系框架分为4层,数据持久层(Data Persistence)、数据分布层(Data Distribution Model)、数据逻辑模型层(Data Logic Model)、接口层(接口层提供5种选择Rest\Thrift\Map/Reduce\Get/Put\特定语言API)

关系型数据库

基本术语:

主码,主键,可以唯一确定实体

候选码,关系中的某一属性或属性组的值能唯一标识一个元组

主属性,包含在任何候选码的属性

关系运算符:

自然连接(列名去重复相加,数据要选出相同)

笛卡尔积(列名相加,数据相乘)

数据库设计基本步骤:

(1)需求分析 - 数据流图、数据字典、需求说明书

(2)概念结构设计 - ER图

属性冲突、命名冲突、结构冲突

(3)逻辑结构设计 - 关系表

(4)物理设计

(5)数据库实施阶段

(6)数据库运行和维护阶段

数据模型:概念模型 - 现实世界到信息世界的第一抽象,其实就是ER图

关系模型 - 二维表的形式表示实体联系模型

网状模型

面向对象模型

数据模型三要素:数据结构(所研究对象的集合)、数据操作、数据的约束条件(一组完整性规则的集合)

分布式数据库

分布式数据库系统(Distributed DataBase System)

数据库系统结构:三级模式两级映像
外模式-以视图形式呈现
概念模式 - 以表形式呈现
内模式 - 以文件形式呈现
通过二级映像体现了逻辑和物理的两个层面的数据独立性(逻辑独立性,物理独立性)

函数依赖

范式(就是描述如何将ER图转换为关系模型)规范操作

1NF:要求数据表中的所有字段都是不可分割的原子值。

2NF:在1NF基础上,要求数据表中每个非主属性完全依赖于某一个候选键。(不能存在联合主键

3NF:在2NF基础上,要求每个非主属性不依赖于其他非主属性。(不能存在传递依赖

BCNF:在3NF基础上,避免数据冗余和不一致性。(出现更新(增删改)异常)

注:只有出度没有入度就是候选键

反规范化技术:牺牲部分规范化提高性能

反规范化技术带来问题:为了保障数据一致性,增加了数据维护的复杂度,会降低修改速度

反规范化技术方法:增加冗余列、增加派生列、重新组表、水平分割表、垂直分割表

模式分解(规范化操作的概念):通过对关系模式进行拆分,消除模式中混合组合依赖,分解为更小模式的过程。

是否保持函数依赖分解

有损无损分解

事务:由一系列DML(数据操作语言,如增删改查)操作组成,这些操作要么全做要么全不做,它从第一个DML开始,rollback或commit或DDL(数据库定义语言,表结构操作)结束。

事务四特性:原子性A tomicity、一致性C onsistency、隔离性I solation、持续性D urability。

事务的隔离性引发安全问题 - > 并发控制,控制不同事务并发执行提高效率

x锁 排它锁 写锁(加写锁后任何锁都不能再加)

S锁 共享锁 读锁 (加读锁后只能再加读锁)

一级封锁协议:加写锁 解决丢失更新问题

二级封锁协议:写加写锁,读加读锁 解决丢失更新、不可重读问题

三级封锁协议:先加读锁,再加写锁 解决丢失更新、不可重读、读脏数据问题

Redis(Remote Dictionary Server) 基于Key-Value结构的NoSql内存数据库

工作流程:

部署方式:

主从模式(主从复制)- 实现了读写分离(主写从读)和数据冗余备份,但存在主节点单点故障风险。当主节点宕机时,需要人工介入或者配合哨兵模式实现自动故障转移。

哨兵模式

Cluster集群模式

核心机制采用哈希槽机制

常见缓存问题:

1.缓存穿透 - 恶意请求大量不存在key,缓存未命中后所有请求直达数据库,导致数据库压力激增或崩溃。

解决方案

a.缓存空对象 对不存在的key缓存空值,设置短期过期时间

b.引入布隆过滤器进行拦截

2.缓存击穿 - 单个key过期瞬间,大量并发请求直达数据库,造成数据库单点压力。

解决方案

a.热点key设置永久有效(persist命令),通过主动更新保证数据新鲜

b.分布式锁(setnx),保证同一时间只有一个请求更新缓存,其余请求等待

c.热点数据预热(提前将热点key加载到缓存)

3.缓存雪崩 - 大量key在同一时间过期,导致大量请求直达数据库,引发数据库雪崩

解决方案

a.过期时间随机化(给每个key的过期时间增加随机偏移量)

b.redis集群部署(提升缓存服务可用性,避免单节点故障)

c.多级缓存(本地缓存+redis缓存)降低redis依赖

d.数据库限流、熔断(Sentinel),保护数据库不被压垮

如何保证redis和mysql数据一致性

1.先更新MySql再更新redis

2.延迟双删

相关推荐
风和先行1 小时前
Android 数据库相关学习总结
android·数据库·学习
宠友信息2 小时前
Spring Boot与异步审核构建仿小红书源码内容发布全流程
java·数据库·spring boot·redis·mysql·oracle·uni-app
2401_873479402 小时前
如何识别代理IP和伪装流量?用IP情报工具三步穿透住宅代理伪装
网络·数据库·网络协议·tcp/ip·ip
诚信定制8392 小时前
如何启动 Redis 服务:详细步骤指南
数据库·redis·缓存
AllData公司负责人2 小时前
数据同步平台|AIIData数据中台实现MySQL、Hive、Kafka 一键接入Doris
大数据·数据库·hive·mysql·kafka·实时同步
Edward111111112 小时前
一AI名词
java·开发语言·数据库·学习
hey you~3 小时前
400电话选型技术测评:一个开发视角的线路质量评估方案
运维·网络·数据库·400电话·企业通信
Database_Cool_3 小时前
实时计数器/排行榜首选:阿里云 Tair 高并发数据结构实践
数据结构·数据库·阿里云·云计算
言乐63 小时前
Python视频相对亮度检测
数据库·python·计算机视觉·小程序·音视频