① spring mvc 怎麼設計緩存
用於提供如瀏覽器緩存控制、是否必須有session開啟、支持的請求方法類型(GET、POST等)等,該類主要有如下屬性:
Set<String> supportedMethods:設置支持的請求方法類型,默認支持「GET」、「POST」、「HEAD」,如果我們想支持「PUT」,則可以加入該集合「PUT」。
boolean requireSession = false:是否當前請求必須有session,如果此屬性為true,但當前請求沒有打開session將拋出HttpSessionRequiredException異常;
boolean useExpiresHeader = true:是否使用HTTP1.0協議過期響應頭:如果true則會在響應頭添加:「Expires:」;需要配合cacheSeconds使用;
boolean useCacheControlHeader = true:是否使用HTTP1.1協議的緩存控制響應頭,如果true則會在響應頭添加;需要配合cacheSeconds使用;
boolean useCacheControlNoStore = true:是否使用HTTP 1.1協議的緩存控制響應頭,如果true則會在響應頭添加;需要配合cacheSeconds使用;
private int cacheSeconds = -1:緩存過期時間,正數表示需要緩存,負數表示不做任何事情(也就是說保留上次的緩存設置),
1、cacheSeconds =0時,則將設置如下響應頭數據:
Pragma:no-cache // HTTP 1.0的不緩存響應頭
Expires:1L // useExpiresHeader=true時,HTTP 1.0
Cache-Control :no-cache // useCacheControlHeader=true時,HTTP 1.1
Cache-Control :no-store // useCacheControlNoStore=true時,該設置是防止Firefox緩存
2、cacheSeconds>0時,則將設置如下響應頭數據:
Expires:System.currentTimeMillis() + cacheSeconds * 1000L // useExpiresHeader=true時,HTTP 1.0
Cache-Control :max-age=cacheSeconds // useCacheControlHeader=true時,HTTP 1.1
3、cacheSeconds<0時,則什麼都不設置,即保留上次的緩存設置。
此處簡單說一下以上響應頭的作用,緩存控制已超出本書內容:
HTTP1.0緩存控制響應頭
Pragma:no-cache:表示防止客戶端緩存,需要強制從伺服器獲取最新的數據;
Expires:HTTP1.0響應頭,本地副本緩存過期時間,如果客戶端發現緩存文件沒有過期則不發送請求,HTTP的日期時間必須是格林威治時間(GMT),如「Expires:Wed, 14 Mar 2012 09:38:32 GMT」;
HTTP1.1緩存控制響應頭
Cache-Control :no-cache 強制客戶端每次請求獲取伺服器的最新版本,不經過本地緩存的副本驗證;
Cache-Control :no-store 強制客戶端不保存請求的副本,該設置是防止Firefox緩存
Cache-Control:max-age=[秒] 客戶端副本緩存的最長時間,類似於HTTP1.0的Expires,只是此處是基於請求的相對時間間隔來計算,而非絕對時間。
還有相關緩存控制機制如Last-Modified(最後修改時間驗證,客戶端的上一次請求時間 在 伺服器的最後修改時間 之後,說明伺服器數據沒有發生變化 返回304狀態碼)、ETag(沒有變化時不重新下載數據,返回304)。
該抽象類默認被AbstractController和WebContentInterceptor繼承。
② php 緩存如何設計
ob_get_contents, ob_end_clean從實現上應該是ob_get_clean的分解步驟。後者因為從c代碼層面的整合,在僅單次執行時,速度上應該有微量的優勢。因為優勢遠比網路IO的延遲要小,幾乎可以忽略吧。
echo ob_get_contents應該也一般是用於首次生成模板緩存。是內存操作。
include用於直接顯示。是文件操作。
顯示模板可以用後者,做緩存所節約的時間主要是處理計算和各媒介之間的IO上的,根據自己的應用和自己的設備環境在慢的、瓶頸部分作出調整,是靈活的。沒有定式。
③ redis的一個緩存問題,怎樣才能做到設計最優
網頁緩存會對下一次打開這個網頁的速度有所幫助。 IE網頁緩存文件是可以刪除的,那隻是你瀏覽過的網頁的圖片文字等等的一些東西在,刪除下,這樣對你以後瀏覽這個網頁的時候,就不需要再次從伺服器下載圖片等數據,
④ 雲南北大青鳥設計培訓告訴你PHP應用中常用的9大緩存技術
一、全頁面靜態化緩存
也就是將頁面全部生成html靜態頁面,用戶訪問時直接訪問的靜態頁面,而不會去走php伺服器解析的流程。此種方式,在CMS系統中比較常見,比如dedecms;
一種比較常用的實現方式是用輸出緩存:
Ob_start()******要運行的代碼*******$content=Ob_get_contents();****將緩存內容寫入html文件*****Ob_end_clean();
二、數據緩存
顧名思義,就是緩存數據的一種方式;比如,商城中的某個商品信息,當用商品id去請求時,就會得出包括店鋪信息、商品信息等數據,此時就可以將這些數據緩存到一個php文件中,文件名包含商品id來建一個唯一標示;下一次有人想查看這個商品時,首先就直接調這個文件裡面的信息,而不用再去資料庫查詢;其實緩存文件中緩存的就是一個php數組之類;
Ecmall商城系統裡面就用了這種方式;
三、查詢緩存
其實這跟數據緩存是一個思路,就是根據查詢語句來緩存;將查詢得到的數據緩存在一個文件中,下次遇到相同的查詢時,就直接先從這個文件裡面調數據,不會再去查資料庫;但此處的緩存文件名可能就需要以查詢語句為基點來建立唯一標示;
按時間變更進行緩存
就是對於緩存文件您需要設一個有效時間,在這個有效時間內,相同的訪問才會先取緩存文件的內容,但是超過設定的緩存時間,就需要重新從資料庫中獲取數據,並生產最新的緩存文件;比如,我將我們商城的首頁就是設置2個小時更新一次。
四、頁面部分緩存
該種方式,是將一個頁面中不經常變的部分進行靜態緩存,而經常變化的塊不緩存,最後組裝在一起顯示;可以使用類似於ob_get_contents的方式實現,也可以利用類似ESI之類的頁面片段緩存策略,使其用來做動態頁面中相對靜態的片段部分的緩存。
該種方式可以用於如商城中的商品頁;
五、Opcode緩存
首先php代碼被解析為Tokens,然後再編譯為Opcode碼,最後執行Opcode碼,返回結果;所以,對於相同的php文件,第一次運行時可以緩存其Opcode碼,下次再執行這個頁面時,直接會去找到緩存下的opcode碼,直接執行最後一步,而不再需要中間的步驟了。
比較知名的是XCache、TurckMMCache、PHPAccelerator等。
六、按內容變更進行緩存
這個也並非獨立的緩存技術,需結合著用;就是當資料庫內容被修改時,即刻更新緩存文件;
比如,一個人流量很大的商城,商品很多,商品表必然比較大,這表的壓力也比較重;我們就可以對商品顯示頁進行頁面緩存;
當商家在後台修改這個商品的信息時,點擊保存,我們同時就更新緩存文件;那麼,買家訪問這個商品信息時,實際問的是一個靜態頁面,而不需要再去訪問資料庫;
試想,如果對商品頁不緩存,那麼每次訪問一個商品就要去資料庫查一次,如果有10萬人在線瀏覽商品,那伺服器壓力就大了;
七、內存式緩存
提到這個,可能大家想到的首先就是Memcached;memcached是高性能的分布式內存緩存伺服器。一般的使用目的是,通過緩存資料庫查詢結果,減少資料庫訪問次數,以提高動態Web應用的速度、提高可擴展性。
它就是將需要緩存的信息,緩存到系統內存中,需要獲取信息時,直接到內森塌存中取;比較常用的方式就是key_>value方式;緩孝
connect($memcachehost,$memcacheport)ordie("Couldnotconnect");$memcache->set('key','緩存的內容');$get=$memcache->get($key);//獲取信息?>
八、apache緩存模塊
apache安裝完以後,是不允許被cache的。大理IT培訓http://www.kmbdqn.cn/認為如果外接了cache或squid伺服器要求進行web加速的話,就需要在htttpd.conf里進行設置,當然前提是在安裝apache的時候要激活mod_cache的模塊。此哪圓
⑤ php不使用第三方工具,如何設計緩存
結論:可自行設計,或使用內置APCu緩存。
1 - 第三方緩存
常用的第三方緩存工具,一般是指redis,memcached,以及雲服務商提供的緩存服務。基本不脫離此二類范圍。
用法非常直觀,我們不做深入的介紹了。可在官方手冊內查看。
4 - 寫在最後
本文簡要說明了PHP內緩存數據可能使用的方法。我們推薦使用成熟的類庫或擴展,不要重復造輪子。
⑥ APP中緩存、載入與刷新機制設計【轉載】
1、為什麼要加緩存?
場景一:【等待】,在向伺服器請求新的數據時。我們讓用戶看到什麼?第一種是漂亮的等待載入頁面;第二種是緩存的內容。對於第二種,用戶可以對頁面進行操作,等待新數據時可以查看舊數據,更具有「可操作性」與「可用性」,從而減輕了從伺服器獲取數據這一動作的大小和時間長短,增強了用戶體驗。另一方面,如果內容更新的間隔較長或者用戶刷新的間隔較短,在沒有緩存的情況下,很多數據我們會多次重復的向伺服器獲取,增加了成本。
場景二:【結果】沒有聯網,或者在地鐵上網路太差無法載入數據時,如果留給用戶一個空白頁面,實在是感覺有點不負責任啊。並且很多功能在沒有聯網的情況下也有使用的可能性,比如:APP中的通訊錄,查看一些聊天記錄,通知信息,文章列表等。因為用戶打開APP不一定是要看新信息,說不定是回顧老信息(或許老信息里也有用戶之前沒看的),所以恰當的緩存可以滿足更多的用戶場景。
場景三:【金錢】有一天,一個用戶發現自己裝了某個APP後流量用的特別快,Ta可能永遠將這個APP打入冷宮了,而增加緩存正是節省流量的一個方法。雖然節省的不多或者用戶也察覺不到,但是作為一個有態度的產品經理,應該多做一些思考。
2、什麼是緩存?
緩存可分為如下幾類:
(1)app緩存。
(2)固定緩存。
(3)可手動清理的緩存。
(4)不可手動清理的緩存。
(5)臨時緩存。
其中,臨時緩存常用於一個功能頁面內,保存各欄目的緩存。同一個功能里會把子功能分為多個欄目進行劃分,每個標簽欄目下的內容在本次使用中都可保存為臨時緩存,在該功能里切換欄目,不需要重新載入數據,使用緩存顯示。
對於用戶來說,使用時達到了無縫切換瀏覽,對於伺服器來說,在短時間內數據很少會有更新,所以在一般情況下能滿足用戶的正常需求,並達到體驗優秀。
臨時緩存的清理機制是:退出該功能模塊就清除之前的緩存。也就是說下次進入該功能模塊,需要重新獲取一次數據。
很多時候我們都會用到臨時緩存,因為那些信息真的不是那麼重要,而且不需要經常反復查看,那對於那些我們經常使用而且經常需要反復查看的信息,馬海祥建議採取固定緩存,保存在本地,方便下次翻閱時不需要再一次向伺服器請求數據了。
對於固定緩存又會細分為可手動清理的緩存和不可手動清理的緩存。
第一種是我們最常見的緩存,幾乎所有產品都採用這種緩存方式。平時用戶瀏覽文章、圖集載入的數據就以這種形式緩存在本地,下次看回這篇文章、圖集時就不需要載入了。用戶也可以手動把這些緩存清理了,釋放空間。
而對於某些特殊場景,例如一些相對固定的數據,我們不願意一開始就打包進App里,這樣會占太大容量,造成產品包很大,也不願意每次進入頁面都向伺服器載入這些信息,那怎麼辦?建議的解決方法就是我們可以只載入一次就永遠存在本地了,這樣安裝包也不會大,以後也不用載入了。
3、如何清理緩存?
一般App都會在「設置」里提供一個清理緩存的功能,一鍵把空間釋放。除此之外,App最好要設計自動清理機制,可以通過兩個維度來設計這個機制。
(1)、時間
通過設定一個固定的時間,或者根據用戶使用周期靈活設定時間來清理緩存。每個產品的場景不一,用戶使用頻率不一,設定這個機制的時候就需要結合實際情況考慮了。
(2)、容量
一般是設定一個容量上限,採用堆棧的設計原理進行緩存清理,溢出堆棧的舊數據將自動清除。
1、頁面載入
方案1:單頁面整體載入
這種載入比較簡單,一般運用在頁面內容比較單一的情況下,所以直接一次性載入完所有數據後再顯示內容。其單頁面載入失敗的狀態相對來說也比較好處理。
方案2:單頁面分塊載入
這種方案的特點是,能讓用戶逐步看到內容,在這個漸進的過程中降低用戶的焦慮心理。
其中又可以分為,模塊間有關聯性的,先載入父內容,再載入子內容。如優酷,先把欄目載入出來,再載入各欄目的內容。
模塊間沒有絕對關聯性的,可獨自載入各自模塊內容,根據請求的速度不同分別顯示。這樣處理有一定幾率讓用戶在沒完全刷出數據的情況下就能找到自己需要的功能,如大眾點評、淘寶客戶端等。
框架固定,內容更新的,可先把框架顯示出來,再把各模塊的數據各自載入顯示,如各種iOS自帶應用。
這種分模塊載入的需要特別注意載入失敗的狀態,畢竟每個模塊都提示載入失敗,點擊重試是很挫的一件事,可以根據信息的優先順序來決定哪些數據失敗了採用默認狀態,哪些數據採用失敗提示。
方案3:跨頁面載入
父頁面&子頁面 or 同一app內,頁面間欄位可以復用的,在載入子頁面時不需要重新載入新數據。
方案4:預載入
這種載入方式的特點是,在載入一個頁面內容的同時,預測用戶的下一步行為,並為他下一步需要使用的頁面載入內容,使得他在下一步的操作中能立刻獲取信息而不需要載入等待。
預載入提供給用戶無縫的產品使用體驗,使得用戶在使用產品的過程中更直接流暢,沒有被打斷的感覺。
具體的例子有:
在瀏覽圖集的時候,當看到第一張的圖片時,就自動後台載入第二第三第四張圖片,用戶瀏覽完第一張圖片切換到第二張時就不會有載入等待的過程。
在瀏覽新聞列表時,就把每篇新聞的內容在後台進行預載入,用戶選擇看某篇新聞時,能立刻閱讀到內容。
但是這種方案也需要面臨很多的問題,馬海祥覺得最直接的就是流量問題,因為會自動跑掉很多用戶可能根本用不上的數據流量,所以,一般情況下馬海祥建議可以設定在wifi環境才採用這種載入模式。又或者設定載入規則,只把主要內容預載入,而部分次要內容可以在用戶真的用到的時候才載入,例如預載入新聞正文的情況,可以只載入文本信息,圖片信息等到用戶進入內頁才載入。這種預載入與分塊載入結合的方式也普遍運用在各個場景。
另外,預載入也需要時間的,他只是不在客戶端顯示給用戶,默默在後台運作而已,需要特殊考慮未載入完用戶就使用到那些信息的情況,所以在做預載入設計時需要同時考慮另一種適合該情況的普通載入方式。
預載入需要根據具體的場景來進行設計,設定好信息優先順序,綜合考慮各種類型信息的具體大小流量,整體考慮預載入的方式,這些都是需要經過精心分析思考的。
隨著網路環境的發展,預載入將成為以後產品普遍的載入方式,他提供給用戶的無縫使用體驗**地提升了產品的可用性。
2、操作載入
除了頁面的信息需要載入,頁面內的操作也是需要通過給伺服器發送請求記錄的。
方案1:載入層
進行一個操作後,彈出模態的提示層,告知用戶正在載入。採用模態的提示主要是防止用戶在該過程中進行其他操作,導致當前載入出錯。由於採用模態的提示,並且有可能因為網路原因導致長時間處於載入狀態,建議提供一個「關閉」的操作,中止本次載入,恢復App可用狀態。載入失敗時可在當前浮層變換為失敗提示。模態提示層是最穩妥的方式,但他會使用戶在使用過程中有打斷的感覺。
方案2:控制項自身載入狀態
這種方式是把操作載入的狀態與控制項的樣式結合起來了,對某個控制項進行操作後,控制項變換為載入狀態,此時控制項不能重復操作。由於這種載入方式是控制項的自身狀態,不影響其他操作,所以用戶也可以對頁面進行其他操作,可能會導致同時有多個請求的情況,增加了載入失敗的風險,這也算是這種方式的弊端,不過這種極端情況很少出現。請求失敗後,可配合Toast提示告知用戶失敗的原因。
方案3:後台載入
用戶在操作後,客戶端立刻反饋操作成功,然後把請求放到後台與伺服器交互,這一過程用戶不需要了解,不需要等待,在正常情況**驗是非常棒的。
但是在極端情況下會出現一些莫名其妙的狀況,由於是後台記錄請求並與伺服器交互,所以實際請求是否成功客戶端是不說明的,全部以操作成功來顯示,這就會導致用戶誤以為操作成功了,但實際上下次來看發現沒有成功。
所以,這種載入方式是需要根據具體使用場景來權衡使用的,對於一些重要的操作,建議還是使用模態的方式載入,對於一些小操作,如點贊、訂閱、關注,可採用後台載入的方式。
3、下一頁載入還是當前也載入
用戶進入首頁,正式邁出體驗的第一步,接下來迎接的就是基於用戶目標的界面間跳轉。完成界面的跳轉,會有各種載入策略,但無論形式如何,我們都可以將其歸為兩大類:「下一頁載入」、「當前頁載入」。
(1)「下一頁載入」滿足了用戶提前窺視的需求
我們把頁面看成「點」,頁面流是連接這些點的「線」,我們以「用戶想買一條牛仔褲」這一場景作為案例做了簡單的眼動研究,從應用啟動到商品瀏覽再到商品確定最後進入下單頁,用戶所呈現的瞳孔梯次增大,即E>D>C>B>A,為了解釋這一現象,通過與被試交流,我們發現相比於各種瀏覽,用戶更期待看到他們想看到的東西。因此此時的」下一頁載入「正好,滿足了用戶提前窺視的需求。
(2) Wait!I Need Think Think
我們以同樣的方式又對「使用支付寶對手機充值」這一場景做了研究,從開始支付到二次確認支付,用戶所呈現的瞳孔都比較大,即A與B近似相等,通過訪談,我們發現與「遞增體驗流」不同的是,當用戶遇到判斷邏輯的界面時,用戶並非急於想看下一頁面到底包含怎樣的內容,而是非0即1的驗證心態,即我的操作效成功了嗎?因此在判斷邏輯界面中,用戶的內容窺視需求並不強,當然也沒什麼內容,要麼僅是一個小小的Toast,再大一點就是一個簡單的信息反饋界面(意味著「下一頁載入」在這里就是個雞肋),用戶反而對非0即1的驗證需求較為強烈,其中還伴隨著等待結果過程中的緊張感、激動感,因此界面通過 當前頁載入 表明系統正在努力地處理用戶交代的指令**了用戶的緊張感、激動感,直到結果顯現——「處理成功」,完成了非0即1驗證的滿足感。
4、先載入還是先展示
當需載入的是功能時,可以先展示再載入,當需載入的是內容時,則反過來。
淘寶
打開APP的第一個頁面是功能,所以先展示再載入的:
隨便點擊一個模塊(不要點菜單),下面要展示的將要是內容(商品),所以是先載入再展示的,沒有載入完都不展示:
京東
同樣的,功能模塊先展示後載入:
內容先載入,沒載入完不展示:
兩種方式各有利弊:
先展示,後載入:
優點:給用戶0等待的錯覺
缺點:當前數據有可能是錯的,而且得等用戶操作到最後一步才會發現
先載入,後展示:
優點:保證數據的質量和准確
缺點:網路不好時,造成等待
顯然,功能模塊對於一個產品來說是既有固定的,在短時間內幾乎不會更新,所以這種數據出現錯誤或與當前狀態不同的幾率小得多,因此,可以使用先展示後載入的方式。
另一方面,內容(特別是商品數據)是最容易產生變動的,為了保證每一個消費者看到的數據都是最真實,最准確的,所以務必要先載入再展示。
1、空白頁面刷新失敗有提示
現在的應用都標榜以內容為中心,所以都會極力避免空白頁面的出現。對於大部分的應用,最好的方法就是使用緩存,進入頁面之後,先顯示之前的緩存,然後再進行內容的刷新。其次,消滅空白頁面的第二種方法就是提供系統推薦項進行替代。但是對於一些頁面,頁面內容跟用戶的使用狀態關系密切,無法避免會出現空白頁面,這時候會使用一些引導類的提示,使得頁面變得更加豐富,同時可以促進用戶產生內容。
但是一些資訊類應用,比如讀讀日報,打開默認是空白頁面,然後再載入內容(我不是很明白這種設定)。其他一些應用,比如:豆瓣一刻和MONO,每天第一次進入應用的時候也會出現空白頁面。我猜想第二類應用的展示方式的原因是這樣的。他們的內容**都是嚴格以天為單位的,每天固定時段**精選內容。他們會希望你每天只看並且看完當天的東西,所以一旦到了第二天,昨天的內容就是累贅了。所以每天第一次進入應用的時候會出現空白頁面,象徵著每天都是從新開始。此時就會對應一個「空白刷新」邏輯。
空白刷新對應的場景是這樣子的:用戶想要刷新出內容,並且用戶知道這里可以刷出新內容,但是沒有刷新成功,這時候需要給用戶一個交待。所以需要提示用戶。同時,提示完用戶之後需要給用戶一個解決方法,這就是「點擊後重試」。
2、緩存頁面刷新失敗無提示
常見的應用比如知乎、網易新聞、好奇心日報、微信朋友圈等,這些應用都會採用緩存的形式,打開之後顯示的是緩存內容,然後系統會給伺服器發送請求,如果有內容更新的話就會自動更新一次內容,更新之後的內容直接覆蓋當前的內容。更新失敗之後是沒有提示的。但是有一些應用,比如有道詞典、企鵝FM、網易雲音樂等,他們更新失敗之後是有提示的。
我覺得這兩種應用的區分點在於
應用的使用頻率;
內容的時間連續性;
界面之間的關系緊密度。
比如說網易新聞,作為一個打發時間的工具,每天使用頻率就會比較高,所以用戶進來之後是想看看有沒有更新。其次,網易新聞的內容是連續不斷更新的,所以用戶會知道當前顯示的內容是我看看過並且處理過的。最後,新聞列表頁面顯示的是摘要,用戶可以通過摘要快速進行判斷是否要進入詳情頁,摘要有助於幫助用戶回憶上一次的使用場景。
所以這就對應著一個這樣的場景:用戶只是想看看有沒有更新,所以他們已經做好了「沒有新內容」的心理預期,所以即使是更新不了內容,用戶也不會想太多。反倒是,如果進行了錯誤提示,用戶可能會有一種挫敗感。因為他知道現在有內容,只是因為網路的原因而沒有更新,他要進行的任務受到了外界因素的阻礙,由此產生一種細微的挫敗感。
3、緩存頁面刷新失敗有提示
另一類應用,使用頻率沒那麼高,或者內容不具備時間連續性的,又或者說當前界面無法喚起用戶上一次的使用場景。那麼就有必要進行率先你失敗提示了。
比如說企鵝FM,音頻類的應用註定使用不會那麼頻繁,因為通過視覺接收的信息會比通過聽覺接收的信息更快更多,同時音頻類對環境的要求較高(比如用耳機時要求環境不那麼嘈雜,外放時要求在私人場所)。其次,此類應用都是實時推薦的,不存在時間連續性的問題,用戶無法通過時間來判斷內容是否被閱讀過。再者,標題也無法幫你快速做出判斷,你還是要進去聽過才知道內容是什麼。最後如果不提醒,用戶進入到詳情頁再收到提醒,就會覺得應用浪費了用戶的時間。所以,對於此類內容,刷新失敗是有必要進行提醒的。
⑦ Fikker的緩存怎麼設計的
他們的白皮書上寫的很詳細。很長~~ 我給你截一段說明。
2.1. 緩存說明
在 Fikker 系統中,緩存分為智能緩存,強制緩存,拒絕緩存。加速緩存的頁面(html,
asp,aspx,php,jsp,js,css 等)被 gzip 壓縮後以平衡二叉樹的索引結構存放在內
存中,不對硬碟進行任何讀寫(日誌除外)。當加速緩存中的頁面被訪問命中以後,
立即通過壓縮傳輸方式返回給瀏覽器。以上處理方式有如下好處:(1)、不讀寫硬
盤,通過內存進行數據交換會極大的提高頁面相應速度;(2)、將頁面數據經過 gzip
壓縮後存儲,即減少了對內存空間的需求,也會極大的減少數據傳輸量,從整體上
提高響應速度和傳輸效率。
⑧ 關於一級緩存和二級緩存,以及nvidia!!!!
nvidia是一個公司
而高速緩存分為一級緩存(即L1 Cache)和二級緩存(即L2Cache)。CPU在運行時首先從一級緩存讀取數據,然後從二級緩存讀取數據,然後從內存和虛擬內存讀取數據,因此高速緩存的容量和速度直接影響到CPU的工作性能。 一級緩存都內置在CPU內部並與CPU同速運行,可以有效的提高CPU的運行效率。一級緩存越大,CPU的運行效率越高,但受到CPU內部結構的限制,一級緩存的容量都很小。 二級緩存對CPU運行效率的影響也很大,現在的二級緩存一般都集成在中,但有分為晶元內部和外部兩種,集成在晶元內部的二級緩存與CPU同頻率二級緩存(即全速二級緩存),而集成在晶元外部的二級緩存的運行頻率 是CPU的運行頻率的一半(即半速二級緩存),因此運行效率較低。 但是一級緩存和二級緩存的大,它究竟有多少好處呢?你得告訴我們經銷商,實際上你得用最普通的話跟他講。所以我們給他們打個比方,說這個就好比你開汽車的時候,後備箱是整個的一級緩存,假如說扶手裡面有一個小箱子,那是你的二級緩存。二級緩存大好在哪裡呢?就是你隨時開車的時候,隨時在裡面都可以取東西了。假如你二級緩存小的話,你還得把車停下來,到後備箱里取東西。
首先我們來簡單了解一下一級緩存。目前所有主流處理器大都具有一級緩存和二級緩存,少數高端處理器還集成了三級緩存。其中,一級緩存可分為一級指令緩存和一級數據緩存。一級指令緩存用於暫時存儲並向CPU遞送各類運算指令;一級數據緩存用於暫時存儲並向CPU遞送運算所需數據,這就是一級緩存的作用(如果大家對上述文字理解困難的話,可參照下圖所示)。
那麼,二級緩存的作用又是什麼呢?簡單地說,二級緩存就是一級緩存的緩沖器:一級緩存製造成本很高因此它的容量有限,二級緩存的作用就是存儲那些CPU處理時需要用到、一級緩存又無法存儲的數據。同樣道理,三級緩存和內存可以看作是二級緩存的緩沖器,它們的容量遞增,但單位製造成本卻遞減。需要注意的是,無論是二級緩存、三級緩存還是內存都不能存儲處理器操作的原始指令,這些指令只能存儲在CPU的一級指令緩存中,而餘下的二級緩存、三級緩存和內存僅用於存儲CPU所需數據。
根據工作原理的不同,目前主流處理器所採用的一級數據緩存又可以分為實數據讀寫緩存和數據代碼指令追蹤緩存2種,它們分別被AMD和Intel所採用。不同的一級數據緩存設計對於二級緩存容量的需求也各不相同,下面讓我們簡單了解一下這兩種一級數據緩存設計的不同之處。
一、AMD一級數據緩存設計
AMD採用的一級緩存設計屬於傳統的「實數據讀寫緩存」設計。基於該架構的一級數據緩存主要用於存儲CPU最先讀取的數據;而更多的讀取數據則分別存儲在二級緩存和系統內存當中。做個簡單的假設,假如處理器需要讀取「AMD ATHLON 64 3000+ IS GOOD」這一串數據(不記空格),那麼首先要被讀取的「AMDATHL」將被存儲在一級數據緩存中,而餘下的「ON643000+ISGOOD」則被分別存儲在二級緩存和系統內存當中(如下圖所示)。
需要注意的是,以上假設只是對AMD處理器一級數據緩存的一個抽象描述,一級數據緩存和二級緩存所能存儲的數據長度完全由緩存容量的大小決定,而絕非以上假設中的幾個位元組。「實數據讀寫緩存」的優點是數據讀取直接快速,但這也需要一級數據緩存具有一定的容量,增加了處理器的製造難度(一級數據緩存的單位製造成本較二級緩存高)。
二、Intel一級數據緩存設計
自P4時代開始,Intel開始採用全新的「數據代碼指令追蹤緩存」設計。基於這種架構的一級數據緩存不再存儲實際的數據,而是存儲這些數據在二級緩存中的指令代碼(即數據在二級緩存中存儲的起始地址)。假設處理器需要讀取「INTEL P4 IS GOOD」這一串數據(不記空格),那麼所有數據將被存儲在二級緩存中,而一級數據代碼指令追蹤緩存需要存儲的僅僅是上述數據的起始地址(如下圖所示)。
由於一級數據緩存不再存儲實際數據,因此「數據代碼指令追蹤緩存」設計能夠極大地降CPU對一級數據緩存容量的要求,降低處理器的生產難度。但這種設計的弊端在於數據讀取效率較「實數據讀寫緩存設計」低,而且對二級緩存容量的依賴性非常大。
在了解了一級緩存、二級緩存的大致作用及其分類以後,下面我們來回答以下硬體一菜鳥網友提出的問題。
從理論上講,二級緩存越大處理器的性能越好,但這並不是說二級緩存容量加倍就能夠處理器帶來成倍的性能增長。目前CPU處理的絕大部分數據的大小都在0-256KB之間,小部分數據的大小在256KB-512KB之間,只有極少數數據的大小超過512KB。所以只要處理器可用的一級、二級緩存容量達到256KB以上,那就能夠應付正常的應用;512KB容量的二級緩存已經足夠滿足絕大多數應用的需求。
這其中,對於採用「實數據讀寫緩存」設計的AMD Athlon 64、Sempron處理器而言,由於它們已經具備了64KB一級指令緩存和64KB一級數據緩存,只要處理器的二級緩存容量大於等於128KB就能夠存儲足夠的數據和指令,因此它們對二級緩存的依賴性並不大。這就是為什麼主頻同為1.8GHz的Socket 754 Sempron 3000+(128KB二級緩存)、Sempron 3100+(256KB二級緩存)以及Athlon 64 2800+(512KB二級緩存)在大多數評測中性能非常接近的主要原因。所以對於普通用戶而言754 Sempron 2600+是值得考慮的。
反觀Intel目前主推的P4、賽揚系列處理器,它們都採用了「數據代碼指令追蹤緩存」架構,其中Prescott內核的一級緩存中只包含了12KB一級指令緩存和16KB一級數據緩存,而Northwood內核更是只有12KB一級指令緩存和8KB一級數據緩存。所以P4、賽揚系列處理器對二級緩存的依賴性是非常大的,賽揚D 320(256KB二級緩存)與賽揚 2.4GHz(128KB二級緩存)性能上的巨大差距就很好地證明了這一點;而賽揚D和P4 E處理器之間的性能差距同樣十分明顯。
最後,如果您是狂熱的游戲發燒友或者從事多媒體製作的專業用戶,那麼具有1MB二級緩存的P4處理器和具有512KB/1MB二級緩存的Athlon 64處理器才是您理想的選擇。因為在高負荷的運算下,CPU的一級緩存和二級緩存近乎「爆滿」,在這個時候大容量的二級緩存能夠為處理器帶來5%-10%左右的性能提升,這對於那些要求苛刻的用戶來說是完全有必要的。
⑨ 只用PHP,如何設計一套緩存系統
既然都是文件存儲,那你這樣還不如直接用Mysql做一個緩存表。
而且本身mysql也自己實現了一套查詢緩存~