1. 程式人生 > >Memcached(記憶體模型、記憶體回收機制)

Memcached(記憶體模型、記憶體回收機制)

memcached記憶體模型

基本概念page/slab/chunk

Chunk屬於slab,在一個slab裡面有多個chunk

Slab裡面也有多個page。

1slab class(slab分類) = n slab

1page=1slab = n chunk(統一長度)

 

page

記憶體分配是以page單位,預設一個page是一M,也可以通過-I引數在啟動的指定。

memcached分配一個新的page後,將不會被回收或者重新分配。

 

Slab

避免大量重複的初始化工作,清理工作,減輕記憶體管理器負擔

避免頻繁malloc/free導致系統記憶體碎片

 

Chunk

第一列slab的型別,第二列chunk 長度,第三列預分配chunk個數

第三列*第二列=page大小=slab的大小

記憶體申請分配機制

 

memcached記憶體回收

memcached 不會釋放記憶體,也不會重新分配。只是重新利用

 

懶清理

memcached的回收機制不是根據key的生命週期自從清理。

  1. 存放key的時候,新物件請求入駐這段記憶體空間。
  2. 當這個key被get的時候

當memcached記憶體用光後,有兩個策略:1.報錯  2.使用LRU

Growth factor 調大,slab數量降低,LRU頻率降低,造成空間浪費會上升

Growth factor 調小,slab資料增長,LRU頻率上升,造成空間浪費會降低

 

memcached資料過期

1.Lazy expriation

memcached內部不會監控記錄是否過期,而是在get的時候檢查時間戳,檢查是否過期。

2.LRU

遵循最近最少使用原則。當記憶體不足時候,清楚最近未被使用的。

 

memcached客戶端UI

memadmin(PHP) ---安裝麻煩,要配置php執行

treeNMS(tomcat)---安裝比較快,但是使用起來沒memadmin好

 

memcached客戶端程式

  1. memached client for java
  2. Spymemcached
  3. Xmemcached(NIO的客戶端)

POM.xml 的配置

        <!-- xmemcached -->
		<dependency>
			<groupId>com.googlecode.xmemcached</groupId>
			<artifactId>xmemcached</artifactId>
			<version>2.4.2</version>
		</dependency>

        <!-- memcached client for java-->
		<dependency>
			<groupId>com.whalin</groupId>
			<artifactId>Memcached-Java-Client</artifactId>
			<version>3.0.2</version>
		</dependency>

 

如果需要使用spring並且讓快取正常工作,那麼必須配置一個CacheManager;