日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

对计算机领域中间层的理解

發(fā)布時(shí)間:2024/4/17 编程问答 72 豆豆
生活随笔 收集整理的這篇文章主要介紹了 对计算机领域中间层的理解 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

以前看《代碼大全2》時(shí)看到了如下一句經(jīng)典臺詞:

“any problem in computer science can be sloved by another layer of indirecition”

“計(jì)算機(jī)科學(xué)領(lǐng)域的任何問題都可以通過增加一個(gè)中間層來解決”

當(dāng)時(shí)只是覺得好就永遠(yuǎn)記住了,幾年的編碼經(jīng)驗(yàn),越來越感受到這句話的經(jīng)典所在,下面來舉幾個(gè)例子說一下我對它的理解:


1.操作系統(tǒng)的緩存:

比較典型的用于闡述這句話的緩存實(shí)例,當(dāng)屬內(nèi)存(包括swap、buffer、內(nèi)存的cache)和cpu的Cache(有三個(gè)等級),

操作系統(tǒng)中數(shù)據(jù)總體讀取流向:硬盤》內(nèi)存》cpu。

swap:

當(dāng)有應(yīng)用需要讀寫磁盤數(shù)據(jù)時(shí),由系統(tǒng)把相關(guān)數(shù)據(jù)從磁盤讀取到內(nèi)存,如果物理內(nèi)存不夠,則把內(nèi)存中的部分?jǐn)?shù)據(jù)導(dǎo)入到磁盤,從而把磁盤的部分空間當(dāng)作虛擬內(nèi)存(也就是swap)來使用。換句簡單的話說,swap就是當(dāng)內(nèi)存不夠時(shí)從硬盤中開辟的一塊空間。

buffer:

當(dāng)一個(gè)應(yīng)用程序在內(nèi)存中修改過數(shù)據(jù)后,因?yàn)閷懭氪疟P速度相對較低,在有空閑內(nèi)存的情況下,這些數(shù)據(jù)先存入內(nèi)存的一塊空閑空間(即buffer),在以后某個(gè)時(shí)間再寫入磁盤,從而應(yīng)用程序可以繼續(xù)后面的操作,而不必等待這些數(shù)據(jù)寫入磁盤的操作完成。簡單說,buffer 是為了提高內(nèi)存和硬盤(或其他I/O設(shè)備)之間的數(shù)據(jù)交換的速度而從內(nèi)存中開辟的一塊空間。

內(nèi)存的cache: 從磁盤讀取到內(nèi)存的數(shù)據(jù)在被相關(guān)應(yīng)用程序讀取后,如果有剩余內(nèi)存,則這部分?jǐn)?shù)據(jù)會存入內(nèi)存的一塊空閑空間(內(nèi)存的cache),以備第2次讀取時(shí),避免重新讀取磁盤。

cpu的Cache:

Cache:高速緩存,是位于CPU與主內(nèi)存間的一種容量較小但速度很高的存儲器。由于CPU的速度遠(yuǎn)高于主內(nèi)存,CPU直接從內(nèi)存中存取數(shù)據(jù)要等待一定時(shí)間周期,Cache中保存著CPU剛用過或循環(huán)使用的一部分?jǐn)?shù)據(jù),當(dāng)CPU再次使用該部分?jǐn)?shù)據(jù)時(shí)可從Cache中直接調(diào)用,這樣就減少了CPU的等待時(shí)間,提高了系統(tǒng)的效率。

又上可見,操作系統(tǒng)的緩存就是硬盤與內(nèi)存之間,內(nèi)存與硬盤之間的各種中間層,用于解決操作系統(tǒng)內(nèi)部數(shù)據(jù)交互速度不一致的問題。

2.消息對列:

當(dāng)系統(tǒng)中出現(xiàn)“生產(chǎn)“和“消費(fèi)“的速度或穩(wěn)定性等因素不一致的時(shí)候,就需要消息隊(duì)列,作為抽象層,彌合雙方的差異?!?消息 ”是在兩臺計(jì)算機(jī)間傳送的數(shù)據(jù)單位。消息可以非常簡單,例如只包含文本字符串;也可以更復(fù)雜,可能包含嵌入對象。消息被發(fā)送到隊(duì)列中,“ 消息隊(duì)列 ”是在消息的傳輸過程中保存消息的容器 。

常用的業(yè)務(wù)場景如下:

1)業(yè)務(wù)系統(tǒng)觸發(fā)短信發(fā)送申請,但短信發(fā)送模塊速度跟不上,需要將來不及處理的消息暫存一下,緩沖壓力。就可以把短信發(fā)送申請丟到消息隊(duì)列,直接返回用戶成功,短信發(fā)送模塊再可以慢慢去消息隊(duì)列中取消息進(jìn)行處理。

2)調(diào)遠(yuǎn)程系統(tǒng)下訂單成本較高,且因?yàn)榫W(wǎng)絡(luò)等因素,不穩(wěn)定,攢一批一起發(fā)送。

3)任務(wù)處理類的系統(tǒng),先把用戶發(fā)起的任務(wù)請求接收過來存到消息隊(duì)列中,然后后端開啟多個(gè)應(yīng)用程序從隊(duì)列中取任務(wù)進(jìn)行處理。

4)在高并發(fā)環(huán)境下,由于來不及同步處理,請求往往會發(fā)生堵塞,比如說,大量的insert,update之類的請求同時(shí)到達(dá)MySQL,直接導(dǎo)致無數(shù)的行鎖表鎖,甚至最后請求會堆積過多,從而觸發(fā)too many connections錯(cuò)誤。通過使用消息隊(duì)列,我們可以異步處理請求,從而緩解系統(tǒng)的壓力。

