各種快取的比較收藏
基於我開發download的經驗,以及對各種快取的理解,寫下面文章與大家分享
一、為什麼要使用快取
l 減少資料庫訪問,降低資料庫壓力
l 加速系統訪問速度,提公升系統效能
二、常用的幾種快取(這裡說的均為資料快取)
l 檔案快取(以檔案形式存在磁碟上)
l memcache(儲存在記憶體裡)
l 前端**
l mysql記憶體表(這個算不上快取)
三、比較幾種快取的效率,選出適合自己系統用的快取架構
l 檔案快取
常用的檔案快取包括:zend cache,各種框架所帶的快取,smarty所帶的快取。
優點:靜態化頁面使得訪問速度加快,降低伺服器的壓力。
缺點:對於實時性資料或是不斷變化的資料會造成資料不同步,當然你會說那我每次可以修改相應的快取或是刪除了再建立,但是這麼做一定會造成io的開銷,還有就是不要存太大檔案,太大檔案讀取的時候會造成系統開銷很大,也不要存太小的檔案,太小的檔案會造成磁碟碎片。
l memcached
memcached作為php5的乙個新的擴充套件快取類,是乙個分布式記憶體快取系統
memcached是「分布式」的記憶體物件快取系統,那麼就是說,那些不需要「分布」的,不需要共享的,或者乾脆規模小到只有一台伺服器的應用,memcached不會帶來任何好處,相反還會拖慢系統效率,因為網路連線同樣需要資源,即使是unix本地連線也一樣。 在我之前的測試資料中顯示,memcached本地讀寫速度要比直接php記憶體陣列慢幾十倍,而apc、共享記憶體方式都和直接陣列差不多。可見,如果只是本地級快取,使用memcached是非常不划算的。
memcahce如何部署:
首先啟動n個memcache程序,這些程序可以在不同的server的不同埠上.然後使用perl的api可以方便的一次鏈結多個memcache,儲存讀取機制不明.不久找到php的乙個memcachedclient類,基本上就是perl裡api的再實現.它使用的fscokopen或者socket系列function來直接讀取memcache----這說明只要清楚memcache的網路協議,你甚至不用裝什麼php的memcache extenstion.看了這個類的實現,基本上弄清楚,它的分布式應用差不多就是將不同的key儲存在不同的memcache daemon,不會保留多個副本,也就不存在多memcache同步的問題了.
memcached也經常作為伺服器之間資料共享的儲存媒介,例如在sso系統中儲存系統單點登陸狀態的資料就可以儲存在memcached中,被多個應用共享
優點:通過簡單的配置,可以把資料放到另一台機子的快取,通過socket讀取。這種方法比磁碟儲存要快很多,減少io讀取,提公升web的效能。
缺點:如果memcache機子重啟,那麼所有快取資料將丟失,不適宜儲存永久資料和資料量大的資料。
總結:memcached使用記憶體並不會得到成百上千的讀寫速度提高,它的實際瓶頸在於網路連線,它和使用磁碟的資料庫系統相比,好處在於它本身非常「輕」,因為沒有過多的開銷和直接的讀寫方式,它可以輕鬆應付非常大的資料交換量,所以經常會出現兩條千兆網路頻寬都滿負荷了,memcached程序本身並不占用多少cpu資源的情況。
l 前端**
我之前涉及的是反相squid**,用squid**之後,客戶端的請求不會直接訪問server,而是先檢查**伺服器,如果**伺服器沒有,則向伺服器請求,否則直接訪問**,這樣很到程度上減輕了server的負載。
缺點:資料同步的問題。
l 記憶體表
記憶體表的特徵:給memory表的空間被以小塊來分配。表對插入使用100%動態雜湊。不需要溢位區或額外鍵空間。自由列表無額外的空間需求。已刪除的行被放在乙個以鏈結的列表裡,並且在你往表裡插入新資料之時被重新使用。memory表也沒有通常與在雜湊表中刪除加插入相關的問題。
· memory表可以有多達每個表32個索引,每個索引16列,以及500位元組的最大鍵長度。
· memory儲存引擎執行hash和btree索引。
· memory不支援blob或text列。
· memory表在所有客戶端之間共享(就像其它任何非temporary表)。
· 伺服器需要足夠記憶體來維持所有在同一時間使用的memory表。
優點:讀取速度要比myisam要快很多,這是因為這類表使用儲存在記憶體中的雜湊索引。
缺點:當伺服器崩潰或是重啟,資料將全部丟失。
當然了,heap也沒有比myisam快太多,這樣說明我的myisam速度還是非常快的,所以一般情況下,myisam能夠滿足大部分的應用了,如果資料太多的情況,可以考慮把部分常用的資料儲存到heap表中,同時也可以結合memcache等快取工具來幫助快取資料。
四、我們該如何選擇:
根據系統的實際情況選擇各種快取,基於上面的分析,我在這裡總結一下。對於永久的資料,或是長時間不變的資料,我們最好快取成為檔案的儲存,如果考慮實現分布式記憶體,以減小系統負載,考慮用memcached,用memcached考慮你的實際網路頻寬,還有併發量,因為memcached連線數的限制,而且對記憶體要求高,對於cpu要求很低,所以常常採用將memcached服務端和一些cpu高消耗memory低消耗應用部屬在一起。對於記憶體表的使用,首先使用記憶體表肯定會和資料庫有連線的,也會造成資料庫的壓力,還有記憶體表的大小問題,最頭疼的就是如果資料庫down了,會造成資料丟失,而且儲存的字段數以及字段長度受限,所以只儲存一些臨時資料而且欄位的大小不能太大。
總結:快取的目的:讓被期待性高的資料暫存入效能相對好的儲存裝置以達到使系統效能提公升的目的。任何快取,無論頁面、資料、物件等都是按照上面描述來進行策略選擇的。也就是說,不管需要快取的是什麼,你只用選出被期待性高的,然後把他們存入效能相對較好的儲存裝置就行了。最重要的是找出你系統的瓶頸,然後採用不同的快取。
各種快取的比較收藏
各種快取的比較收藏 基於我開發download的經驗,以及對各種快取的理解,寫下面文章與大家分享 一 為什麼要使用快取 l 減少資料庫訪問,降低資料庫壓力 l 加速系統訪問速度,提公升系統效能 二 常用的幾種快取 這裡說的均為資料快取 l 檔案快取 以檔案形式存在磁碟上 l memcache 儲存在...
各種求職資料收藏
計算機視覺課程cs231n 中文版 原版 乙個非常非常非常好的計算機基礎部落格,包括劍指offer,深入理解計算機作業系統 計算機網路,資料庫等 機器學習演算法等各種資料 乙個牛逼的github 關於自然語言處理 nltk基本操作 nltk hmm詞性標註 nltk資料彙總 nltk基礎教程 關於計...
各種排序比較
直接插入排序 void insertsort elemtype a,int n 氣泡排序 void bubblesort int a,int n i pos 為下一趟排序作準備 快速排序 int partition elemtype a,int low,int high a low pivot 樞軸...