软件开发工程师知识整理(持续更新)

1 计算机科学

1.1 数据结构

数据:客观事物的符号表示,是所有能输入到计算机中并能被计算机程序处理的符号的总称。

数据元素:数据的基本单位,也称元素、记录。(单元格)

数据项:组成数据的、有独立含义的、不可分割的最小单位。(行)

数据对象:性质相同的数据元素的集合。(列)

数据结构:相互之间存在一种或多种特定关系的数据元素的集合。

关心数据元素之间的相互关系与组织方式、运算及规则,不涉及数据元素的具体内容

数据类型:一个值的集合和定义在这个值集上的一组操作的总称。

抽象数据类型:由用户定义的、表示应用问题的数学模型,以及定义在这个模型上的一组操作的总称,具体包括三部分:数据对象、数据对象上关系的集合以及对数据对象的基本操作的集合。

1.1.1 逻辑结构

逻辑结构的两个要素:数据元素、关系。

  • 集合结构:数据元素除了同属一个集合的关系外,别无其他关系。
  • 线性结构:数据元素之间存在一对一关系。
  • 树形结构:数据元素之间存在一对多关系。
  • 图结构或网状结构:数据元素之间存在多对多关系。

软件开发工程师知识整理(持续更新)_第1张图片

1.1.2 存储结构

数据对象在计算机中的存储表示称为数据的存储结构,也称为物理结构。

  • 顺序存储结构:顺序存储结构是借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系,通常借助程序设计语言的数组类型来描述。
  • 链式存储结构:无需占用一整块存储空间,为了表示结点之间的关系, 需要给每个结点附加指针字段,用于存放后继元素的存储地址,通常借助于程序设计语言的指针类型来描述。

数组

定义:数组是最简单、也是使用最广泛的数据结构。每个数据元素都关联一个正数值,我们称之为索引,它表明数组中每个元素所在的位置。大部分语言将初始索引定义为0。

分类:一维数组、多维数组(数组的数组)。

存储结构:顺序存储。

基本操作:插入元素、删除元素、返回数组元素数量、返回指定索引位置的元素。

字符串

定义:字符串本质是指含有字符的数组。

定义:只能在表的一端(栈顶)进行插入和删除运算的线性表。

逻辑结构:与线性表相同,为一对一关系。

存储结构:用顺序栈或链栈存储均可,但以顺序栈更常见。

运算规则:只能在栈顶运算,且访问结点时依照后进先出(LIFO)或先进后出(FILO)的原则。

实现方式:关键是编写入栈和出栈函数,具体实现依顺序栈或链栈的不同而不同。

基本操作:入栈、出栈、读栈顶元素值、建栈、判断栈满、栈空等。

队列

定义:只能在表的一端(队尾)进行插入,在另一端(队头)进行删除运算的线性表。

逻辑结构:与线性表相同,为一对一关系。

存储结构:用顺序队列或链队存储均可。

运算规则:先进先出(FIFO)。

实现方式:关键是编写入队和出队函数,具体实现依顺序队或链队的不同而不同。

基本操作:初始化队列、入队、出队、读队头元素、判队空操作等。

顺序队列

暂无

循环队列

暂无

链队列

暂无

链表

定义:采用链式存储结构的线性表称为链表 。

逻辑结构:与线性表相同,为一对一关系。

存储结构:链队存储。

实现方式:每个节点包含着数据和指向后续节点的指针。 链表还包含一个头指针,它指向链表的第一个元素,但当列表为空时,它指向null或无具体内容。

基本操作:初始化链表、取值、查找、插入、删除、建立链表、求链表长度等。

扩展:单链表、双向链表

定义:树是n(n≥0)个结点的有限集合T。

逻辑结构:一对多关系。

存储结构:用顺序队列或链队存储均可。

  • 根: 即根结点(没有前驱)
  • 森林:指m棵不相交的树的集合
  • 有序树:结点各子树从左至右有序,不能互换(左为第一)
  • 无序树:结点各子树可互换位置。

