基本概念page/slab/chunkphp
Chunk屬於slab,在一個slab裏面有多個chunkjava
Slab裏面也有多個page。spring
1slab class(slab分類) = n slab緩存
1page=1slab = n chunk(統一長度)tomcat
內存分配是以page單位,默認一個page是一M,也能夠經過-I參數在啓動的指定。服務器
memcached分配一個新的page後,將不會被回收或者從新分配。分佈式
避免大量重複的初始化工做,清理工做,減輕內存管理器負擔memcached
避免頻繁malloc/free致使系統內存碎片大數據
Chunkgoogle
第一列slab的類型,第二列chunk 長度,第三列預分配chunk個數
第三列*第二列=page大小=slab的大小
內存申請分配機制
memcached 不會釋放內存,也不會從新分配。只是從新利用
懶清理
memcached的回收機制不是根據key的生命週期自從清理。
當memcached內存用光後,有兩個策略:1.報錯 2.使用LRU
Growth factor 調大,slab數量下降,LRU頻率下降,形成空間浪費會上升
Growth factor 調小,slab數據增加,LRU頻率上升,形成空間浪費會下降
1.Lazy expriation
memcached內部不會監控記錄是否過時,而是在get的時候檢查時間戳,檢查是否過時。
2.LRU
遵循最近最少使用原則。當內存不足時候,清楚最近未被使用的。
memadmin(PHP) ---安裝麻煩,要配置php運行
treeNMS(tomcat)---安裝比較快,可是使用起來沒memadmin好
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;
Hash和取模
缺點:致使數據分佈不均勻
引入虛擬節點解決一致性hash數據分佈不均勻的問題。
如何解決空間浪費問題:
1.slab空間尾部浪費
解決辦法:合理規劃slab和chunk之間倍數
2.slab中的使用率低:申請的slab只存放了一個item
解決辦法:slab=chunk
3.chunk的空間浪費
解決辦法:chunk=item