基本概念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