相关概念:

  • 结点:包含一个数据元素及若干指向其它结点的分支信息。
  • 结点的度:一个结点的子树个数称为此结点的度。
  • 叶结点:度为0的结点,即无后继的结点,也称为终端结点。
  • 分支结点:度不为0的结点,也称为非终端结点。
  • 孩子结点:一个结点的直接后继称为该结点的孩子结点。
  • 双亲结点:一个结点的直接前驱称为该结点的双亲结点。
  • 兄弟结点:同一双亲结点的孩子结点之间互称兄弟结点。
  • 祖先结点:一个结点的祖先结点是指从根结点到该结点的路径上的所有结点。
  • 子孙结点:一个结点的直接后继和间接后继称为该结点的子孙结点。
  • 树的度: 树中所有结点的度的最大值。
  • 结点的层次:从根结点开始定义,根结点的层次为1,根的直接后继的层次为2,依此类推。
  • 树的高度(深度): 树中所有结点的层次的最大值。

基本操作:插入、删除、修改、查找和排序。

二叉树

定义:我们把满足以下两个条件的树形结构叫做二叉树(Binary Tree):

1.每个结点的度都不大于2;
2.每个结点的孩子结点次序不能任意颠倒。

特点:

结点的度小于等于2
有序树(子树有序,不能颠倒)

特殊的二叉树:

满二叉树:一棵深度为k 且有2k -1个结点的二叉树。(特点:每层都“充满”了结点)。满二叉树是完全二叉树的一个特例。

完全二叉树:深度为k 的,有n个结点的二叉树,当且仅当其每一个结点都与深度为k 的满二叉树中编号从1至n的结点一一对应

性质:

在二叉树的第i层上至多有2^(i-1)个结点

深度为k的二叉树至多有2^k-1个结点

对于任何一棵二叉树,若2度的结点数有n2个,则叶子数n0必定为n2+1 (即n0=n2+1

具有n个结点的完全二叉树的深度必为log2n+1

对完全二叉树,若从上至下、从左至右编号,则编号为i 的结点,其左孩子编号必为2i,其右孩子编号必为2i+1;其双亲的编号必为i/2。

存储结构:顺序存储结构和链式存储结构。

遍历:

DLR—先序遍历,即先根再左再右
LDR—中序遍历,即先左再根再右
LRD—后序遍历,即先左再右再根

由遍历确定二叉树:由二叉树的前序序列和中序序列或者后序序列和中序序列可唯一地确定一棵二叉树

规律(前,中):在前序序列中找根;到中序序列中分左右。

规律(中,后):在后序序列中找根;到中序序列中分左右。

哈夫曼树

暂无

字典树

定义:字典树,也称为“前缀树”,是一种特殊的树状数据结构,对于解决字符串相关问题非常有效。它能够提供快速检索,主要用于搜索字典中的单词,在搜索引擎中自动提供建议,甚至被用于IP的路由。

性质:

根节点不包含字符,除根节点外每一个节点都只包含一个字符;
从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串;
每个节点的所有子节点包含的字符都不相同。

基本操作:查找、插入和删除(比较少见)。

实现方法:

  1. 从根结点开始一次搜索;

  2. 取得要查找关键词的第一个字母,并根据该字母选择对应的子树并转到该子树继续进行检索;

  3. 在相应的子树上,取得要查找关键词的第二个字母,并进一步选择对应的子树进行检索。

  4. 迭代过程……

  5. 在某个结点处,关键词的所有字母已被取出,则读取附在该结点上的信息,即完成查找。

    其他操作类似处理

森林

暂无

定义:Graph=(V,E)
V:顶点(数据元素)的有穷非空集合;
E:边的有穷集合。

逻辑结构:多对多关系。

存储结构:邻接矩阵表示法(顺序)邻接表(链式)。

类型:有向图和无向图。

基本操作:遍历:深度优先遍历、广度优先遍历。

定义:堆通常是一个可以被看做一棵完全二叉树的数组对象。

堆中某个节点的值总是不大于或不小于其父节点的值;
堆总是一棵完全二叉树。

逻辑结构:一对多关系。

基本操作:上浮、下沉、插入、弹出、取顶、堆排序。

大顶堆:每个结点的值都大于或等于其左右孩子结点的值。

小顶堆:每个结点的值都小于或等于其左右孩子结点的值。

散列表(哈希表)

定义:散列表(哈希表)是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。

影响性能的3个因素:

  • 哈希函数
  • 哈希表的大小
  • 碰撞处理方法

常用方法:

  • 直接寻址法:取关键字或关键字的某个线性函数值为散列地址。
  • 数字分析法
  • 平方取中法:当无法确定关键字中哪几位分布较均匀时,可以先求出关键字的平方值,然后按需要取平方值的中间几位作为哈希地址。
  • 折叠法:将关键字分割成位数相同的几部分,最后一部分位数可以不同,然后取这几部分的叠加和(去除进位)作为散列地址。
  • 随机数法:选择一随机函数,取关键字的随机值作为散列地址,即H(key)=random(key)其中random为随机函数,通常用于关键字长度不等的场合。
  • 除留余数法:取关键字被某个不大于散列表表长m的数p除后所得的余数为散列地址。

处理冲突:

  • 开放寻址法:线性探测再散列、二次探测再散列、伪随机探测再散列。
  • 再散列法
  • 链地址法(拉链法)
  • 建立一个公共溢出区

1.2 算法

算法:算法是为了解决某类问题而规定的一个有限长的操作序列。

1.2.1 一个算法必须满足以下五个重要特性

  1. 有穷性。一个算法必须总是在执行有穷步后结束,且每一步都必须在有穷时间内完成。
  2. 确定性。对千每种情况下所应执行的操作,在算法中都有确切的规定,不会产生二义性,使算法的执行者或阅读者都能明确其含义及如何执行。
  3. 可行性。算法中的所有操作都可以通过已经实现的基本操作运算执行有限次来实现。
  4. 输入。一个算法有零个或多个输入。当用函数描述算法时,输入往往是通过形参表示的,在它们被调用时,从主调函数获得输入值。
  5. 输出。一个算法有一个或多个输出,它们是算法进行信息加工后得到的结果,无输出的算法没有任何意义。当用函数描述算法时,输出多用返回值或引用类型的形参表示。

1.2.2 评价算法优劣的基本标准

  1. 正确性。在合理的数据输入下,能够在有限的运行时间内得到正确的结果。
  2. 可读性。一个好的算法,首先应便于人们理解和相互交流, 其次才是机器可执行性。可读性强的算法有助于人们对算法的理解,而难懂的算法易千隐藏错误,且难千调试和修改。
  3. 健壮性。当输入的数据非法时,好的算法能适当地做出正确反应或进行相应处理,而不会产生一些莫名其妙的输出结果。
  4. 高效性。高效性包括时间和空间两个方面。时间高效是指算法设计合理,执行效率高,可以用时间复杂度来度量;空间高效是指算法占用存储容量合理,可以用空间复杂度来度量。时间复杂度和空间复杂度是衡量算法的两个主要指标。

1.2.3 时间复杂度

问题规模:问题规模是算法求解问题输入量的多少,是问题大小的本质表示,一般用整数n表示。

语句频度:一条语句的重复执行次数。

时间复杂度:一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),存在一个正常数c使得fn*c>=T(n)恒成立。记作T(n)=O(f(n)),称O(f(n))为算法的渐进时间复杂度,简称时间复杂度。