消息對列就相當(dāng)于兩個(gè)應(yīng)用之間的中間層,用于解決生產(chǎn)和消費(fèi)的速度不一致的問題,能夠提高系統(tǒng)的響應(yīng)速度和系統(tǒng)的穩(wěn)定性。

3.中間表:

具體應(yīng)用比如閉包表、從屬表等。

閉包表:用于分級存儲的一個(gè)簡單而優(yōu)雅的解決方案,它記錄了樹種所有節(jié)點(diǎn)間的關(guān)系,而不僅僅只有那些直接的父子關(guān)系。

比如一個(gè)評論表,一般建表如下:

CREATE TABLE Comments (

?? comment_id bigint unsigned not null auto_increment? primary key,

?? parent_id bigint unsigned not null,

?? comment text not null,

?? foreign key (parent_id) references Comments(comment_id)

)

這樣建設(shè)雖然簡單,但是當(dāng)一個(gè)評論下面有很多分支的時(shí)候,無論你是用程序還是用sql語句去處理這種層級關(guān)系 ,都是比較低效的。

一種很好的解決方案技術(shù)增加一個(gè)中間表,用于存儲各個(gè)評論之間的關(guān)系(包括自己與自己,自己與子孫之間的關(guān)系),將剛才的表拆分為兩張表如下 :

CREATE TABLE Comments (

?? comment_id bigint unsigned not null auto_increment? primary key,

?? comment text not null

);

CREATE TABLE TreePaths(

?? ancestor_id bigint unsigned not null,

?? descendant_id bigint unsigned not nul,

?? primary key(ancestor_id , descendant_id),

?? foreign key (ancestor_id) references Comments(comment_id),

?? foreign key (descendant_id ) references Comments(comment_id)

);

這樣增加一個(gè)中間表后既使關(guān)系很清晰,在查詢、做統(tǒng)計(jì)分析和增刪改的時(shí)候也簡單多了。

從屬表:僅用一列來存儲多值屬性,將多個(gè)值存在一張單獨(dú)表的多行中而不是一張表的多列中。

比如創(chuàng)建一個(gè)有多種屬性值的表,一般建表如下

CREATE TABLE Bug(

?? bug_id int unsigned not null auto_increment? primary key,

?? description varchar(1000),

?? tag varchar(500)?? //用json格式存儲

)

或者

CREATE TABLE Bug(

?? bug_id int unsigned not null auto_increment? primary key,

?? description varchar(1000),

?? tag1 varchar(20),

?? tag2 varchar(20),

?? tag3 varchar(20),

?? tag4 varchar(20),

)

這樣建設(shè)雖然可以,但不優(yōu)雅,在做統(tǒng)計(jì)查詢或者增加一種屬性時(shí)就比較費(fèi)力了,這是可以增加一張中間表(從屬表)單獨(dú)用來存儲bug的屬性,具體建設(shè)如下

CREATE TABLE Bug(

?? bug_id int unsigned not null auto_increment? primary key,

?? description varchar(1000)

)

CREATE TABLE Tag(

?? bug_id int unsigned not null,

?? tag varchar(20) not null,

?? primary key (bug_id,tag),

?? foreign key (bug_id) references Bug(bug_id)

)

這樣修改后的表在做查詢和統(tǒng)計(jì)的時(shí)候比較高效,在增加和刪除的時(shí)候級聯(lián)關(guān)系也很嚴(yán)格。

主鍵的約束能夠保證不會有重復(fù)的記錄出現(xiàn),一個(gè)給定的標(biāo)簽只能和一個(gè)給定的Bug關(guān)聯(lián)一次。

每個(gè)Bug也不在只限于幾個(gè)標(biāo)簽,可以很方便的擴(kuò)展成tagN 的列。

表建設(shè)過程中增加一個(gè)中間表非常適用于“有關(guān)系”的字段,既方便擴(kuò)展也方便做普通查詢和統(tǒng)計(jì)查詢,嚴(yán)格的關(guān)系也可以通過外鍵加以控制,只是在查詢的時(shí)候多了幾個(gè)join(通過索引并不影響查詢效率),這么好的想法,那就趕快在新項(xiàng)目中嘗試吧。

以上只是通過操作系統(tǒng)的緩存、消息隊(duì)列、中間表這三個(gè)實(shí)例闡述了我對“any problem in computer science can be sloved by another layer of indirecition”這句話的理解,這句話不僅適用于計(jì)算機(jī)領(lǐng)域,其他工程領(lǐng)域比如工程建造、機(jī)械建設(shè)、系統(tǒng)流程也是適用,所以經(jīng)典之所以經(jīng)典,是因?yàn)榻?jīng)典的東西不僅能幫你解決手中現(xiàn)有問題還能幫你解決以后可能出現(xiàn)的問題,還很富有哲學(xué),能應(yīng)用到各個(gè)領(lǐng)域。


寫在最后的話:

“書中自有黃金屋 書中自有顏如玉”,也許你現(xiàn)在讀的不一定現(xiàn)在就懂,等你經(jīng)歷的多了或者讀得多了再回頭看看,也許你會微微一笑,雖不至于傾城傾國,傾自己倒是絕對可以的。騷年們,當(dāng)你走的路不多時(shí),那就多讀書吧。


參考博客:

http://blog.csdn.net/bingqingsuimeng/article/details/51858858

http://www.cnblogs.com/xuyatao/p/6864109.html

http://www.ywnds.com/?p=5791

參考書籍:

《代碼大全2》、《SQL反模式》

轉(zhuǎn)載于:https://www.cnblogs.com/ryanlamp/p/7534843.html

總結(jié)

以上是生活随笔為你收集整理的对计算机领域中间层的理解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。