1. 程式人生 > >memcache 雜記

memcache 雜記

包含 持久連接 get數據 oracl window系統 mem 狀態 自動刪除 大於


它是一個一個高性能的分布式內存對象緩存系統。
端口號 11211
目前被許多網站使用以提升網站的訪問速度,尤其對於一些大型的、
需要頻繁訪問數據庫的網站訪問速度提升效果十分顯著
根據一個sql取出的數據,把sql取出的數據,給緩存到memcache裏面,
當下次再操作該sql語句的時候,則直接從memcache裏面獲取

跟mysql比較一下

它是一個c/s架構

mysql的數據是存在磁盤的 memcache存在內存裏

mysql的數據存儲是,由數據庫,數據表,數據的記錄,
存儲數據是按照表的結構進行存儲的。

memcache的數據存儲格式是:keyalue的格式,來存儲的,
相當於在內存裏面有一張兩列的哈希表。類似於php的裏面的關聯數組

memcache細節討論

1、緩存周期(有效期)
緩存周期的設置有兩種方式:
如果緩存周期設置為0表明此數據永不過期

第一種使用:秒數,最大不能超過30天,即2592000秒,

第二種使用:使用時間戳,該時間戳是到的哪個時間點。比如我們要把一個數據緩存60天,
$mem->add($key,$value,0,time()+60*24*3600)

2、 惰性刪除,
就是說,緩存的數據,到期後,不會自動刪除,當get數據的時候,查看有沒有到期,如果到期了,則再刪除該數據。
memcache不會開啟進程來監視鍵是否過期,省memcache的資源,也省cpu.

3、Least Recently Used(LRU)
最近 最少使用原則,

當前存儲的數據的在memcache裏面空間已經占滿後,則memcache會把不活躍(get或set次數比較少的)的數據(不管是否到期)清除,讓新的數據給存儲進來。

4、安全性

memcache定位就是做數據的緩存的,不是數據的持久存儲的,因此沒有做一些用戶的驗證,目的提高連接速度,發揮自己的獨特功能。

memcahe該軟件本身沒有提供一些安全機制,如果要限制使用,則只能在操作系統的層面來解決,比如window系統、安裝防火墻的軟件,在linux下面使用iptables,seclinux(安全機制)

5、memcache比較適合於存儲哪些數據。
存儲的數據的特點:
訪問比較頻繁,
安全性不高,丟失無所謂,
修改比較頻繁的數據,比如一些用戶的在線狀態。

memcache實現原理

1、訪問數據的速度比傳統的關系型數據庫要快,因為Oracle、MySQL這些傳統的關系型數據庫為了保持數據的持久性,數據存放在硬盤中,IO操作速度慢

2、memcache的數據存放在內存中同時意味著只要memcache重啟了,數據就會消失

3、既然memcache的數據存放在內存中,那麽勢必受到機器位數的限制,32位機器最多只能使用2GB的內存空間,64位機器可以認為沒有上限

4、memcache采用的內存分配方式是固定空間分配

1、memcache將內存空間分為一組slab

2、每個slab下又有若幹個page,每個page默認是1M,如果一個slab占用100M內存的話,那麽這個slab下應該有100個page

3、每個page裏面包含一組chunk,chunk是真正存放數據的地方,同一個slab裏面的chunk的大小是固定的

4、應該可以理解為什麽memcache存放的value大小是限制的,因為一個新數據過來,slab會先以page為單位申請一塊內存,申請的內存最多就只有1M,所以value大小自然不能大於1M了

5、memcache的內存分配chunk裏面會有內存浪費,88字節的value分配在128字節(緊接著大的用)的chunk中,就損失了30字節,但是這也避免了管理內存碎片的問題

6、memcache的LRU算法不是針對全局的,是針對slab的


總結memcache的特性和限制

1、memcache中可以保存的item數據量是沒有限制的,只要內存足夠

2、memcache單進程在32位機中最大使用內存為2G,64位機則沒有限制。

3、Key最大為250個字節,超過該長度無法存儲

4、單個item最大數據是1MB,超過1MB的數據不予存儲

5、memcache服務端是不安全的,比如已知某個memcache節點,可以直接telnet過去,並通過flush_all讓已經存在的鍵值對立即失效//這個不太懂 抽時間實踐

6、不能夠遍歷memcache中所有的item,因為這個操作的速度相對緩慢且會阻塞其他的操作

8、memcache設置添加某一個Key值的時候,傳入expiry為0表示這個Key值永久有效,這個Key值也會在30天之後失效

數據在內存中失效後,並不會立馬被刪除,只有在下次get時候,系統才會將其刪除。
memcache可以因此,被一些未被及時刪除的數據占滿空間。
加之LRU淘汰機制,永久數據如果很少被訪問的話,在內存空間被占滿的情況下,再有新數據被緩存,則永久數據,就有可能被刪除


PHP的memcache客戶端所有方法總結

memcache::add

添加一個值,如果已經存在,則返回false

memcache::addServer

添加一個可供使用的服務器地址

memcache::close

關閉一個memcache對象

memcache::connect

創建一個memcache對象

memcache::decrement

對保存的某個key中的值進行減法操作

memcache::delete

刪除一個key值

memcache::flush

清除所有緩存的數據
實際上沒有釋放資源,它僅僅將所有的緩存標記為過期,這樣可以使新的緩存來覆蓋被占的內存空間。

memcache::get

獲取一個key值

memcache::getExtendedStats

獲取進程池中所有進程的運行系統統計

memcache::getServerStatus

獲取運行服務器的參數
成功返回服務器狀態,服務器沒有啟動會返回0,其他數字的時候表示服務器是啟動狀態的。

memcache::getStats

返回服務器的一些運行統計信息

memcache::getVersion

返回運行的memcache的版本信息

memcache::increment

對保存的某個key中的值進行加法操作

memcache::pconnect

創建一個memcache的持久連接對象

memcache::replace

對一個已有的key進行覆寫操作

memcache::set
添加一個值,如果已經存在,則覆寫















memcache 雜記