时间复杂度比较

O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n)

常见算法的时间复杂度

1.2.4 空间复杂度

空间复杂度:指算法在计算机内执行时所需存储空间的度量。

记作:S(n)=O(f(n))

算法执行期间所需要的存储空间包括3个部分:

  • 算法程序所占的空间;
  • 输入的初始数据所占的存储空间;
  • 算法执行过程中所需要的额外空间。

在许多实际问题中,为了减少算法所占的存储空间,通常采用压缩存储技术。

1.3 数据库

数据库(DB):长期保存在计算机的存储设备上,按照一定规则组织起来,可以被用于或应用共享的数据集合。

数据库管理系统(DBMS):指一种操作和管理数据库的大型软件,用于建立、使用和维护数据库,对数据库进行统一管理和控制,以保证数据库的安全性和完整性。用户通过数据库管理系统访问数据库中的数据。

数据库系统(DBS):在计算机系统中引入数据库后的系统,通常由计算机硬件、软件、数据库管理系统和数据库管理员组成。

SQL:结构化查询语言

1.3.1 数据库分类

  • 关系数据库:MySQL、Oracle、DB2、SQL Sever、PostgreSQL
  • 非关系数据库:MongoDB

1.3.2 事物

事务:数据库事务是构成单一逻辑工作单元的操作集合。

  • 数据库事务可以包含一个或多个数据库操作,但这些操作构成一个逻辑上的整体。
  • 构成逻辑整体的这些数据库操作,要么全部执行成功,要么全部不执行。
  • 构成事务的所有操作,要么全都对数据库产生影响,要么全都不产生影响,即不管事务是否执行成功,数据库总能保持一致性状态。
  • 以上即使在数据库出现故障以及并发事务存在的情况下依然成立。

