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