Python
1.Python實(shí)現(xiàn)單例模式
1.1.為什么要用單例模式
在系統(tǒng)中確保某個(gè)對(duì)象的唯一性高帖,即一個(gè)類只能有一個(gè)實(shí)例有時(shí)是非常重要的指蚁。
舉例:1.Windows任務(wù)管理器梭姓,多個(gè)打開(kāi)如果內(nèi)容一致褥民,重復(fù)對(duì)象涤伐,造成浪費(fèi)盔憨。內(nèi)容不一致徙菠,存在至少一個(gè)窗口內(nèi)容錯(cuò)誤,造成誤解郁岩。
2.一個(gè)項(xiàng)目中多個(gè)地方需要讀取同一份配置文件婿奔,如果每次使用都重新創(chuàng)建實(shí)例導(dǎo)致IO浪費(fèi)。
3.一個(gè)網(wǎng)站的訪問(wèn)量问慎、在線人數(shù)萍摊,在項(xiàng)目中是全局唯一。
1.2.如何寫(xiě)單例模式
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.使用元類(略如叼,不會(huì))
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.單例模式優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
1.全局只有一個(gè)接入點(diǎn)冰木,可以更好的進(jìn)行數(shù)據(jù)同步控制,避免多重占用笼恰;
2.由于單例模式要求全局內(nèi)只有一個(gè)實(shí)例踊沸,因而可以節(jié)省比較多的內(nèi)存空間;
3.單例可常駐內(nèi)存挖腰,減少系統(tǒng)開(kāi)銷
缺點(diǎn):
1.由于單例對(duì)象是全局共享雕沿,狀態(tài)維護(hù)需要特別小心,一處修改影響全局
2.單例對(duì)象沒(méi)有抽象層猴仑,擴(kuò)展不便
3.賦予單例太多職責(zé)审轮,違反單一職責(zé)原則
4.單例在并發(fā)協(xié)作軟件模塊中需要最先完成肥哎,不利于測(cè)試
5.單例模式在某種情況會(huì)導(dǎo)致資源瓶頸
2.GIL
Linux
1.常見(jiàn)命令
1.1.關(guān)機(jī)
查看有沒(méi)有其他用戶在線:who
內(nèi)存同步到磁盤(pán):sync
關(guān)機(jī):shutdown [-krhc] time message
-k:只發(fā)送警告信息
-r:重新啟動(dòng)
-h:關(guān)機(jī)
-c:取消正在進(jìn)行的shutdown命令
1.2.文件與目錄
列出文件或者目錄的信息:ls [-adl] file|dir
-a:列出全部的文件
-d:僅列出目錄本身
-l:以長(zhǎng)數(shù)據(jù)串行列出
更換當(dāng)前目錄:cd
創(chuàng)建目錄:mkdir [-mp] path
-m:配置目錄權(quán)限
-p:遞歸創(chuàng)建目錄
刪除目錄(目錄必須為空):rmdir [-p] path
-p:遞歸刪除目錄
更新文件時(shí)間或創(chuàng)建新文件:touch [-acdmt] filename
-a: 更新atime【讀取時(shí)間記錄】
-c:更新ctime,若該文件不存在則不創(chuàng)建新文件
-m:更新mtime【修改時(shí)間記錄】
復(fù)制文件:cp [-adpr] source destination
-a:相當(dāng)于 -dpr
-d:復(fù)制時(shí)保留鏈接
-p:復(fù)制文件屬性
-r:遞歸復(fù)制
刪除文件:rm [-fir] file|dir
-r:遞歸刪除
移動(dòng)文件:mv [-fiu] source destination
-f:強(qiáng)制覆蓋
1.3.獲取文件內(nèi)容
取得文件內(nèi)容:cat [-AbEnTv] filename
-n:打印行號(hào)疾渣,包括空白行
-b:打印行號(hào)篡诽,不包括空白行
反向打印文件內(nèi)容(從最后一行開(kāi)始):tac
按頁(yè)查看文件內(nèi)容:more、less(可以向前翻頁(yè))
取得文件前幾行:head [-n] filename
-n:后面接數(shù)字榴捡,代表顯示行數(shù)
取得文件后幾行:tail
以字符或16進(jìn)制顯示二進(jìn)制文件:od
1.4.指令與文件搜索
指令搜索:which [-a] command
-a:列出所有指令
特定目錄搜索文件(二進(jìn)制杈女、源代碼、man手冊(cè)):whereis [-bmsu] filename
文件搜索(查數(shù)據(jù)庫(kù)吊圾,非實(shí)時(shí)):locate [-ir] keyword
-r 正則
磁盤(pán)文件搜索:find [basedir] [option]
-mtime n|+n|-n:列出【n天前那一天|n天前(不含n)|n天之內(nèi)(含n)】修改過(guò)內(nèi)容的文件
-uid n|-gid n|-user name|-group name:列出對(duì)應(yīng)擁有者和所屬群組的文件
-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 目錄](méi)
-z|-j|-J:使用zip|bzip2|xz
-c:新建打包文件
-t:查看打包文件
-x:解壓縮
-v:在處理過(guò)程中达椰,顯示正在處理的文件名
-f:要處理的文件
-C:在特定目錄解壓縮
1.6.進(jìn)程管理
查看自己進(jìn)程:ps -l
查看系統(tǒng)進(jìn)程:ps aux
查看所有進(jìn)程樹(shù):pstree -A
實(shí)時(shí)顯示進(jìn)程:top
查看占用端口的進(jìn)程 netstat
MySQL
1.索引
索引是在存儲(chǔ)引擎層實(shí)現(xiàn)的,而不是在服務(wù)器層實(shí)現(xiàn)的项乒,所以不同存儲(chǔ)引擎具有不同的索引類型和實(shí)現(xiàn)啰劲。
1.1.B+Tree
數(shù)據(jù)結(jié)構(gòu):基于B Tree,也就是平衡樹(shù)實(shí)現(xiàn)的檀何,葉子結(jié)點(diǎn)間存在順序訪問(wèn)指針蝇裤。
特點(diǎn):是大多數(shù)MySQL存儲(chǔ)引擎的默認(rèn)索引類型;
有序频鉴,可以用于排序和分組栓辜;
可以指定多個(gè)列作為索引列,共同組成鍵
適用于全鍵值垛孔、鍵值范圍和鍵前綴查找
存儲(chǔ)引擎:InnoDB 聚簇索引(輔助索引依靠主鍵)藕甩、MyISAM 非聚簇索引(相互獨(dú)立,只存儲(chǔ)地址)
1.2.哈希索引
查找O(1)時(shí)間復(fù)雜度似炎,但失去有序性辛萍,無(wú)法排序,只能精確查找
InnoDB 自適應(yīng)哈希索引:某個(gè)索引值使用非常頻繁羡藐,會(huì)在B+Tree的索引上再創(chuàng)建一個(gè)哈希索引
1.3.全文索引
MyISAM特性贩毕,使用倒排索引實(shí)現(xiàn)。
1.4.怎么知道一條語(yǔ)句是否使用了索引
explain函數(shù)key關(guān)鍵字
key: 實(shí)際使用的索引仆嗦。如果為NULL辉阶,則沒(méi)有使用索引。很少的情況下瘩扼,MySQL會(huì)選擇優(yōu)化不足的索引谆甜。這種情況下,可以在Select語(yǔ)句中使用USE INDEX(indexname)來(lái)強(qiáng)制使用一個(gè)索引或者用IGNORE INDEX(indexname)來(lái)強(qiáng)制MySQL忽略索引集绰;
1.5.MySQL
2.存儲(chǔ)引擎
比較:
特性 | InnoDB | MyISAM |
---|---|---|
事務(wù) | 支持 | 不支持 |
外鍵 | 支持 | 不支持 |
索引結(jié)構(gòu) | 聚集索引 | 非聚集索引 |
鎖 | 行級(jí)规辱、表級(jí) | 只支持表級(jí) |
壓縮表 | 不支持 | 支持 |
全文搜索 | 支持(舊版本不支持) | 支持 |
3.樂(lè)觀鎖和悲觀鎖
3.1.樂(lè)觀鎖
假設(shè)最好的情況,別人不會(huì)修改數(shù)據(jù)栽燕,更新的時(shí)候會(huì)判斷別人有沒(méi)有更新數(shù)據(jù)罕袋,可以使用版本號(hào)和CAS算法實(shí)現(xiàn)改淑,適用于多讀的場(chǎng)景,可以提高吞吐量浴讯。
CAS算法:讀內(nèi)存V預(yù)設(shè)值A(chǔ)朵夏,若A再次讀取時(shí)沒(méi)有發(fā)生變化,更新為更新值B榆纽。缺點(diǎn):ABA問(wèn)題仰猖、循環(huán)時(shí)間開(kāi)銷時(shí)長(zhǎng)大
3.2.悲觀鎖
假設(shè)最壞的情況,每個(gè)人都會(huì)修改數(shù)據(jù)奈籽,所以每次拿數(shù)據(jù)都會(huì)上鎖饥侵,別人想拿就會(huì)阻塞知道他拿到鎖。(共享資源每次只給一個(gè)線程使用唠摹,其它線程阻塞爆捞,用完后再把資源轉(zhuǎn)讓給其它線程)實(shí)現(xiàn):synchronized
4.
計(jì)算機(jī)網(wǎng)絡(luò)
1.五層網(wǎng)絡(luò)協(xié)議體系結(jié)構(gòu)的理解
- 應(yīng)用層:通過(guò)應(yīng)用進(jìn)程間的交互來(lái)完成特定網(wǎng)絡(luò)應(yīng)用奉瘤。應(yīng)用層協(xié)議定義的是應(yīng)用進(jìn)程(進(jìn)程:主機(jī)中正在運(yùn)行的程序)間的通信和交互的規(guī)則勾拉。對(duì)于不同的網(wǎng)絡(luò)應(yīng)用需要不同的應(yīng)用層協(xié)議。在互聯(lián)網(wǎng)中應(yīng)用層協(xié)議很多盗温,如域名系統(tǒng) DNS藕赞,支持萬(wàn)維網(wǎng)應(yīng)用的 HTTP 協(xié)議,支持電子郵件的 SMTP 協(xié)議等等卖局。我們把應(yīng)用層交互的數(shù)據(jù)單元稱為報(bào)文斧蜕。
- 傳輸層:主要任務(wù)就是負(fù)責(zé)向兩臺(tái)主機(jī)進(jìn)程之間的通信提供通用的數(shù)據(jù)傳輸服務(wù)。應(yīng)用進(jìn)程利用該服務(wù)傳送應(yīng)用層報(bào)文砚偶∨“通用的”是指并不針對(duì)某一個(gè)特定的網(wǎng)絡(luò)應(yīng)用,而是多種應(yīng)用可以使用同一個(gè)傳輸層服務(wù)染坯。
- 網(wǎng)絡(luò)層:在計(jì)算機(jī)網(wǎng)絡(luò)中進(jìn)行通信的兩個(gè)計(jì)算機(jī)之間可能會(huì)經(jīng)過(guò)很多個(gè)數(shù)據(jù)鏈路均芽,也可能還要經(jīng)過(guò)很多通信子網(wǎng)。網(wǎng)絡(luò)層的任務(wù)就是選擇合適的網(wǎng)間路由和交換結(jié)點(diǎn)单鹿, 確保數(shù)據(jù)及時(shí)傳送掀宋。在發(fā)送數(shù)據(jù)時(shí),網(wǎng)絡(luò)層把運(yùn)輸層產(chǎn)生的報(bào)文段或用戶數(shù)據(jù)報(bào)封裝成分組和包進(jìn)行傳送仲锄。在 TCP / IP 體系結(jié)構(gòu)中劲妙,由于網(wǎng)絡(luò)層使用 IP 協(xié)議,因此分組也叫 IP 數(shù)據(jù)報(bào)儒喊,簡(jiǎn)稱數(shù)據(jù)報(bào)镣奋。
- 數(shù)據(jù)鏈路層:數(shù)據(jù)鏈路層(data link layer)通常簡(jiǎn)稱為鏈路層。兩臺(tái)主機(jī)之間的數(shù)據(jù)傳輸怀愧,總是在一段一段的鏈路上傳送的侨颈,這就需要使用專門(mén)的鏈路層的協(xié)議富雅。在兩個(gè)相鄰節(jié)點(diǎn)之間傳送數(shù)據(jù)時(shí),數(shù)據(jù)鏈路層將網(wǎng)絡(luò)層交下來(lái)的 IP 數(shù)據(jù)報(bào)組裝成幀肛搬,在兩個(gè)相鄰節(jié)點(diǎn)間的鏈路上傳送幀没佑。每一幀包括數(shù)據(jù)和必要的控制信息(如:同步信息,地址信息温赔,差錯(cuò)控制等)蛤奢。
在接收數(shù)據(jù)時(shí),控制信息使接收端能夠知道一個(gè)幀從哪個(gè)比特開(kāi)始和到哪個(gè)比特結(jié)束陶贼。這樣啤贩,數(shù)據(jù)鏈路層在收到一個(gè)幀后,就可從中提出數(shù)據(jù)部分拜秧,上交給網(wǎng)絡(luò)層痹屹。控制信息還使接收端能夠檢測(cè)到所收到的幀中有無(wú)差錯(cuò)枉氮。如果發(fā)現(xiàn)差錯(cuò)志衍,數(shù)據(jù)鏈路層就簡(jiǎn)單地丟棄這個(gè)出了差錯(cuò)的幀,以避免繼續(xù)在網(wǎng)絡(luò)中傳送下去白白浪費(fèi)網(wǎng)絡(luò)資源聊替。如果需要改正數(shù)據(jù)在鏈路層傳輸時(shí)出現(xiàn)差錯(cuò)(這就是說(shuō)楼肪,數(shù)據(jù)鏈路層不僅要檢錯(cuò),而且還要糾錯(cuò))惹悄,那么就要采用可靠性傳輸協(xié)議來(lái)糾正出現(xiàn)的差錯(cuò)春叫。這種方法會(huì)使鏈路層的協(xié)議復(fù)雜些。 - 物理層:在物理層上所傳送的數(shù)據(jù)單位是比特泣港。物理層(physical layer)的作用是實(shí)現(xiàn)相鄰計(jì)算機(jī)節(jié)點(diǎn)之間比特流的透明傳送暂殖,盡可能屏蔽掉具體傳輸介質(zhì)和物理設(shè)備的差異。使其上面的數(shù)據(jù)鏈路層不必考慮網(wǎng)絡(luò)的具體傳輸介質(zhì)是什么当纱∏好浚“透明傳送比特流”表示經(jīng)實(shí)際電路傳送后的比特流沒(méi)有發(fā)生變化,對(duì)傳送的比特流來(lái)說(shuō)惫东,這個(gè)電路好像是看不見(jiàn)的莉给。
TCP/IP中數(shù)據(jù)鏈路層和物理層合并為網(wǎng)絡(luò)接口層。
2.傳輸層
2.1.UDP和TCP的特點(diǎn)
- UDP:用戶數(shù)據(jù)報(bào)協(xié)議廉沮,無(wú)連接颓遏,盡最大可能交付,沒(méi)有擁塞控制滞时,面向報(bào)文叁幢,支持一對(duì)一,一對(duì)多坪稽,多對(duì)多的交互通信
- TCP:傳輸控制協(xié)議曼玩,面向連接鳞骤,提供可靠支付,有流量控制黍判,擁塞控制豫尽,提供全雙工通信,面向字節(jié)流顷帖,點(diǎn)對(duì)點(diǎn)連接
2.2.TCP三次握手
A:客戶端 B:服務(wù)器端
- B處于Listen狀態(tài)
- A向B發(fā)送連接請(qǐng)求報(bào)文美旧,SYN=1,ACK=0贬墩,初始序號(hào)x
- B收到連接請(qǐng)求報(bào)文榴嗅,同意連接,向A發(fā)送連接確認(rèn)報(bào)文陶舞,SYN=1嗽测,ACK=1,確認(rèn)號(hào)為x+1肿孵,選擇初始序號(hào)y
- A收到B的連接確認(rèn)報(bào)文后唠粥,向B確認(rèn),確認(rèn)號(hào)為y+1颁井,序號(hào)為x+1
- B收到A的確認(rèn)厅贪,連接建立
三次握手的原因:第三次握手是為了防止失效的連接請(qǐng)求發(fā)送到服務(wù)器,讓服務(wù)器錯(cuò)誤打開(kāi)鏈接雅宾。
2.3.TCP四次揮手
- A發(fā)送連接釋放報(bào)文,F(xiàn)IN=1
- B收到之后發(fā)出確認(rèn)葵硕,TCP屬于半關(guān)閉狀態(tài)眉抬,B能向A發(fā)送數(shù)據(jù)但是A不能向B發(fā)送數(shù)據(jù)
- B不再需要連接時(shí),發(fā)送連接釋放報(bào)文懈凹,F(xiàn)IN=1
- A收到后發(fā)出確認(rèn)蜀变,進(jìn)入TIME-WAIT狀態(tài),等待2 MSL(最大報(bào)文存活時(shí)間)后釋放連接介评。
- B收到A的確認(rèn)后釋放連接库北。
四次揮手的原因:客戶端發(fā)送了FIN之后,服務(wù)器收到報(bào)文们陆,進(jìn)入CLOSE-WAIT狀態(tài)寒瓦,是為了讓服務(wù)器發(fā)送還未傳輸完畢的數(shù)據(jù),傳輸完畢后坪仇,服務(wù)器發(fā)送FIN杂腰。
TIME_WAIT:客戶端接收到服務(wù)器FIN后進(jìn)入此狀態(tài),這么做有兩個(gè)理由:
- 確保最后一個(gè)確認(rèn)報(bào)文能夠到達(dá)椅文。如果B沒(méi)有收到A發(fā)送來(lái)的報(bào)文喂很,那么就會(huì)重新發(fā)送FIN請(qǐng)求惜颇。
- 讓本連接持續(xù)時(shí)間內(nèi)所產(chǎn)生的所有報(bào)文都從網(wǎng)絡(luò)中消失,使得下一個(gè)新連接不會(huì)出現(xiàn)舊的連接請(qǐng)求報(bào)文
2.4. TCP協(xié)議是如何保證可靠傳輸?shù)?/h3>
- 數(shù)據(jù)包校驗(yàn):目的是檢測(cè)數(shù)據(jù)在傳輸過(guò)程中的任何變化少辣,若校驗(yàn)出包有錯(cuò)凌摄,則丟棄報(bào)文段并且不給出響應(yīng),這時(shí) TCP 發(fā)送數(shù)據(jù)端超時(shí)后會(huì)重發(fā)數(shù)據(jù)漓帅;
- 對(duì)失序數(shù)據(jù)包重排序:既然 TCP 報(bào)文段作為 IP 數(shù)據(jù)報(bào)來(lái)傳輸望伦,而 IP 數(shù)據(jù)報(bào)的到達(dá)可能會(huì)失序,因此 TCP 報(bào)文段的到達(dá)也可能會(huì)失序煎殷。TCP 將對(duì)失序數(shù)據(jù)進(jìn)行重新排序屯伞,然后才交給應(yīng)用層;
- 丟棄重復(fù)數(shù)據(jù):對(duì)于重復(fù)數(shù)據(jù)豪直,能夠丟棄重復(fù)數(shù)據(jù)劣摇;
- 應(yīng)答機(jī)制:當(dāng) TCP 收到發(fā)自 TCP 連接另一端的數(shù)據(jù),它將發(fā)送一個(gè)確認(rèn)弓乙。這個(gè)確認(rèn)不是立即發(fā)送末融,通常將推遲幾分之一秒;
- 超時(shí)重發(fā):當(dāng) TCP 發(fā)出一個(gè)段后暇韧,它啟動(dòng)一個(gè)定時(shí)器勾习,等待目的端確認(rèn)收到這個(gè)報(bào)文段。如果不能及時(shí)收到一個(gè)確認(rèn)懈玻,將重發(fā)這個(gè)報(bào)文段巧婶;
- 流量控制:TCP 連接的每一方都有固定大小的緩沖空間。TCP 的接收端只允許另一端發(fā)送接收端緩沖區(qū)所能接納的數(shù)據(jù)涂乌,這可以防止較快主機(jī)致使較慢主機(jī)的緩沖區(qū)溢出艺栈,這就是流量控制。TCP 使用的流量控制協(xié)議是可變大小的滑動(dòng)窗口協(xié)議湾盒。
3.HTTP
3.1.HTTP狀態(tài)碼
狀態(tài)碼 | 類別 | 含義 |
---|---|---|
1xx | Informational(信息性狀態(tài)碼) | 請(qǐng)求正在處理 |
2xx | Success(成功狀態(tài)碼) | 請(qǐng)求正常處理完畢 |
3xx | Redirection(重定向狀態(tài)碼) | 需要附加操作 |
4xx | Client Error(客戶端錯(cuò)誤狀態(tài)碼) | 服務(wù)器無(wú)法處理請(qǐng)求 |
5xx | Server Error(服務(wù)器錯(cuò)誤狀態(tài)碼) | 服務(wù)器處理請(qǐng)求出錯(cuò) |
100 Continue
200 OK
204 No Content:成功處理但是沒(méi)有返回主體數(shù)據(jù)
206 Partial Content:客戶端進(jìn)行了范圍請(qǐng)求
301 Moved Permanently:永久性重定向
302 Found:臨時(shí)性重定向
303 See Other:與302相同湿右,明確要求客戶端采用GET方法
304 Not Modified:請(qǐng)求報(bào)文包含一些條件,不滿足條件則返回
307 Temporary Redirect:與302相似罚勾,要求瀏覽器不把POST改為GET
400 Bad Request:請(qǐng)求報(bào)文中存在語(yǔ)法錯(cuò)誤
401 Unauthorized:發(fā)送的請(qǐng)求需要認(rèn)證信息
403 Forbidden:請(qǐng)求被拒絕
404 Not Found:沒(méi)有請(qǐng)求的資源
500 Internal Server Error:服務(wù)器正在執(zhí)行請(qǐng)求時(shí)發(fā)生錯(cuò)誤
503 Service Unavailable:服務(wù)器暫時(shí)超負(fù)載或停機(jī)維護(hù)毅人,無(wú)法處理請(qǐng)求
3.2.GET/POST
GET | POST | |
---|---|---|
作用 | 獲取資源 | 傳輸實(shí)體主體 |
參數(shù) | ASCII碼 | 標(biāo)準(zhǔn)字符集 |
安全 | 安全 | 不安全 |
冪等性* | 冪等 | 不冪等 |
可緩存 | 能 | 不能 |
4.HTTPS
HTTPS=HTTP+SSL
對(duì)稱加密
非對(duì)稱加密
5.在瀏覽器中輸入一個(gè)URL會(huì)發(fā)生什么?
- 輸入一個(gè)URL地址
- 瀏覽器查找域名的IP地址:DNS查找
- 建立鏈接:TCP三次握手
- 瀏覽器給WEB服務(wù)器發(fā)送一個(gè)HTTP請(qǐng)求
- 服務(wù)器返回瀏覽器301永久重定向響應(yīng)
- 瀏覽器跟蹤重定向地址
- 服務(wù)器處理請(qǐng)求:映射網(wǎng)站地址結(jié)構(gòu)的文件層次存儲(chǔ)
- 服務(wù)器返回200和頁(yè)面HTML文件
- 關(guān)閉TCP鏈接:TCP四次揮手
- 瀏覽器開(kāi)始顯示HTML
- 瀏覽器發(fā)送獲取嵌入HTML中的對(duì)象
- 構(gòu)建渲染樹(shù)
- 瀏覽器布局渲染