事务的ACID特性

  • 原子性(Atomicity):事务中的所有操作作为一个整体像原子一样不可分割,要么全部成功,要么全部失败。
  • 一致性(Consistency):事务的执行结果必须使数据库从一个一致性状态到另一个一致性状态。
    一致性状态是指:
    • 系统的状态满足数据的完整性约束(主码,参照完整性,check约束等)
    • 系统的状态反应数据库本应描述的现实世界的真实状态,比如转账前后两个账户的金额总和应该保持不变。
  • 隔离性(Isolation):并发执行的事务不会相互影响,其对数据库的影响和它们串行执行时一样。比如多个用户同时往一个账户转账,最后账户的结果应该和他们按先后次序转账的结果一样。
  • 持久性(Durability):事务一旦提交,其对数据库的更新就是持久的。任何事务或系统故障都不会导致数据丢失。

数据库事务的4种隔离级别(从低到高)

  • 读未提交(READ UNCOMMITTED):这种隔离级别,其他事务会读到当前事务未提交的数据。
  • 读已提交(READ COMMITTED):这种隔离级别下,其他事务只能读到当前事务已经提交的数据。
  • 可重复读(REPEATABLE READ):这种隔离级别下,其他事务不能进行update操作,但是可以进行add操作。MySQL默认的隔离级别
  • 串行化(SERIALIZABLE):这种隔离级别下事务依次执行(单线程),会造成大量的超时和阻塞等待。

事务具有隔离性,理论上来说事务之间的执行不应该相互产生影响,其对数据库的影响应该和它们串行执行时一样。然而完全的隔离性会导致系统并发性能很低,降低对资源的利用率,因而实际上对隔离性的要求会有所放宽,这也会一定程度造成对数据库一致性要求降低。事务的隔离级别越低,可能出现的并发异常越多,但是通常而言系统能提供的并发能力越强。

软件开发工程师知识整理(持续更新)_第2张图片

对应关系只是理论上的,对于特定的数据库实现不一定准确,比如MySql的Innodb存储引擎通过Next-Key Locking技术在可重复读级别就消除了幻读的可能。

所有事务隔离级别都不允许出现脏写,而串行化可以避免所有可能出现的并发异常,但是会极大的降低系统的并发处理能力。

数据库并发异常

  • 脏写:一个客户端覆盖写入了另一个客户端尚未提交的写入。几乎所有的事务实现都可以防止脏写。
  • 脏读:A事务对表数据更新,B事务读到了,然后A事务回滚,则B事务读到的数据为‘脏数据‘。
  • 不可重复读:A事务读取表中的数据,B事务更改了该表中的数据,并提交,这样A事务再次刷新,得到的数据前后不一致。
  • 幻读:A事务正在统计表中数据,B事务增加了几条数据,这样数据突然增加,好像产生了幻觉。
  • 更新丢失:A事务读取表中数据,B事务进来更新一条数据结束,A事务再次更新相同行数据。

1.3.3 范式

范式:当设计关系数据库时,需要遵从不同的规范和要求,设计出合理的关系型数据库,这些不同的规范被称为范式,越高的范式数据库冗余越小。一般来说,数据库只需满足第三范式(3NF)就行了。

  • 第一范式(1NF):数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。
  • 第二范式(2NF):要求数据库表中的每个实例或记录必须可以被唯一地区分。
  • 第三范式(3NF):要求一个关系中不包含已在其它关系已包含的非主关键字信息。
  • 巴斯-科德范式(BCNF):任何非主属性不能对主键子集依赖。
  • 第四范式(4NF)
  • 第五范式(5NF,又称完美范式)

范式的优点:

  • 消除重复数据
  • 减少数据冗余
  • 保持数据的一致性

范式的缺点:

  • 使查询变得相当复杂

1.1.4 反范式

范式越高,设计的表越可能越多,关系可能越复杂,但性能却不一定越好。

反范式的设计模式中,可以允许适当的数据冗余,用这个冗余可以缩短查询获取数据的时间。

优点:

  • 减少数据库的连接次数
  • 可以更好的利用索引进行筛选和排序,从而减少I/O数据量,提高查询效率

缺点

  • 数据存在重复冗余,存在部分空间浪费。
  • 为了保持数据一致性,必须维护冗余部分,增加了维护的复杂性。

