Memcache 简介: memcache是一套分布式的高速缓存系统,由LiveJournal的Brad Fitzpatrick开发,但目前被许多网站使用以提升网站的访问速度,尤其对于一些大型的、需要频繁访问数据库的网站访问速度提升效果十分显著 memCache的工作流程如下:先检查客户端的请求数据是否在memcached中,如有,直接把请求数据返回,不再对数据库进行任何操作;如果请求的 数据不在memcached中,就去查数据库,把从数据库中获取的数据返回给客户端,同时把数据缓存一份到memcached中
Memcache 特点与限制: memcached中可以保存的item数据量是没有限制的,只要内存足够 。 memcached单进程在32位系统中最大使用内存为2G,若在64位系统则没有限制,这是由于32位系统限制单进程最多可使用2G内存,要使用更多内存,可以分多个端口开启多个Memcached进程 ,最大30天的数据过期时间,设置为永久的也会在这个时间过期,常量REALTIME_MAXDELTA 60*60*24*30控制最大键长为250字节,大于该长度无法存储,常量KEY_MAX_LENGTH 250控制单个item最大数据是1MB,超过1MB数据不予存储,常量POWER_BLOCK 1048576进行控制,它是默认的slab大小最大同时连接数是200,通过 conn_init()中的freetotal进行控制,最大软连接数是1024,通过 settings.maxconns=1024 进行控制 跟空间占用相关的参数:settings.factor=1.25, settings.chunk_size=48, 影响slab的数据占用和步进方式 memcached是一种无阻塞的socket通信方式服务,基于libevent库,由于无阻塞通信,对内存读写速度非常之快。 memcached分服务器端和客户端,可以配置多个服务器端和客户端,应用于分布式的服务非常广泛。 memcached作为小规模的数据分布式平台是十分有效果的。 memcached是键值一一对应,key默认最大不能超过128个字 节,value默认大小是1M,也就是一个slabs,如果要存2M的值(连续的),不能用两个slabs,因为两个slabs不是连续的,无法在内存中 存储,故需要修改slabs的大小,多个key和value进行存储时,即使这个slabs没有利用完,那么也不会存放别的数据。Mamcache安装与启动: 解压之后,在x86或者x64目录下运行memcached.exe -d install 再输入memcached.exe -d start启动服务 这样以后memcache将作为windows的服务开机启动 可以在services.msc中查看Mamcache配置: -d选项是启动一个守护进程 -m是分配给Memcache使用的内存数量,单位是MB -u是运行Memcache的用户 -l是监听的服务器IP地址 -p是设置Memcache监听的端口 -c选项是最大运行的并发连接数,默认是1024 -P是设置保存Memcache的pid文件 Example:memcached -d -m 10 -u root -l 127.0.0.1 -p 11211 -c 256 -P /tmp/memcached.pid使用命令修改端口后的cmd窗口不能关闭,否则memcache服务器会停止,需要重启,单会回复默认设置可以使用修改注册表的方式使修改永久生效: 1.使用regedit打开注册表编辑器 2.找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\memcached Server 3.修改ImagePath选项的值"c:\xx\memcached.exe" -d runservice,改为:"c:\xx\memcached.exe" -d runservice -m 512 -p 11200 -l 127.0.0.1(确定,关闭注册表) 4.重新启动服务memcache的使用: 1.设置缓存服务器的连接池 // 获取socke连接池的实例对象 SockIOPool pool = SockIOPool.getInstance();
2.初始化连接池 // 服务器列表和其权重 String[] servers = { "127.0.0.1:11211" }; Integer[] weights = { 3 }; // 设置服务器信息 pool.setServers(servers); pool.setWeights(weights); // 设置初始连接数、最小和最大连接数以及最大处理时间 pool.setInitConn(5); pool.setMinConn(5); pool.setMaxConn(250); pool.setMaxIdle(1000 * 60 * 60 * 6); // 设置主线程的睡眠时间 pool.setMaintSleep(30); // 设置TCP的参数,连接超时等 pool.setNagle(false); pool.setSocketTO(3000); pool.setSocketConnectTO(0); // 初始化连接池 pool.initialize(); 3.创建客户端实例 // 创建全局的唯一实例 private static MemCachedClient mcc = new MemCachedClient(); 4.完整实例
接口介绍: Memcache面向对象的常用接口包括: Memcache::connect -- 打开一个到Memcache的连接 Memcache::pconnect -- 打开一个到Memcache的长连接 Memcache::close -- 关闭一个Memcache的连接 Memcache::set -- 保存数据到Memcache服务器上 Memcache::get --提取一个保存在Memcache服务器上的数据 Memcache::replace --替换一个已经存在Memcache服务器上的项目(功能类似Memcache::set) Memcache::delete -- 从Memcache服务器上删除一个保存的项目 Memcache::flush -- 刷新所有Memcache服务器上保存的项目(类似于删除所有的保存的项目) Memcache::getStats -- 获取当前Memcache服务器运行的状态 Memcache与spring整合: 1.配置文件:
2.Spring中引入配置文件
3.配置memcache连接池
4.配置memcache客户端
5.完成配置,使用spring配置注入需要缓存的类,调用方法即可
public class MemCachedManager {
private static MemCachedClient mcc = new MemCachedClient();
protected static MemCachedManager memCachedManager = new MemCachedManager();
static {
String[] servers = { "127.0.0.1:11211" };
Integer[] weights = { 3 };
SockIOPool pool = SockIOPool.getInstance();
pool.setServers(servers);
pool.setWeights(weights);
pool.setInitConn(5);
pool.setMinConn(5);
pool.setMaxConn(250);
pool.setMaxIdle(1000 * 60 * 60 * 6);
pool.setMaintSleep(30);
pool.setNagle(false);
pool.setSocketTO(3000);
pool.setSocketConnectTO(0);
pool.initialize();
}
protected MemCachedManager() {
}
public static MemCachedManager getInstance() {
return memCachedManager;
}
public boolean add(String key, Object value) {
return mcc.add(key, value);
}
public boolean set(String key, Object value) {
return mcc.set(key, value);
}
public boolean add(String key, Object value, Date expiry) {
return mcc.add(key, value, expiry);
}
public boolean replace(String key, Object value) {
return mcc.replace(key, value);
}
public boolean replace(String key, Object value, Date expiry) {
return mcc.replace(key, value, expiry);
}
public Object get(String key) {
return mcc.get(key);
}
public void flush(){
mcc.flushAll();
}
}
接口介绍: Memcache面向对象的常用接口包括: Memcache::connect -- 打开一个到Memcache的连接 Memcache::pconnect -- 打开一个到Memcache的长连接 Memcache::close -- 关闭一个Memcache的连接 Memcache::set -- 保存数据到Memcache服务器上 Memcache::get --提取一个保存在Memcache服务器上的数据 Memcache::replace --替换一个已经存在Memcache服务器上的项目(功能类似Memcache::set) Memcache::delete -- 从Memcache服务器上删除一个保存的项目 Memcache::flush -- 刷新所有Memcache服务器上保存的项目(类似于删除所有的保存的项目) Memcache::getStats -- 获取当前Memcache服务器运行的状态 Memcache与spring整合: 1.配置文件:
memcache.server=127.0.0.1\:11211 服务器端口
memcache.initConn=20 初始连接数
memcache.minConn=10 最小连接数
memcache.maxConn=50 最大连接数
memcache.maintSleep=3000 休眠时间
memcache.nagle=false nagle算法
memcache.socketTO=3000 连接超时时间
2.Spring中引入配置文件
<!-- 引入memcachePool配置文件 -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations" value="classpath:/memcache.properties"/>
</bean>
3.配置memcache连接池
<!-- 配置memcache连接池 -->
<bean id="memcachedPool" class="com.danga.MemCached.SockIOPool" factory-method="getInstance" init-method="initialize" destroy-method="shutDown">
<constructor-arg value="memcachedPool"></constructor-arg>
<property name="servers" value="${memcache.server}"></property>
<property name="initConn" value="${memcache.initConn}"></property>
<property name="minConn" value="${memcache.minConn}"></property>
<property name="maxConn" value="${memcache.maxConn}"></property>
<property name="maintSleep" value="${memcache.maintSleep}"></property>
<property name="nagle" value="${memcache.nagle}"></property>
<property name="socketTO" value="${memcache.socketTO}"></property>
</bean>
4.配置memcache客户端
<!-- 配置memcache客户端 -->
<bean id="memCachedClient" class="com.danga.MemCached.MemCachedClient">
<constructor-arg value="memcachedPool"></constructor-arg>
</bean>
5.完成配置,使用spring配置注入需要缓存的类,调用方法即可