Memcached(內存模型、內存回收機制)

memcached內存模型

基本概念page/slab/chunkphp

Chunk屬於slab,在一個slab裏面有多個chunkjava

Slab裏面也有多個page。spring

1slab class(slab分類) = n slab緩存

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

 

page

內存分配是以page單位,默認一個page是一M,也能夠經過-I參數在啓動的指定。服務器

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

 

Slab

避免大量重複的初始化工做,清理工做,減輕內存管理器負擔memcached

避免頻繁malloc/free致使系統內存碎片大數據

 

Chunkgoogle

第一列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;

 

memcached分佈式

Hash和取模

 

餘數計算分散法

  1. 求取Key的CRC值
  2. 用CRC在和服務器數量進行取模
  3. 根據結果存放到相應的服務器

 

一致性Hash

  1. 計算服務器的Hash值
  2. 根據hash值把服務節點分配到0——2^32次方的圓環上。
  3. 計算key的hash值,並映射到圓環上。
  4. 找到順時針的第一臺服務器上。

缺點:致使數據分佈不均勻

引入虛擬節點解決一致性hash數據分佈不均勻的問題。

 

memcached特性和限制

  1. 能夠保存的item數量是沒有限制的,只要內存足夠
  2. memcached單進程最大內存是2G,能夠開多個memcached進程
  3. 最大鍵長度是250字節,大於這個長度沒法存儲。
  4. 單個item的最大數據是1M,超過1m也沒法存儲
  5. 最大同時鏈接數是200個,最大的軟鏈接數是1024
  6. Factor直接決定內存的使用狀況

如何解決空間浪費問題:

1.slab空間尾部浪費

   解決辦法:合理規劃slab和chunk之間倍數

2.slab中的使用率低:申請的slab只存放了一個item

   解決辦法:slab=chunk

3.chunk的空間浪費

   解決辦法:chunk=item

相關文章
相關標籤/搜索