常见的数据库反范式技术

  • 增加冗余列:在多个表中保留相同的列。
  • 增加派生列:表中增加由本表或其他表中数据计算生成的列。
  • 表水平分割:根据一列或多列的值将数据放到多个独立的表中。
  • 表垂直分割:对表进行分割,将主键和一部分列放到一个表中,将主键和其他列放在另一个表中。

1.3.5 索引

索引:索引是对数据库表中一列或多列的值进行排序的一种结构。

为什么数据要用索引?

提升检索速度、加速表与表之间的连接。

索引的种类有哪些?分别的特点是什么?

  • 普通索引:加速查询
  • 唯一索引:加速查询 + 列值唯一 + 可以为null
  • 主键索引:加速查询 + 列值唯一 + 不可为null + 表中只有一个
  • 组合索引:多列值组成一个索引,专用于组合搜索,效率大于索引合并
  • 全文索引:对文本的内容进行分词,进行搜索

索引的使用原则

  • 在大表建立索引才有意义。
  • 在WHERE字句或连接条件经常引用的列建立索引。
  • 索引的层次不要超过4层。
  • 如果某属性经常做最大值或最小值等聚焦函数,那么考虑为该属性建立索引。
  • 经常出现在关键字ORDER BY、GROUP BY、DISTINCT后面的字段,最好建立索引。
  • 索引应该建立在小字段上,CLOB、TEXT、IMAGE和BIT的数据类型不适合建立索引。
  • 表的主键、外键必须建立索引。
  • 创建了主键和唯一性约束后会创建唯一索引。
  • 多索引列的时候,由左到右索引。
  • 删除无用索引。索引有助提高检索性能,但是过多或不当的索引会导致系统低效。

1.3.6 存储过程

存储过程是用户定义的一系列SQL语句的集合,涉及特定表或其他对象的任务,用户可以调用存储过程。

存储过程用于执行特定操作,可以接受输入参数、输出参数、返回单个或多个结果集。

存储过程的优点

  • 增强了SQL语句的功能和灵活性。

  • 存储过程可以保证数据的安全性。

  • 不需要反复建立一系列处理步骤,保证了数据的完整性。

  • 极大的改善数据库性能。

  • 降低了网络的通信量,客户端调用存储过程只需要传存储过程名和相关参数即可,与传输SQL语 句相比自然数据量少了很多。

  • 可以实现集中控制,当规则发生改变时,只需要修改存储过程就可以啦。

存储过程的缺点

  • 调试不是很方便
  • 可能没有创建存储过程的权利
  • 重新编译问题
  • 移植性问题

1.3.7 函数

函数通常是数据库已定义的方法,它接收参数并返回某种类型的值并且不涉及特定用户表。

函数和存储过程的区别

  • 标识符不同:函数的标识符为FUNCTION,存储过程为PROCEDURE。
  • 返回值不同:函数的有且只有一个返回值,存储过程可以有多个返回值。
  • 函数可以在SELECT语句中直接使用,而存储过程不行。
  • 存储过程无返回值类型,不能将结果赋值给变量。函数有返回值类型,在调用函数时,处理在SELECT语句中,其他情况都必须把函数的返回值赋值给对象。

函数和存储过程都可以有输入参数,都是由一系列SQL语句组成的。

1.3.8 触发器

触发器(TRIGGER)是数据库提供给程序员和DBA 用来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,是用户定义在表上的一类由事件驱动的特殊过程。触发器的执行不是由程序调用,也不是由手工启动,而是由事件来触发的。其中,事件是指用户对表的增(INSERT)、删(DELETE)、改(即更新UPDATE)等操作。触发器经常被用于加强数据的完整性约束和业务规则等。

  • 触发器在数据库里以独立的对象存储
  • 触发器是当某个事件发生时自动地隐式运行
  • 触发器被事件触发。运行触发器叫作触发或点火(FIRING),用户不能直接调用触发器。
  • 触发器不能接收参数

触发器和存储过程的区别

  • 存储过程是由用户或者应用程序显式调用的。
  • 触发器是不能被直接调用的,而是由一个事件来触发运行,即触发器是当某个事件发生时隐式调用的。

触发器的作用

  • 可维护数据库的安全性、一致性和完整性。
  • 可在写入数据表前,强制检验或转换数据。
  • 当触发器发生错误时,异常的结果会被撤销。
  • 部分数据库管理系统可以针对数据定义语言(DDL)使用触发器,称为DDL 触发器,还可以针对视图定义替代触发器(INSTEAD OF)。

