WIKI使用導(dǎo)航
站長百科導(dǎo)航
站長專題
- 網(wǎng)站推廣
- 網(wǎng)站程序
- 網(wǎng)站賺錢
- 虛擬主機
- cPanel
- 網(wǎng)址導(dǎo)航專題
- 云計算
- 微博營銷
- 虛擬主機管理系統(tǒng)
- 開放平臺
- WIKI程序與應(yīng)用
- 美國十大主機
緩存
緩存(Cache memory)是硬盤控制器上的一塊內(nèi)存芯片,具有極快的存取速度,它是硬盤內(nèi)部存儲和外界接口之間的緩沖器。由于硬盤的內(nèi)部數(shù)據(jù)傳輸速度和外界介面?zhèn)鬏斔俣炔煌彺嬖谄渲衅鸬揭粋€緩沖的作用。緩存的大小與速度是直接關(guān)系到硬盤的傳輸速度的重要因素,能夠大幅度地提高硬盤整體性能。當硬盤存取零碎數(shù)據(jù)時需要不斷地在硬盤與內(nèi)存之間交換數(shù)據(jù),有大緩存,則可以將那些零碎數(shù)據(jù)暫存在緩存中,減小外系統(tǒng)的負荷,也提高了數(shù)據(jù)的傳輸速度。
基本簡介[ ]
緩存是指可以進行高速數(shù)據(jù)交換的存儲器,它先于內(nèi)存與CPU交換數(shù)據(jù),因此速度很快。L1 Cache(一級緩存)是CPU第一層高速緩存。內(nèi)置的L1高速緩存的容量和結(jié)構(gòu)對CPU的性能影響較大,不過高速緩沖存儲器均由靜態(tài)RAM組成,結(jié)構(gòu)較復(fù)雜,在CPU管芯面積不能太大的情況下,L1級高速緩存的容量不可能做得太大。一般L1緩存的容量通常在32—256KB。L2 Cache(二級緩存)是CPU的第二層高速緩存,分內(nèi)部和外部兩種芯片。內(nèi)部的芯片二級緩存運行速度與主頻相同,而外部的二級緩存則只有主頻的一半。L2高速緩存容量也會影響CPU的性能,原則是越大越好,普通臺式機CPU的L2緩存一般為128KB到2MB或者更高,筆記本、服務(wù)器和工作站上用CPU的L2高速緩存最高可達1MB-3MB。
緩存只是內(nèi)存中少部分數(shù)據(jù)的復(fù)制品,所以CPU到緩存中尋找數(shù)據(jù)時,也會出現(xiàn)找不到的情況(因為這些數(shù)據(jù)沒有從內(nèi)存復(fù)制到緩存中去),這時CPU還是會到內(nèi)存中去找數(shù)據(jù),這樣系統(tǒng)的速度就慢下來了,不過CPU會把這些數(shù)據(jù)復(fù)制到緩存中去,以便下一次不要再到內(nèi)存中去取。隨著時間的變化,被訪問得最頻繁的數(shù)據(jù)不是一成不變的,也就是說,剛才還不頻繁的數(shù)據(jù),此時已經(jīng)需要被頻繁的訪問,剛才還是最頻繁的數(shù)據(jù),又不頻繁了,所以說緩存中的數(shù)據(jù)要經(jīng)常按照一定的算法來更換,這樣才能保證緩存中的數(shù)據(jù)是被訪問最頻繁的。
工作原理[ ]
緩存的工作原理是當CPU要讀取一個數(shù)據(jù)時,首先從緩存中查找,找到就立即讀取并送給CPU處理;沒有找到,就用相對慢的速度從內(nèi)存中讀取并送給CPU處理,同時把這個數(shù)據(jù)所在的數(shù)據(jù)塊調(diào)入緩存中,可以使得以后對整塊數(shù)據(jù)的讀取都從緩存中進行,不必再調(diào)用內(nèi)存。正是這樣的讀取機制使CPU讀取緩存的命中率非常高(大多數(shù)CPU可達90%左右),也就是說CPU下一次要讀取的數(shù)據(jù)90%都在緩存中,只有大約10%需要從內(nèi)存讀取。這大大節(jié)省了CPU直接讀取內(nèi)存的時間,也使CPU讀取數(shù)據(jù)時基本無需等待。總的來說,CPU讀取數(shù)據(jù)的順序是先緩存后內(nèi)存。
RAM和ROM相對的,RAM是掉電以后,其中的信息就消失那一種,ROM在掉電以后信息也不會消失那一種。RAM又分兩種,一種是靜態(tài)RAM,SRAM;一種是動態(tài)RAM,DRAM。前者的存儲速度要比后者快得多,使用的內(nèi)存一般都是動態(tài)RAM。為了增加系統(tǒng)的速度,把緩存擴大不就行了嗎,擴大的越大,緩存的數(shù)據(jù)越多,系統(tǒng)不就越快了嗎?緩存通常都是靜態(tài)RAM,速度是非常的快, 但是靜態(tài)RAM集成度低(存儲相同的數(shù)據(jù),靜態(tài)RAM的體積是動態(tài)RAM的6倍), 價格高(同容量的靜態(tài)RAM是動態(tài)RAM的四倍), 由此可見,擴大靜態(tài)RAM作為緩存是一個非常愚蠢的行為, 但是為了提高系統(tǒng)的性能和速度,必須要擴大緩存, 這樣就有了一個折中的方法,不擴大原來的靜態(tài)RAM緩存,而是增加一些高速動態(tài)RAM做為緩存, 這些高速動態(tài)RAM速度要比常規(guī)動態(tài)RAM快,但比原來的靜態(tài)RAM緩存慢, 把原來的靜態(tài)ram緩存叫一級緩存,而把后來增加的動態(tài)RAM叫二級緩存。
Web 應(yīng)用系統(tǒng)存在哪些速度差異?[ ]
- 讀取文件系統(tǒng) ? 讀取磁盤
- 讀取數(shù)據(jù)庫內(nèi)存 ? 讀取文件系統(tǒng)
- 讀取應(yīng)用內(nèi)存 ? 訪問數(shù)據(jù)庫服務(wù)器
- 讀取靜態(tài)文件 ? 訪問應(yīng)用服務(wù)器
- 讀取瀏覽器緩存 ? 訪問網(wǎng)站
緩存技術(shù)分類[ ]
- 操作系統(tǒng)磁盤緩存 ? 減少磁盤機械操作
- 數(shù)據(jù)庫緩存 ? 減少文件系統(tǒng) I/O
- 應(yīng)用程序緩存 ? 減少對數(shù)據(jù)庫的查詢
- 客戶端瀏覽器緩存 ? 減少對網(wǎng)站的訪問
PHP緩存技術(shù)[ ]
WEB程序獲取信息的方式主要是查詢數(shù)據(jù)庫,當數(shù)據(jù)庫不是很大的情況下不會有太大的問題.然而,隨著網(wǎng)站的發(fā)展,數(shù)據(jù)庫呈幾何級數(shù)的方式增長的時候,就會出現(xiàn)瓶頸.于是PHP緩存技術(shù)誕生了。.PHP緩存技術(shù)工作時,當程序查詢數(shù)據(jù)的時候,會把相應(yīng)的結(jié)果序列化后保存到文件中,以后同樣的查詢語句就可以不用直接查詢數(shù)據(jù)庫,而是從緩存文件中獲得。這一改進使得程序運行速度得以大幅度提升.
- 目前應(yīng)用PHP緩存技術(shù)比較流行的方法主要是Adodb+Smarty這樣的黃金搭檔.
- PHP緩存技術(shù)工作原理
- 首先看看adodb提供的數(shù)據(jù)緩存功能:
- <?php
- include('adodb.inc.php');load code common to ADOdb
- $ADODB_CACHE_DIR = '/usr/ADODB_cache';
- $conn = &ADONewConnection('mysql');create a connection
- $conn->PConnect(' ','userid',,'agora');connect to MySQL, agora db
- $sql = 'select CustomerName, CustomerID from customers';
- $rs = $conn->CacheExecute(15,$sql);
- ?> 如上,每次查詢數(shù)據(jù)的時候,會把相應(yīng)的結(jié)果序列化后保存到文件中,以后同樣的查詢語句就可以不用直接查詢數(shù)據(jù)庫,而是從緩存文件中獲得。
- 再來看看Smarty提供的頁面緩存功能:
- <?php 1<?php
- require('Smarty.class.php');
- $smarty = new Smarty;
- $smarty->caching = true;
- if(!$smarty->is_cached('index.tpl')) {
- // No cache available, do variable assignments here.
- $contents = get_database_contents();
- $smarty->assign($contents);
- }
- $smarty->display('index.tpl');
- ?>
如上,每次訪問頁面的時候,都會先檢測相應(yīng)的緩存是否存在,如果不存在,就連接數(shù)據(jù)庫,得到數(shù)據(jù),完成模板變量的賦值,顯示頁面,同時生成緩存文件,這樣下次訪問的時候緩存文件就發(fā)揮作用了,而不會再執(zhí)行if塊的數(shù)據(jù)查詢語句了。當然,在實際使用中會有很多東西要考慮,比如,有效期的設(shè)置,緩存組的設(shè)置等等,具體可以查看Smarty手冊中有關(guān)緩存(caching)的相關(guān)章節(jié)。
以上兩個PHP流行組件緩存方式的側(cè)重點是不同的,對于Adodb的緩存而言,它緩存的是數(shù)據(jù),對于Smarty的緩存而言,它緩存的是頁面。其他提供緩存功能的組件還有很多(如:PEAR::Cache_Lite等等),實際編程中使用哪個方案要具體情況具體分析,也可能會綜合使用。
使用這些組件內(nèi)置的緩存方案有一個很明顯的好處是它們的實現(xiàn)對客戶端而言都很透明。只要進行必要的設(shè)置(如:緩存時間,緩存目錄等等)就可以了,而不用過多考慮實現(xiàn)緩存的細節(jié)問題,系統(tǒng)會根據(jù)設(shè)置自動管理緩存。但是其缺點也同樣明顯,因為每次請求仍然要用PHP解析一遍,效率和純靜態(tài)相比還是大打折扣,在大的PV面前還是不能滿足要求,在這種情況下,僅僅做動態(tài)緩存就不夠了,必須實現(xiàn)靜態(tài)緩存。
PHP,一門最近幾年興起的web設(shè)計腳本語言,由于它的強大和可伸縮性,近幾年來得到長足的發(fā)展,php相比傳統(tǒng)的asp網(wǎng)站,在速度上有絕對的優(yōu)勢,想mssql轉(zhuǎn)6萬條數(shù)據(jù)php如需要40秒,asp不下2分鐘.但是,由于網(wǎng)站的數(shù)據(jù)越來越多,我們渴求能更快速的調(diào)用數(shù)據(jù),不必要每次都從數(shù)據(jù)庫調(diào),我們可以從其他的地方,比方一個文件,或者某個內(nèi)存地址,這就是php的緩存技術(shù),也就是Cache技術(shù).
內(nèi)容加載[ ]
在使用緩存數(shù)據(jù)前,必須將數(shù)據(jù)加載到緩存中,有兩種機制來加載數(shù)據(jù):
- 提前加載Proactive Load——使用這種方式時,你提前將所有的狀態(tài)數(shù)據(jù)加載到緩存中,可能在應(yīng)用程序或線程啟動時進行,然后在應(yīng)用程序或線程的生存期內(nèi)一直緩存;
- 動態(tài)加載Reactive Load——或稱反應(yīng)式加載,當使用這種方法時,在應(yīng)用程序請求數(shù)據(jù)時取到數(shù)據(jù),并且將它緩存起來以備后續(xù)使用。
過期策略[ ]
另外一個關(guān)鍵因素是如何保持緩存數(shù)據(jù)和主數(shù)據(jù)(文件或數(shù)據(jù)庫或其他的應(yīng)用程序資源)的一致性,你可以定義過期策略來決定緩存中的內(nèi)容,如已經(jīng)緩存的時間或者收到其他資源的通知。
Asp.net緩存[ ]
將常用的數(shù)據(jù)保存在內(nèi)存中對asp的開發(fā)人員來說并不陌生,Session對象和Application對象提供鍵值對來緩存數(shù)據(jù),Session對象保存和單個用戶有關(guān)的數(shù)據(jù),Application對象可保留和應(yīng)用程序有關(guān)的數(shù)據(jù),每個用戶都可以訪問。
在Asp.net中,提供了專門用于緩存數(shù)據(jù)的Cache對象,它的應(yīng)用范圍是應(yīng)用程序域。生存期是和應(yīng)用程序緊密相關(guān)的,每當應(yīng)用程序啟動的時候就重新創(chuàng)建Cache對象。它域Application對象的主要區(qū)別就是提供了專門用于緩存管理的特性,比如依賴和過期策略。
你可以使用Cache對象和它的屬性來實現(xiàn)高級的緩存功能,同時可以利用Asp.net Cache來對客戶端輸出的響應(yīng)內(nèi)容進行緩存。關(guān)于Asp.net中的緩存技術(shù),有以下內(nèi)容要介紹:
編程緩存Programmatic Caching[ ]
Cache對象定義在System.Web.Caching命名空間,可以使用HttpContext類的Cache屬性或Page對象的Cache屬性來得到Cache的引用,Cache對象除了存儲鍵值對以外,還可以存儲.net框架的對象。下面介紹相應(yīng)的依賴和過期策略。
依賴和過期策略[ ]
當向緩存中加數(shù)據(jù)時,可以指定它的依賴關(guān)系來實現(xiàn)在某些情況下強制移除它??捎玫姆桨赴ㄒ韵聨追N:
- 1.文件依賴(File Dependency)——當硬盤上的某個(某些)文件更改時,強制移除緩存數(shù)據(jù);
如:
- CacheDependency cDependency = new
- CacheDependency(Server.MapPath("authors.XML"));
- Cache.Insert("CachedItem", item, cDependency);
- 2.鍵值依賴(Key Dependency)——指定緩存中的某個數(shù)據(jù)項更改時移除。如:
- // Create a cache entry.
- Cache["key1"] = "Value 1";
- // Make key2 dependent on key1.
- String[] dependencyKey = new String[1];
- dependencyKey[0] = "key1";
- CacheDependency dependency = new CacheDependency(null, dependencyKey);
- Cache.Insert("key2", "Value 2", dependency);
- 3.基于時間的過期策略——按照預(yù)先定義的時間策略來使數(shù)據(jù)失效,可以是絕對時間(如某個日期的18:00)也可以是相對現(xiàn)在的相對時間。如:
- /// Absolute expiration
- Cache.Insert("CachedItem", item, null, DateTime.Now.AddSeconds(5),Cache.NoSlidingExpiration);
- /// Sliding expiration
- Cache.Insert("CachedItem", item, null, Cache.NoAbsoluteExpiration,
- TimeSpan.FromSeconds(5));
使用太短和太長的過期時間都不行,不是造成用不上的緩存數(shù)據(jù),就是緩存了陳舊的數(shù)據(jù)并加重了緩存負擔(dān),所以可以使用高并發(fā)的測試來決定過期時間的最佳值。
對緩存項使用優(yōu)先級
當運行應(yīng)用程序的服務(wù)器內(nèi)存不足時,會自動清除緩存中的數(shù)據(jù),稱為“清除scavenging”。此時,Cache對象根據(jù)緩存項的優(yōu)先級來決定先移除哪些緩存數(shù)據(jù),你可以在代碼中指定緩存項的優(yōu)先級。參看MSDN中“CacheItemPriority 枚舉”,如:
- Cache.Insert("DSN", connectionString, null, d, t, CacheItemPriority.High, onRemove);
刷新數(shù)據(jù)(清除緩存)
沒有直接的方法來刷新Asp.net的輸出緩存,但是有替代方法(設(shè)置所有數(shù)據(jù)失效),比如:Response.Cache.SetExpires(DateTime.Now)
這可以清除緩存,但頁面上并不立刻體現(xiàn)出來,直到最初的緩存期結(jié)束,比如:<%@ OutputCache Duration="10" VaryByParam="none" %>指令指定的緩存只會在10秒后才清除。通常并不需要清除所有緩存項,你只要重新加載數(shù)據(jù)更新緩存就夠了。
輸出緩存(Output Cache)
Page Output Caching將對頁面請求的響應(yīng)放入緩存中,后續(xù)對此頁面的請求將直接從緩存中得到信息而不是重建此頁面。可以通過添加Page指令(高級別,聲明實現(xiàn))來實現(xiàn),也可以使用HTTPCachePolicy類來實現(xiàn)(低級別,程序?qū)崿F(xiàn))。本指南不打算介紹技術(shù)細節(jié),只給出如何更好使用的指南和最佳實踐。有四方面的內(nèi)容:
- 決定緩存的內(nèi)容
- 緩存動態(tài)頁面
- 控制緩存的位置
- 配置頁面輸出緩存
頁面片斷緩存[ ]
- 有時候緩存整個頁面并不靈活,同時內(nèi)存的發(fā)但也比較大,這時候應(yīng)考慮片斷緩存。頁面片斷緩存適合以下類型的數(shù)據(jù):
- 創(chuàng)建開銷很大的頁面片斷(控件);
- 包含靜態(tài)數(shù)據(jù)的頁面片斷;
- 可被多個用戶使用的頁面片斷;
- 多個頁面共享的頁面片斷(如公用菜單條)
以下是緩存部分頁面的例子:
- // Partial caching for 120 seconds
- [System.Web.UI.PartialCaching(120)]
- public class WebUserControl : System.Web.UI.UserControl
- {
- // Your Web control code
- }