Python
1.Python实现单例模式
1.1.为什么要用单例模式
在系统中确保某个对象的唯一性,即一个类只能有一个实例有时是非常重要的。
举例:1.Windows任务管理器,多个打开如果内容一致,重复对象,造成浪费。内容不一致,存在至少一个窗口内容错误,造成误解。
2.一个项目中多个地方需要读取同一份配置文件,如果每次使用都重新创建实例导致IO浪费。
3.一个网站的访问量、在线人数,在项目中是全局唯一。
1.2.如何写单例模式
1.使用__new__
class User:
_instance = None
def __new__ = (cls, *args, **kwargs):
if not cls._instance:
cls._instance=super().__new__(cls)
return cls._instance
def __init__(self,name):
self.name=name
2.使用装饰器
instance={}
def singleton(cls):
def get_instance(*args,**kwargs):
cls_name=cls.__name__
if not cls_name in instances:
instance=cls(*args,**kwargs)
instances[cls_name]=instance
return instances[cls_name]
return get_instance
@singleton
class User:
_instance=None
def __init__(self,name):
self.name=name
3.使用元类(略,不会)
1.3.线程安全(加线程锁)
import threading
def synchornized(func):
func.__lock__ = threading.Lock()
def lock_func(*args,**kwargs):
with func.__lock__:
return func(*args,**kwargs)
return lock_func
class User:
_instance = None
@synchornized
def __new__ = (cls, *args, **kwargs):
if not cls._instance:
cls._instance=super().__new__(cls)
return cls._instance
def __init__(self,name):
self.name=name
1.4.单例模式优缺点
优点:
1.全局只有一个接入点,可以更好的进行数据同步控制,避免多重占用;
2.由于单例模式要求全局内只有一个实例,因而可以节省比较多的内存空间;
3.单例可常驻内存,减少系统开销
缺点:
1.由于单例对象是全局共享,状态维护需要特别小心,一处修改影响全局
2.单例对象没有抽象层,扩展不便
3.赋予单例太多职责,违反单一职责原则
4.单例在并发协作软件模块中需要最先完成,不利于测试
5.单例模式在某种情况会导致资源瓶颈
2.GIL
Linux
1.常见命令
1.1.关机
查看有没有其他用户在线:who
内存同步到磁盘:sync
关机:shutdown [-krhc] time message
-k:只发送警告信息
-r:重新启动
-h:关机
-c:取消正在进行的shutdown命令
1.2.文件与目录
列出文件或者目录的信息:ls [-adl] file|dir
-a:列出全部的文件
-d:仅列出目录本身
-l:以长数据串行列出
更换当前目录:cd
创建目录:mkdir [-mp] path
-m:配置目录权限
-p:递归创建目录
删除目录(目录必须为空):rmdir [-p] path
-p:递归删除目录
更新文件时间或创建新文件:touch [-acdmt] filename
-a: 更新atime【读取时间记录】
-c:更新ctime,若该文件不存在则不创建新文件
-m:更新mtime【修改时间记录】
复制文件:cp [-adpr] source destination
-a:相当于 -dpr
-d:复制时保留链接
-p:复制文件属性
-r:递归复制
删除文件:rm [-fir] file|dir
-r:递归删除
移动文件:mv [-fiu] source destination
-f:强制覆盖
1.3.获取文件内容
取得文件内容:cat [-AbEnTv] filename
-n:打印行号,包括空白行
-b:打印行号,不包括空白行
反向打印文件内容(从最后一行开始):tac
按页查看文件内容:more、less(可以向前翻页)
取得文件前几行:head [-n] filename
-n:后面接数字,代表显示行数
取得文件后几行:tail
以字符或16进制显示二进制文件:od
1.4.指令与文件搜索
指令搜索:which [-a] command
-a:列出所有指令
特定目录搜索文件(二进制、源代码、man手册):whereis [-bmsu] filename
文件搜索(查数据库,非实时):locate [-ir] keyword
-r 正则
磁盘文件搜索:find [basedir] [option]
-mtime n|+n|-n:列出【n天前那一天|n天前(不含n)|n天之内(含n)】修改过内容的文件
-uid n|-gid n|-user name|-group name:列出对应拥有者和所属群组的文件
-name filename
-size [+-]
-type TYPE
1.5.压缩与打包
打包压缩:tar [-z|-j|-J] [cv] [-f 新建的tar文件] filename...
查看:tar [-z|-j|-J] [tv] [-f 已有的tar文件]
解压缩:tar [-z|-j|-J] [xv] [-f 已有的tar文件] [-C 目录]
-z|-j|-J:使用zip|bzip2|xz
-c:新建打包文件
-t:查看打包文件
-x:解压缩
-v:在处理过程中,显示正在处理的文件名
-f:要处理的文件
-C:在特定目录解压缩
1.6.进程管理
查看自己进程:ps -l
查看系统进程:ps aux
查看所有进程树:pstree -A
实时显示进程:top
查看占用端口的进程 netstat
MySQL
1.索引
索引是在存储引擎层实现的,而不是在服务器层实现的,所以不同存储引擎具有不同的索引类型和实现。
1.1.B+Tree
数据结构:基于B Tree,也就是平衡树实现的,叶子结点间存在顺序访问指针。
特点:是大多数MySQL存储引擎的默认索引类型;
有序,可以用于排序和分组;
可以指定多个列作为索引列,共同组成键
适用于全键值、键值范围和键前缀查找
存储引擎:InnoDB 聚簇索引(辅助索引依靠主键)、MyISAM 非聚簇索引(相互独立,只存储地址)
1.2.哈希索引
查找O(1)时间复杂度,但失去有序性,无法排序,只能精确查找
InnoDB 自适应哈希索引:某个索引值使用非常频繁,会在B+Tree的索引上再创建一个哈希索引
1.3.全文索引
MyISAM特性,使用倒排索引实现。
1.4.怎么知道一条语句是否使用了索引
explain函数key关键字
key: 实际使用的索引。如果为NULL,则没有使用索引。很少的情况下,MySQL会选择优化不足的索引。这种情况下,可以在Select语句中使用USE INDEX(indexname)来强制使用一个索引或者用IGNORE INDEX(indexname)来强制MySQL忽略索引;
1.5.MySQL
2.存储引擎
比较:
特性 | InnoDB | MyISAM |
---|---|---|
事务 | 支持 | 不支持 |
外键 | 支持 | 不支持 |
索引结构 | 聚集索引 | 非聚集索引 |
锁 | 行级、表级 | 只支持表级 |
压缩表 | 不支持 | 支持 |
全文搜索 | 支持(旧版本不支持) | 支持 |
3.乐观锁和悲观锁
3.1.乐观锁
假设最好的情况,别人不会修改数据,更新的时候会判断别人有没有更新数据,可以使用版本号和CAS算法实现,适用于多读的场景,可以提高吞吐量。
CAS算法:读内存V预设值A,若A再次读取时没有发生变化,更新为更新值B。缺点:ABA问题、循环时间开销时长大
3.2.悲观锁
假设最坏的情况,每个人都会修改数据,所以每次拿数据都会上锁,别人想拿就会阻塞知道他拿到锁。(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)实现:synchronized
4.
计算机网络
1.五层网络协议体系结构的理解
- 应用层:通过应用进程间的交互来完成特定网络应用。应用层协议定义的是应用进程(进程:主机中正在运行的程序)间的通信和交互的规则。对于不同的网络应用需要不同的应用层协议。在互联网中应用层协议很多,如域名系统 DNS,支持万维网应用的 HTTP 协议,支持电子邮件的 SMTP 协议等等。我们把应用层交互的数据单元称为报文。
- 传输层:主要任务就是负责向两台主机进程之间的通信提供通用的数据传输服务。应用进程利用该服务传送应用层报文。“通用的”是指并不针对某一个特定的网络应用,而是多种应用可以使用同一个传输层服务。
- 网络层:在计算机网络中进行通信的两个计算机之间可能会经过很多个数据链路,也可能还要经过很多通信子网。网络层的任务就是选择合适的网间路由和交换结点, 确保数据及时传送。在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组和包进行传送。在 TCP / IP 体系结构中,由于网络层使用 IP 协议,因此分组也叫 IP 数据报,简称数据报。
- 数据链路层:数据链路层(data link layer)通常简称为链路层。两台主机之间的数据传输,总是在一段一段的链路上传送的,这就需要使用专门的链路层的协议。在两个相邻节点之间传送数据时,数据链路层将网络层交下来的 IP 数据报组装成帧,在两个相邻节点间的链路上传送帧。每一帧包括数据和必要的控制信息(如:同步信息,地址信息,差错控制等)。
在接收数据时,控制信息使接收端能够知道一个帧从哪个比特开始和到哪个比特结束。这样,数据链路层在收到一个帧后,就可从中提出数据部分,上交给网络层。控制信息还使接收端能够检测到所收到的帧中有无差错。如果发现差错,数据链路层就简单地丢弃这个出了差错的帧,以避免继续在网络中传送下去白白浪费网络资源。如果需要改正数据在链路层传输时出现差错(这就是说,数据链路层不仅要检错,而且还要纠错),那么就要采用可靠性传输协议来纠正出现的差错。这种方法会使链路层的协议复杂些。 - 物理层:在物理层上所传送的数据单位是比特。物理层(physical layer)的作用是实现相邻计算机节点之间比特流的透明传送,尽可能屏蔽掉具体传输介质和物理设备的差异。使其上面的数据链路层不必考虑网络的具体传输介质是什么。“透明传送比特流”表示经实际电路传送后的比特流没有发生变化,对传送的比特流来说,这个电路好像是看不见的。
TCP/IP中数据链路层和物理层合并为网络接口层。
2.传输层
2.1.UDP和TCP的特点
- UDP:用户数据报协议,无连接,尽最大可能交付,没有拥塞控制,面向报文,支持一对一,一对多,多对多的交互通信
- TCP:传输控制协议,面向连接,提供可靠支付,有流量控制,拥塞控制,提供全双工通信,面向字节流,点对点连接
2.2.TCP三次握手
A:客户端 B:服务器端
- B处于Listen状态
- A向B发送连接请求报文,SYN=1,ACK=0,初始序号x
- B收到连接请求报文,同意连接,向A发送连接确认报文,SYN=1,ACK=1,确认号为x+1,选择初始序号y
- A收到B的连接确认报文后,向B确认,确认号为y+1,序号为x+1
- B收到A的确认,连接建立
三次握手的原因:第三次握手是为了防止失效的连接请求发送到服务器,让服务器错误打开链接。
2.3.TCP四次挥手
- A发送连接释放报文,FIN=1
- B收到之后发出确认,TCP属于半关闭状态,B能向A发送数据但是A不能向B发送数据
- B不再需要连接时,发送连接释放报文,FIN=1
- A收到后发出确认,进入TIME-WAIT状态,等待2 MSL(最大报文存活时间)后释放连接。
- B收到A的确认后释放连接。
四次挥手的原因:客户端发送了FIN之后,服务器收到报文,进入CLOSE-WAIT状态,是为了让服务器发送还未传输完毕的数据,传输完毕后,服务器发送FIN。
TIME_WAIT:客户端接收到服务器FIN后进入此状态,这么做有两个理由:
- 确保最后一个确认报文能够到达。如果B没有收到A发送来的报文,那么就会重新发送FIN请求。
- 让本连接持续时间内所产生的所有报文都从网络中消失,使得下一个新连接不会出现旧的连接请求报文
2.4. TCP协议是如何保证可靠传输的
- 数据包校验:目的是检测数据在传输过程中的任何变化,若校验出包有错,则丢弃报文段并且不给出响应,这时 TCP 发送数据端超时后会重发数据;
- 对失序数据包重排序:既然 TCP 报文段作为 IP 数据报来传输,而 IP 数据报的到达可能会失序,因此 TCP 报文段的到达也可能会失序。TCP 将对失序数据进行重新排序,然后才交给应用层;
- 丢弃重复数据:对于重复数据,能够丢弃重复数据;
- 应答机制:当 TCP 收到发自 TCP 连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒;
- 超时重发:当 TCP 发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段;
- 流量控制:TCP 连接的每一方都有固定大小的缓冲空间。TCP 的接收端只允许另一端发送接收端缓冲区所能接纳的数据,这可以防止较快主机致使较慢主机的缓冲区溢出,这就是流量控制。TCP 使用的流量控制协议是可变大小的滑动窗口协议。
3.HTTP
3.1.HTTP状态码
状态码 | 类别 | 含义 |
---|---|---|
1xx | Informational(信息性状态码) | 请求正在处理 |
2xx | Success(成功状态码) | 请求正常处理完毕 |
3xx | Redirection(重定向状态码) | 需要附加操作 |
4xx | Client Error(客户端错误状态码) | 服务器无法处理请求 |
5xx | Server Error(服务器错误状态码) | 服务器处理请求出错 |
100 Continue
200 OK
204 No Content:成功处理但是没有返回主体数据
206 Partial Content:客户端进行了范围请求
301 Moved Permanently:永久性重定向
302 Found:临时性重定向
303 See Other:与302相同,明确要求客户端采用GET方法
304 Not Modified:请求报文包含一些条件,不满足条件则返回
307 Temporary Redirect:与302相似,要求浏览器不把POST改为GET
400 Bad Request:请求报文中存在语法错误
401 Unauthorized:发送的请求需要认证信息
403 Forbidden:请求被拒绝
404 Not Found:没有请求的资源
500 Internal Server Error:服务器正在执行请求时发生错误
503 Service Unavailable:服务器暂时超负载或停机维护,无法处理请求
3.2.GET/POST
GET | POST | |
---|---|---|
作用 | 获取资源 | 传输实体主体 |
参数 | ASCII码 | 标准字符集 |
安全 | 安全 | 不安全 |
幂等性* | 幂等 | 不幂等 |
可缓存 | 能 | 不能 |
4.HTTPS
HTTPS=HTTP+SSL
对称加密
非对称加密
5.在浏览器中输入一个URL会发生什么?
- 输入一个URL地址
- 浏览器查找域名的IP地址:DNS查找
- 建立链接:TCP三次握手
- 浏览器给WEB服务器发送一个HTTP请求
- 服务器返回浏览器301永久重定向响应
- 浏览器跟踪重定向地址
- 服务器处理请求:映射网站地址结构的文件层次存储
- 服务器返回200和页面HTML文件
- 关闭TCP链接:TCP四次挥手
- 浏览器开始显示HTML
- 浏览器发送获取嵌入HTML中的对象
- 构建渲染树
- 浏览器布局渲染
网友评论