触发器的优点

  • 触发器可通过数据库中的相关表实现级联更改。
  • 触发器可以评估数据修改前后的表的状态,并根据其差异采取对策。

触发器的缺点

  • 滥用触发器会造成数据库及应用程序的维护困难。

1.3.9 视图

视图是由数据库的基本表中选取处理的数据组成的逻辑窗口,它不同于基本表,它是一个虚拟表,其内容有查询定义。

数据库只存储视图的定义,不存储视图的数据。

只有在使用视图时,才会执行视图的定义,从基本表中查询数据。

视图的作用

  • 逻辑上的独立性,屏蔽了真实表的结构带来的影响。
  • 安全性,用户只能查询和修改能看到的数据。
  • 简化结构,执行复杂的查询操作。
  • 使用户能以多角度、更灵活地观察和共享同一数据。

视图的优点

  • 使用户将注意力集中在其关心的数据上,而不是全部数据,提供运行效率和用户满意度。
  • 视图可以使多表多视图下的复杂查询变得简单可行。
  • 视图增加了数据的安全性。

视图的缺点

  • 性能差:视图的一个简单查询,数据库也要把它变成一个复杂的结合体,需要花费一定的时间。
  • 修改限制:当用户试图修改视图的某些信息时,数据库必须把它转化为对基本表的某些信息的修改,对于比较复杂的试图,可能是不可修改的。

1.3.10 SQL注入

SQL注入:通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意SQL命令的目的。

永远不要信任用户的输入,必须认定用户的输入的数据是不安全的,对用户输入的数据都必须进行过滤处理。

注意

  • 永远不要相信用户的输入,对所有输入进行效验。
  • 永远不要使用动态拼装SQL,可以使用参数化的SQL或直接使用存储过程进行数据查询和存取。
  • 永远不要使用管理员权限连接数据库,应为每个应用赋予单独的权限。
  • 对敏感信息进行加密处理。
  • 应用的异常信息应该尽可能少的提示,最好使用自定义错误信息对原始错误进行包装。

1.3.11 锁

:锁机制用于对共享资源的并发访问,用于多用户环境下,可以保证数据库的完整性和一致性。

  • 共享锁(S锁):如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁。获准共享锁的事务只能读数据,不能修改数据。
  • 排他锁(X锁):如果事务T对数据A加上排他锁后,则其他事务不能再对A加任任何类型的封锁。获准排他锁的事务既能读数据,又能修改数据。

表级锁

表级别的锁定是MySQL各存储引擎中最大颗粒度的锁定机制。该锁定机制最大的特点是实现逻辑非常简单,带来的系统负面影响最小。所以获取锁和释放锁的速度很快。由于表级锁一次会将整个表锁定,所以可以很好的避免困扰我们的死锁问题。当然,锁定颗粒度大所带来最大的负面影响就是出现锁定资源争用的概率也会最高,致使并大度大打折扣。

行级锁

行级锁定最大的特点就是锁定对象的颗粒度很小,也是目前各大数据库管理软件所实现的锁定颗粒度最小的。由于锁定颗粒度很小,所以发生锁定资源争用的概率也最小,能够给予应用程序尽可能大的并发处理能力而提高一些需要高并发应用系统的整体性能。虽然能够在并发处理能力上面有较大的优势,但是行级锁定也因此带来了不少弊端。由于锁定资源的颗粒度很小,所以每次获取锁和释放锁需要做的事情也更多,带来的消耗自然也就更大了。此外,行级锁定也最容易发生死锁。

页面锁

页级锁定是MySQL中比较独特的一种锁定级别,在其他数据库管理软件中也并不是太常见。页级锁定的特点是锁定颗粒度介于行级锁定与表级锁之间,所以获取锁定所需要的资源开销,以及所能提供的并发处理能力也同样是介于上面二者之间。另外,页级锁定和行级锁定一样,会发生死锁。在数据库实现资源锁定的过程中,随着锁定资源颗粒度的减小,锁定相同数据量的数据所需要消耗的内存数量是越来越多的,实现算法也会越来越复杂。不过,随着锁定资源颗粒度的减小,应用程序的访问请求遇到锁等待的可能性也会随之降低,系统整体并发度也随之提升。

悲观锁

总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。

乐观锁

总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和CAS算法实现。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库提供的类似于write_condition机制,其实都是提供的乐观锁。

