操作緩存的基本方法包括把數(shù)據(jù)加人緩存、從緩存中獲取數(shù)據(jù)以及更新數(shù)據(jù)。通常在緩存中添加數(shù)據(jù)叫做set,從緩存中獲取數(shù)據(jù)叫做get,更新數(shù)據(jù)是replace。許多程序設(shè)計(jì)語言對最流行的緩存都已經(jīng)有內(nèi)置的支持。memcached是當(dāng)前最常用的緩存之一。它“本質(zhì)上是一種高性能的分布式內(nèi)存對象緩存系統(tǒng),但目的在于通過減輕數(shù)據(jù)庫的負(fù)載來加速動(dòng)態(tài)的Web應(yīng)用”。這種特殊的緩存使用了非常快的無阻塞網(wǎng)絡(luò)輸入輸出(IO),它自身具備防止內(nèi)存分片的slab分配器、可以確保分配是的,即不論數(shù)據(jù)多少都能夠在常數(shù)時(shí)間內(nèi)進(jìn)行計(jì)算。
正如在memcached的描述中所說的,它主要是通過減少對數(shù)據(jù)庫的請求,從而加速了Web應(yīng)用。這種方法是合理的,因?yàn)閿?shù)據(jù)庫幾乎總是應(yīng)用層中獲取數(shù)據(jù)最慢的設(shè)備。在關(guān)系數(shù)據(jù)庫管理系統(tǒng)中,實(shí)現(xiàn)ACID(原子性、一致性、隔離性、持久性)屬性的額外支出是很高的,尤其是要從硬盤讀寫數(shù)據(jù)時(shí)。但在某些情況下,在系統(tǒng)的其他層之間使用對象緩存層,也是完全正常和明智的。
在一個(gè)典型的兩層或者三層架構(gòu)中,放置對象緩存最好的方法是把它放在數(shù)據(jù)庫層之前。正如前面提到過的,這是因?yàn)閿?shù)據(jù)庫層通常是整體執(zhí)行速度最慢的層,也通常是擴(kuò)展最貴的一層。其中有一個(gè)Web服務(wù)器層、一個(gè)應(yīng)用服務(wù)器層和一個(gè)數(shù)據(jù)庫層。這里不止有一個(gè)對象緩存,而是有兩個(gè)。一個(gè)對象緩存位于應(yīng)用服務(wù)器與數(shù)據(jù)庫層之間,另一個(gè)位于Web服務(wù)器與應(yīng)用服務(wù)器之間。如果應(yīng)用服務(wù)器要執(zhí)行大量可緩存的計(jì)算或操作,那么這種設(shè)計(jì)是很合理的。這樣可以使應(yīng)用服務(wù)器不必總是重復(fù)計(jì)算相同的數(shù)據(jù),而是可以把結(jié)果緩存起來,從而減輕了應(yīng)用服務(wù)器的負(fù)載。與數(shù)據(jù)庫的情況相似,這個(gè)緩存層可以在不添加硬件的情況下,幫助應(yīng)用服務(wù)器層擴(kuò)展。緩存的對象很可能是來自數(shù)據(jù)庫或應(yīng)用服務(wù)器的完整數(shù)據(jù)集的子集。例如,Web服務(wù)器上的應(yīng)用代碼可能會利用緩存存放用戶權(quán)限對象,但是不會存放交易金額,因?yàn)橛脩魴?quán)限不經(jīng)常改變且會被經(jīng)常訪問,而每個(gè)交易的交易金額可能各不同且只會被訪問一次。
數(shù)據(jù)庫的ACID屬性
原子性、一致性、隔離性、持久性(ACID)是數(shù)據(jù)庫管理系統(tǒng)采用的屬性,以確保交易是完全可靠的。
原子性是數(shù)據(jù)庫管理系統(tǒng)的屬性,可以確保一個(gè)交易的所有任務(wù)都被完全執(zhí)行了,或者整個(gè)交易都被回退了。硬件或軟件的故障不會造成交易只完成了一半。
一致性是確保交易前和交易后數(shù)據(jù)庫保持穩(wěn)定狀態(tài)的屬性。如果一個(gè)交易成功了,它會把數(shù)據(jù)庫從一個(gè)有效狀態(tài)轉(zhuǎn)換到另一個(gè)符合一定規(guī)則的有效狀態(tài)。
隔離性是在一個(gè)交易操作數(shù)據(jù)時(shí),防止另一個(gè)交易訪問它的屬性。大多數(shù)數(shù)據(jù)庫管理系統(tǒng)都采用數(shù)據(jù)庫鎖來確保隔離性。
持久性這個(gè)屬性指的是在系統(tǒng)把交易標(biāo)記為成功后,交易就會保持為完成的、不會回退的。所有的一致性檢查必須在交易被認(rèn)為是完成了之前完成。
如果你在網(wǎng)站建設(shè)數(shù)據(jù)庫或應(yīng)用服務(wù)器中有經(jīng)常被訪問但卻不經(jīng)常更新的數(shù)據(jù),那么使用對象緩存就非常合理。要減少負(fù)載,首先查看的就是數(shù)據(jù)庫,因?yàn)樗ǔJ亲盥彩亲钯F的一層。但除此之外,還要考慮一下系統(tǒng)中的其他層或池,看看哪里需要對象緩存。另一個(gè)可能需要對象緩存的地方是集中的會話管理緩存。如果你使用了會話數(shù)據(jù),我們建議你首先盡可能地減少會話數(shù)據(jù)。如果你可以避免使用會話,那么就根本不要采用它們,因?yàn)樗鼈冊诨A(chǔ)設(shè)施和架構(gòu)方面,實(shí)現(xiàn)成本都很高。如果你不能避免使用會話,我們建議你考慮集中的會話管理系統(tǒng),這樣可以把請求發(fā)送到任何一個(gè)Web服務(wù)器上,會話可以從一個(gè)服務(wù)器轉(zhuǎn)移到另一個(gè)服務(wù)器上,不會造成任何干擾。這樣通過一個(gè)負(fù)載均衡的解決方案,你就能夠更有效地利用Web服務(wù)器,而當(dāng)發(fā)生故障時(shí),也可以以最小的干擾,把用戶從一臺服務(wù)器上轉(zhuǎn)移到另一臺服務(wù)器上。你可以繼續(xù)檢查自己的應(yīng)用,找到更多可以應(yīng)用對象緩存的地方。
本文地址:http://123beaconmarketing.com//article/3898.html