基礎知識和細節問題

緩存技術包括內存的緩存和文件的緩存。php內存的緩存目前是memcached技術。文件緩存包括頁面靜態化·smarty·mysql優化。

memcached服務器默認端口11211.其維護了一張hashtable表,其數據以鍵值對存在。memcached是高性能的分佈式內存緩存服務器,能減少讀取數據庫的次數,提高數據訪問速度。

由於該服務器保存的數據實在內存中,所以一旦電腦奔潰或服務器停止重啓memcached、重啓操作系統,memcached維護的數據就會丟了。

另外,內容容量達到指定值之後,就基於LRU(Least Recently Used)算法自動刪除不使用的緩存。memcached本身是爲緩存而設計的服務器,因此並沒有過多考慮數據的永久性問題。

三種方式訪問Memcached服務器:

           1:php下載Memcache擴展庫訪問該服務

           2:php下載Memcached擴展庫訪問該服務

           3:直接使用socket編程

           4:telent請求該服務。

該三種方式對memcached服務器的CRUD操作如下:

1.2方式可以查php手冊3在網上下載memcached-client-php探究源碼

4.方式

set/add 標識名  參數  存時間  字節數  /  get/delete  標識名 / 

stats :轉儲所連接的memcached 實例的當前統計數據。

flush_all:用於清理緩存中的所有名稱/值對。如果您需要將緩存重置到乾淨的狀態,則flush_all 能提供很大的用處。

replace:僅當鍵已經存在時,replace 命令纔會替換緩存中的鍵。如果緩存中不存在鍵,那麼您將從memcached 服務器接受到一條NOT_STORED 響應。

添加或設置或替換緩存數據時其中的過期時間問題:

                              當爲0時,只要服務器不關閉,數據就一直存在內存中。

                                            當使用UNIX時間戳時,時間可以任意長

                                            當使用秒數時,即從當前執行事件開始計算,不能超過30天

當我們設置的時間間隔大於 2592000 ,例如2592010,寫進去的數據會被認爲是unix時間戳格式,數據剛寫進去已經過期,相當於導致數據寫不進去,而更糟糕的是對於這種情況memcached服務端和客戶端驅動都不會拋出exception或者打印任何警告信息,因爲對memcached來說這樣的時間值也是合理的。該expire的限制某似是從memcached 1.2.6以後纔有體現,之前的版本如1.2.1中沒有觀察到這種現象。

單個緩存值大小限制:
memcached單個緩存值限制爲1M(1000000bytes),超過這個限制的時候會出如下錯誤:
ValueError: Values may not be more than 1000000 bytes in length; received 2000000 bytes
 
key長度限制:
memcache的keys限制爲250 bytes,超過這個長度會報錯:
ValueError: Keys may not be more than 250 bytes in length, received 14670 bytes
 

Memcached的緩存機制:

                              Memcached主要的cache機制是LRU(最近最少用)算法+超時失效。當您存數據到memcached中,可以指定該數據在緩存中可以呆多久。如果memcached的內存不夠用了,過期的slabs會優先被替換,接着就輪到最老的未被使用的slabs。

Memcached應該是應用的緩存層:

                             它的設計本身就不帶有任何冗餘機制。如果一個memcached節點失去了所有數據,您應該可以從數據源(比如數據庫)再次獲取到數據。您應該特別注意,您的應用應該可以容忍節點的失效。不要寫一些糟糕的查詢代碼,寄希望於 memcached來保證一切!

Memcached屬於什麼架構:

                              Memcached屬於c/s架構。Memcached本身是使用C開發的,客戶端可以是php、C#、或者java。位於服務器端需要下載Memcached客戶端軟件才能支撐該服務。和瀏覽器沒有直接關係。且MYSQL-apache-Memcached-負載均衡之間都是獨立的,對於一個具體的應用來說需要他們的分工合作才能完成應用的功能

Memcached服務器和客戶端通訊使用的是文本行協議而不是XML,所以telnet也可以寫入和讀取。


php中遇到addServer方法的時候,並不是立即去連接mem服務,而是通過計算,hash後纔去決定連接哪個mem服務,因此當你大量加入連接(addServer)到連接池,不會有多餘開銷。

Memcached數據被銷燬有一下情況:

                         1:指定保存時間到了2:memcached重啓3:memcached所在主機重啓4:使用delete或flush

Memcached適用場合:

1. 分佈式應用。由於memcached本身基於分佈式的系統,所以尤其適合大型的分佈式系統。

2. 數據庫前段緩存。數據庫常常是網站系統的瓶頸。數據庫的大併發量訪問,常常造成網站內存溢出。當然我們也可以使用Hibernate的緩存機制。但memcached是基於分佈式的,並可獨立於網站應用本身,所以更適合大型網站進行應用的拆分。

3. 服務器間數據共享。舉例來講,我們將網站的登錄系統、查詢系統拆分爲兩個應用,放在不同的服務器上,並進行集羣,那這個時候用戶登錄後,登錄信息如何從登錄系統服務器同步到查詢系統服務器呢?這時候,我們便可以使用memcached,登錄系統將登錄信息緩存起來,查詢系統便可以獲得登錄信息,就像獲取本地信息一樣。

首先 memcached 是以守護程序方式運行於一個或多個服務器中,隨時接受客戶端的連接操作。守護進程是一個生存期較長的進程,通常獨立於控制終端並且週期性地執行某種任務或等待處理某些發生的事件。守護進程常常在系統引導裝入時啓動,在系統關閉時終止。守護進程是在UNIX或其他多任務操作系統中在後臺執行的電腦程序,並不會接受電腦用戶的直接操控。此類程序會被以進程的形式初始化。守護進程程序的名稱通常以字母“d”結尾:例如,syslogd就是指管理系統日誌的守護進程。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章