Memcached(記憶體模型、記憶體回收機制)
阿新 • • 發佈:2018-11-30
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的生命週期自從清理。
- 存放key的時候,新物件請求入駐這段記憶體空間。
- 當這個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客戶端程式
- memached client for java
- Spymemcached
- 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;