DATA STRUCTURE

《架构师训练营》之数据结构、网络通信、数据库原理

2020-07-31  本文已影响0人  anOnion

极客时间《架构师训练营》第八周学习笔记

数据结构与算法

空间复杂度和时间复杂度

算法的优劣主要从算法的执行时间和所需要占用的存储空间两个方面衡量。

数据结构

算法

网络通信

OSI 七层模型 v.s. TCP/IP 四层模型

网络传输控制协议有两种最基本的模型——OSI 和 TCP/IP 协议。如图所示:两者都是标准模型,相比之下 OSI 更为严谨详实;但是经过多年斗争,TCP/IP 胜出,因为简单粗暴才更能被广泛应用。

OSI v.s. TCP/IP

下面是 TPC/IP 各层协议,我们常听见的专业术语其实都是 TCP/IP 里某一层的协议:

模型 协议
应用层 HTTP, DNS, SSH, RPC, Telnet, FTP, SMTP
传输层 TCP, UDP
网络层 IP, ICMP, ARP
数据链路层 Ethernet, Fast Eth, Token Ring, FDDI

HTTP 协议

应用层中最最常用是 HTTP 协议;它是一种在客户端和服务器之间编码和传输数据的方法,一个请求/响应协议:客户端和服务端针对相关内容和完成状态信息的请求和响应。HTTP 是独立的,允许请求和响应流经许多执行负载均衡,缓存,加密和压缩的中间路由器和服务器。

一个基本的 HTTP 请求由一个动词(方法)和一个资源(端点)组成。 以下是常见的 HTTP 动词:

动词 描述 幂等 安全性 可缓存
GET 读取资源 Yes Yes Yes
POST 创建资源或触发处理数据的进程 No No Yes,如果回应包含刷新信息
PUT 创建或替换资源 Yes No No
PATCH 部分更新资源 No No Yes,如果回应包含刷新信息
DELETE 删除资源 Yes No No

此外还有两个动词TraceOptions用于测试或诊断,小众需求。

HTTP(HyperText Transfer Protocol)从 1989 年万维网诞生之日起就经历了众多版本迭代,早期经典版本有 1991 年出的 HTTP0.9 和 1996 年的 HTTP1.0,但是现在很少用到了。我自己最经常用的事实上是 HTTP1.1——用 Postman 调试 RESTFUL API 时能用到。

HTTP

TCP

上面提到 HTTP 是依赖于传输层协议 TCP 和 UDP 的应用层协议。我们再来看一下更低层的 TCP 协议。TCP 是通过 IP 网络的面向连接的协议。使用握手建立和断开连接。

IP

IP 是 Internet Protocol(网际互连协议)的缩写,是 TCP/IP 体系中的网络层协议,可将 IP 信息包从源设备传送到目的设备。IP 协议依赖于 IP 地址(网络中唯一的地址)和路由(传送方式)两种机制。我们最常用的负载均衡——IP 负载均衡,就是通过 IP 地址分发流量到不同的服务器中。

网络编程

Socket

回顾了 TCP/IP 模型,那计算机之间如何进行网络请求呢?用的是软件手段——Socket。

Socket 是应用层与传输层(TCP、UDP)之间的一个软件抽象层,它是一组接口。在设计模式中,Socket 其实就是一个门面模式,它把复杂的 TCP/IP 协议族隐藏在 Socket 接口后面,对用户来说,一组简单的接口就是全部,让 Socket 去组织数据,以符合指定的协议。

Socket

Socket 通信的过程如下:

  1. 服务器端先初始化 Socket,然后与端口绑定(bind),对端口进行监听(listen),调用 accept 阻塞,等待客户端连接
  2. 客户端初始化一个 Socket,然后连接(connect)服务器;如果成功,客户端与服务器端的连接就建立了
  3. 客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据
  4. 最后关闭连接,一次交互结束

Java IO

Socket 是操作系统提供给用户的网络编程接口,但是对开发来说还是过于底层。一般我们调用的是它的进一步封装,如 Java IO。

Java Blocking IO

Java IO 是 JDK java.net 下面的一组 API,调用方法如下:

  1. ServerSocket 创建并监听某端口
  2. 客户端请求连接,Socket 就返回 accept(), 然后它自己就 block 住了
  3. 之后客户端和服务器就可以互发数据了

由于 Socket 接受连接后就被 block 住了,假如你想支持并发,只能建线程池。不过线程数量有限,无法突破数量上限。

Java NIO

然后就有了改进版的 Java NIO:

Java NIO

Java NIO 知识点很多——Channel、BUffer、Selector、Selection Key。篇幅有限就不一一列举了,只说重点。Java NIO 可以提高并发量(或是不阻塞),关键点在 Selector 上:虽然和上述的 accept() 阻塞一样,调 select() 时也会阻塞;但是它可以注册多个 channel,使得单个线程可以 handle 多个连接,这样就可以应对更高的并发量了。

Selector Model

数据库原理与性能优化

数据库架构

数据库架构

索引

在几百万行的数据库里查找记录,需要全表扫描,效率很低。我们可以选择建索引提速。索引事实上就是创建一个 B+ 树(上文数据结构篇里提到了),在 O(log n) 时间内找到节点。

事务

日志

MySql 日志类型 解析说明
错误日志(error log) 当数据库启动、运行、停止时产生该日志
普通查询日志(general query log) 客户端连接数据库执行语句时产生该日志
二进制日志(binary log) 当数据库内容发生改变时产生该日志,也被用来实现主从复制功能
中继日志(relay log) 从库上收到主库的数据更新时产生该日志
慢查询日志(show query log) SQL 语句在数据库查询超过指定时间时产生该日志
DDL 日志(metadata log) 执行 DDL 语句操作元数据时产生该日志

小结

本周内容还是有点多的,光本文罗列的字数都超过 6000 了。个人觉得数据结构这部分有点乱入的感觉,还是放在第一二周的基础篇比较合适。网络通讯这块收获比较大:学生时代对各种协议还很陌生,上课如听天书(虽然考试依旧高分😅);工作了些年,那些术语总算或多或少有点听说了,这次能从 TCP/IP 分层结构中串联起来,还是挺满足的。DB 这块,内容有点少,希望听到更多的调优手段,或是防注入策略(这块面试题不少吧😄)。

上一篇下一篇

猜你喜欢

热点阅读