学习memcache总结

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.完整实例
        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配置注入需要缓存的类,调用方法即可
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值