1.4 操作系统

组成原理

计算机网络

2 数学

2.1 逻辑

2.2 排列组合

3 编程语言

3.1 Python基础

3.1.1 Python保留字

3.1.2 Python运算符

3.1.3 运算符is和==的区别

3.1.4 列表生成式

3.1.5 字符串格式化%和.format()的区别

3.1.6 Python的数据类型

3.1.7 datetime模块

3.1.8 Python编码规范

3.1.9 Python之禅

3.1.10 Python3中的命名规范

Python3中的命名规范大全—基于PEP8标准:https://blog.csdn.net/weixin_39723544/article/details/82144280

3.2 Python高级

3.2.1 自定义函数

3.2.2 模块

3.2.3 Python装饰器

3.2.4 Python构造器

3.2.5 Python生成器

3.2.6 Python迭代器

3.2.7 浅拷贝、深拷贝与赋值

3.2.8 多线程

3.2.9 异常处理

3.3 面向对象

3.4 正则

3.5 爬虫

3.6 Django框架

Django官网:https://www.djangoproject.com/

Django中文文档:https://docs.djangoproject.com/zh-hans/3.1/

Django中文网:https://www.django.cn/

刘江的Django教程:https://www.liujiangblog.com/course/django/84

Django的数据库详细操作:https://blog.csdn.net/yanpenggong/article/details/82316514

3.3.1 WSGI

WSGI是Python在处理HTTP请求时,规定的一种处理方式。如一个HTTP Request过来了,那么就有一个相应的处理函数来进行处理和返回结果。WSGI就是规定这个处理函数的参数长啥样的,它的返回结果是长啥样的?至于该处理函数的名子和处理逻辑是啥样的,那无所谓。简单而言,WSGI就是规定了处理函数的输入和输出格式。

Django请求的生命周期

  • 当用户在浏览器中输入url时,浏览器会生成请求头和请求体发给服务端。 请求头和请求体中会包含浏览器的动作(action),这个动作通常为get或者post,体现在url之中。
  • url经过Django中的wsgi,再经过Django的中间件,最后url到过路由映射表,在路由中一条一条进行匹配, 一旦其中一条匹配成功就执行对应的视图函数,后面的路由就不再继续匹配了。
  • 视图函数根据客户端的请求查询相应的数据,返回给Django,然后Django把客户端想要的数据做为一个字符串返回给客户端。
  • 客户端浏览器接收到返回的数据,经过渲染后显示给用户。

Django的内置组件

  • Admin组件:对model中对应的数据表进行增删改查。
  • model组件:负责操作数据库。
  • form组件:
    1. 生成HTML代码
    2. 数据有效性校验
    3. 校验信息返回并展示
  • ModelForm组件即用于数据库操作,也可用于用户请求的验证。

Django中间件的5个方法及应用场景

  • process_request : 请求进来时,权限认证
  • process_view : 路由匹配之后,能够得到视图函数
  • process_exception : 异常时执行
  • process_template_responseprocess : 模板渲染时执行
  • process_response : 请求有响应时执行

开发

MySQL

下载地址:https://dev.mysql.com/downloads/installer/

HTTP协议

HTML

HTML参考手册:https://www.w3school.com.cn/tags/index.asp

HTML教程:https://www.w3school.com.cn/html/index.asp

CSS

CSS教程:https://www.w3school.com.cn/css/index.asp

CSS参考手册:https://www.w3school.com.cn/css/css_reference.asp

JavaScript和TypeScrip

JQuery

JQuery官网:https://jquery.com/

JQuery中文网(JQuery官方文档):https://www.jquery123.com/

Bootstrap

Bootstrap中文网:https://www.bootcss.com/

Bootstrap3中文文档:https://v3.bootcss.com/

Bootstrap4中文文档:https://v4.bootcss.com/

Node.js

ElasticSearch

RabbitMQ

Docker

Nginx

Linux

Git

postman或者showDoc

1.3.1 关系型数据库(、Postgresql)

1.3.2 非关系型数据库(Mongodb)

1.3.3 缓存数据库(Redis )

1.3.4 性能调优

一些特殊实现

加密存储

常见加密方式和Python实现:https://www.jianshu.com/p/4ba20afacce2

JWT验证

RESTful设计风格

WebSocket

分布式

单点登录

MVCC

你可能感兴趣的:(Python,Django,数据库,python)