`
uule
  • 浏览: 6348660 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

Memcached

 
阅读更多

百度百科 - Memcached

Memcached - JAVA简单实例

memcached完全剖析

 

Java使用memcached



 

 

为什么要用memcached,直接放内存不行么,memcached有什么优点?

直接放内存是不能进行分布式扩展二是缺乏一个有效的信息过期机制



 

Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信

 

Memcached在很多时候都是作为数据库前端cache使用的。因为它比数据库少了很多SQL解析、磁盘操作等开销,而且它是使用内存来管理数据的,所以它可以提供比直接读取数据库更好的性能,在大型系统中,访问同样的数据是很频繁的,memcached可以大大降低数据库压力,使系统执行效率提升。另外,memcached也经常作为服务器之间数据共享的存储媒介,例如在SSO系统中保存系统单点登陆状态的数据就可以保存在memcached中,被多个应用共享。

 

不适用场合

Memcached是“分布式”的内存对象缓存系统,那么就是说,那些不需要“分布”的,不需要共享的,或者干脆规模小到只有一台服务器的应用,memcached不会带来任何好处,相反还会拖慢系统效率,因为网络连接同样需要资源

 

存储方式

为了提高性能,memcached中保存的数据都存储在memcached内置的内存存储空间中。由于数据仅存在于内存中,因此重启memcached、重启操作系统会导致全部数据消失,所以memcached不能用来持久保存数据。另外,内容容量达到指定值之后,就基于LRU(Least Recently Used)算法自动删除不使用的缓存。memcached本身是为缓存而设计的服务器,因此并没有过多考虑数据的永久性问题。

 

很多人的错误理解,memcached的性能非常好,好到了内存和硬盘的对比程度,其实memcached使用内存并不会得到成百上千的读写速度提高,它的实际瓶颈在于网络连接,它和使用磁盘的数据库系统相比,好处在于它本身非常“轻”,因为没有过多的开销和直接的读写方式,它可以轻松应付非常大的数据交换量,所以经常会出现两条千兆网络带宽都满负荷了,memcached进程本身并不占用多少CPU资源的情况。

 

通信分布式

memcached尽管是“分布式”缓存服务器,但服务器端并没有分布式功能。各个memcached不会互相通信以共享信息。那么,怎样进行分布式呢?这完全取决于客户端的实现

 

==================================================================

以下来源于memcached搭建缓存系统(附件含源代码)

实现:

四、安装

这里介绍windows环境的安装。

1.下载memcache的windows稳定版,解压放某个盘下面,比如在c:\memcached

2.在cmd下输入 'c:\memcached\memcached.exe -d install' 安装

3.再输入: 'c:\memcached\memcached.exe -d start' 启动。

以后memcached将作为windows的一个服务每次开机时自动启动。这样服务器端已经安装完毕了。

五、客户端

Memcached本身是使用C开发的,客户端可以是php、C#、或者java。我是做java的,所以这里只介绍基于java的客户端。

我在网上看到基于java的客户端有两个

1.java_memcached-release_2.6.3

1)简介

这是比较通用的Memcached客户端框架。具体原创不详。

2)依赖的jar

A.commons-pool-1.5.6.jar

B.java_memcached-release_2.6.3.jar

C.slf4j-api-1.6.1.jar

D.slf4j-simple-1.6.1.jar

2.alisoft-xplatform-asf-cache-2.5.1

1)简介

这个东东是阿里软件的架构师岑文初进行封装的。里面的注释都是中文的,比较好。

2)依赖的jar

A.alisoft-xplatform-asf-cache-2.5.1.jar

B.commons-logging-1.0.4.jar

C.hessian-3.0.1.jar

D.log4j-1.2.9.jar

E.stax-api-1.0.1.jar

F.wstx-asl-2.0.2.jar

六、范例

1.基于java_memcached-release_2.6.3

Java代码  收藏代码
  1. package com.hl.memcached.cache;  
  2.   
  3. import java.util.Date;  
  4.   
  5. import com.danga.MemCached.MemCachedClient;  
  6. import com.danga.MemCached.SockIOPool;  
  7.   
  8. public class MyCache {  
  9.     public static void main(String[] args) {  
  10.         MemCachedClient client=new MemCachedClient();  
  11.         String [] addr ={"127.0.0.1:11211"};  
  12.         Integer [] weights = {3};  
  13.         SockIOPool pool = SockIOPool.getInstance();  
  14.         pool.setServers(addr);  
  15.         pool.setWeights(weights);  
  16.         pool.setInitConn(5);  
  17.         pool.setMinConn(5);  
  18.         pool.setMaxConn(200);  
  19.         pool.setMaxIdle(1000*30*30);  
  20.         pool.setMaintSleep(30);  
  21.         pool.setNagle(false);  
  22.         pool.setSocketTO(30);  
  23.         pool.setSocketConnectTO(0);  
  24.         pool.initialize();  
  25.           
  26. //      String [] s  =pool.getServers();  
  27.         client.setCompressEnable(true);  
  28.         client.setCompressThreshold(1000*1024);  
  29.           
  30. //      将数据放入缓存  
  31.         client.set("test2","test2");  
  32.           
  33. //      将数据放入缓存,并设置失效时间  
  34.         Date date=new Date(2000000);  
  35.         client.set("test1","test1", date);  
  36.           
  37. //      删除缓存数据  
  38. //      client.delete("test1");  
  39.           
  40. //      获取缓存数据  
  41.         String str =(String)client.get("test1");  
  42.         System.out.println(str);  
  43.     }  
  44. }  

 

2.   基于alisoft-xplatform-asf-cache-2.5.1

1)  配置memcached.xml

 

Xml代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <memcached>  
  3.     <!-- name 属性是程序中使用Cache的唯一标识;socketpool 属性将会关联到后面的socketpool配置; -->  
  4.     <client name="mclient_0" compressEnable="true" defaultEncoding="UTF-8"  
  5.         socketpool="pool_0">  
  6.         <!-- 可选,用来处理出错情况 -->  
  7.         <errorHandler>com.alisoft.xplatform.asf.cache.memcached.MemcachedErrorHandler  
  8.         </errorHandler>  
  9.     </client>  
  10.   
  11.     <!--  
  12.         name 属性和client 配置中的socketpool 属性相关联。  
  13.         maintSleep属性是后台线程管理SocketIO池的检查间隔时间,如果设置为0,则表明不需要后台线程维护SocketIO线程池,默认需要管理。  
  14.         socketTO 属性是Socket操作超时配置,单位ms。 aliveCheck  
  15.         属性表示在使用Socket以前是否先检查Socket状态。  
  16.     -->  
  17.     <socketpool name="pool_0" maintSleep="5000" socketTO="3000"  
  18.         failover="true" aliveCheck="true" initConn="5" minConn="5" maxConn="250"  
  19.         nagle="false">  
  20.         <!-- 设置memcache服务端实例地址.多个地址用","隔开 -->  
  21.         <servers>127.0.0.1:11211</servers>  
  22.         <!--  
  23.             可选配置。表明了上面设置的服务器实例的Load权重. 例如 <weights>3,7</weights> 表示30% load 在  
  24.             10.2.224.36:33001, 70% load 在 10.2.224.46:33001  
  25.           
  26.         <weights>3,7</weights>  
  27.         -->  
  28.     </socketpool>  
  29. </memcached>  

 

 

2) 测试类

 

Java代码  收藏代码
  1. package com.hl.memcached.client.test;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import com.alisoft.xplatform.asf.cache.ICacheManager;  
  7. import com.alisoft.xplatform.asf.cache.IMemcachedCache;  
  8. import com.alisoft.xplatform.asf.cache.memcached.CacheUtil;  
  9. import com.alisoft.xplatform.asf.cache.memcached.MemcachedCacheManager;  
  10. import com.hl.memcached.cache.client.TestBean;  
  11.   
  12. public class ClientTest {  
  13.       
  14.     @SuppressWarnings("unchecked")  
  15.     public static void main(String[] args) {  
  16.         ICacheManager<IMemcachedCache> manager;  
  17.         manager = CacheUtil.getCacheManager(IMemcachedCache.class,  
  18.                 MemcachedCacheManager.class.getName());  
  19.         manager.setConfigFile("memcached.xml");  
  20.         manager.start();  
  21.         try {  
  22.             IMemcachedCache cache = manager.getCache("mclient_0");  
  23.             cache.put("key""value");  
  24.             System.out.println(cache.get("key"));  
  25.         } finally {  
  26.             manager.stop();  
  27.         }  
  28.     }  
  29.   
  30. }  

 

 

七、使用memcached缓存java bean自定义对象

Memcached可以缓存String,也可以缓存自定义java bean。但必须是可序列化的java bean(implements Serializable即可)

1.         基于java_memcached-release_2.6.3

测试用java bean

 

Java代码  收藏代码
  1. package com.hl.memcached.cache.client;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. public class TestBean implements Serializable{  
  6.     private static final long serialVersionUID = 5344571864700659321L;  
  7.       
  8.     private String name;  
  9.     private Integer age;  
  10.     //get、set方法略  
  11. }  

 

 MyCache.java 代码 

 

Java代码  收藏代码
  1. package com.hl.memcached.cache;  
  2.   
  3. import java.util.Date;  
  4.   
  5. import com.danga.MemCached.MemCachedClient;  
  6. import com.danga.MemCached.SockIOPool;  
  7.   
  8. public class MyCache {  
  9.     public static void main(String[] args) {  
  10.         MemCachedClient client=new MemCachedClient();  
  11.         String [] addr ={"127.0.0.1:11211"};  
  12.         Integer [] weights = {3};  
  13.         SockIOPool pool = SockIOPool.getInstance();  
  14.         pool.setServers(addr);  
  15.         pool.setWeights(weights);  
  16.         pool.setInitConn(5);  
  17.         pool.setMinConn(5);  
  18.         pool.setMaxConn(200);  
  19.         pool.setMaxIdle(1000*30*30);  
  20.         pool.setMaintSleep(30);  
  21.         pool.setNagle(false);  
  22.         pool.setSocketTO(30);  
  23.         pool.setSocketConnectTO(0);  
  24.         pool.initialize();  
  25.           
  26. //      String [] s  =pool.getServers();  
  27.         client.setCompressEnable(true);  
  28.         client.setCompressThreshold(1000*1024);  
  29.           
  30. //      将数据放入缓存  
  31.         TestBean bean=new TestBean();  
  32.         bean.setName("name1");  
  33.         bean.setAge(25);  
  34.         client.add("bean1", bean);  
  35.           
  36. //      获取缓存数据  
  37.         TestBean beanClient=(TestBean)client.get("bean1");  
  38.         System.out.println(beanClient.getName());  
  39.     }  
  40. }  

2.         基于alisoft-xplatform-asf-cache-2.5.1

 

Java代码  收藏代码
  1. package com.hl.memcached.client.test;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import com.alisoft.xplatform.asf.cache.ICacheManager;  
  7. import com.alisoft.xplatform.asf.cache.IMemcachedCache;  
  8. import com.alisoft.xplatform.asf.cache.memcached.CacheUtil;  
  9. import com.alisoft.xplatform.asf.cache.memcached.MemcachedCacheManager;  
  10. import com.hl.memcached.cache.client.TestBean;  
  11.   
  12. public class ClientTest {  
  13.       
  14.     @SuppressWarnings("unchecked")  
  15.     public static void main(String[] args) {  
  16.         ICacheManager<IMemcachedCache> manager;  
  17.         manager = CacheUtil.getCacheManager(IMemcachedCache.class,  
  18.                 MemcachedCacheManager.class.getName());  
  19.         manager.setConfigFile("memcached.xml");  
  20.         manager.start();  
  21.         try {  
  22.             IMemcachedCache cache = manager.getCache("mclient_0");  
  23.   
  24.             TestBean bean=new TestBean();  
  25.             bean.setName("name1");  
  26.             bean.setAge(25);  
  27.             cache.put("bean", bean);  
  28.             TestBean beanClient=(TestBean)cache.get("bean");  
  29.             System.out.println(beanClient.getName());  
  30.               
  31.             List<TestBean> list=new ArrayList<TestBean>();  
  32.             list.add(bean);  
  33.             cache.put("beanList", list);  
  34.             List<TestBean> listClient=(List<TestBean>)cache.get("beanList");  
  35.             if(listClient.size()>0){  
  36.                 TestBean bean4List=listClient.get(0);  
  37.                 System.out.println(bean4List.getName());  
  38.             }  
  39.         } finally {  
  40.             manager.stop();  
  41.         }  
  42.     }  
  43.   
  44. }  

 

八、参考资料:

http://blog.developers.api.sina.com.cn/?p=124

http://www.infoq.com/cn/articles/memcached-java

 

 

  • 大小: 28.2 KB
  • 大小: 30.9 KB
分享到:
评论

相关推荐

    memcached windows稳定版

    在终端(也即cmd命令界面)下输入 ‘c:\memcached\memcached.exe -d install’ 安装 3. 再输入: ‘c:\memcached\memcached.exe -d start’ 启动。NOTE: 以后memcached将作为windows的一个服务每次开机时自动启动...

    memcached安装软件 libevent magent memcached

    Memcached是一款高性能、分布式内存对象缓存系统,广泛应用于Web应用中,用于减轻数据库的负载。它通过在内存中存储数据来提供快速的数据访问,从而提高应用的性能。本篇文章将详细讲解如何安装和配置memcached,...

    memcached 64位 window

    标题"memcached 64位 window"指的是在Windows操作系统上运行的64位版本的Memcached缓存系统。Memcached是一种分布式内存对象缓存系统,广泛用于减轻数据库负载,提高Web应用的性能。由于是64位版本,这意味着它可以...

    php7 的memcached扩展php_memcached.dll扩展

    Memcached是一种分布式内存对象缓存系统,广泛应用于Web应用程序,以提高数据读取速度,减轻数据库负载。在PHP环境中,使用Memcached扩展可以方便地存储和检索数据,尤其适用于处理高并发场景。 `...

    hibernate-memcached包

    **hibernate-memcached包** 是一个专为Hibernate框架设计的扩展,目的是将流行的分布式内存缓存系统Memcached整合到Hibernate中,作为其二级缓存解决方案。在大型分布式应用中,缓存技术是提高性能的关键,特别是...

    memcached-1.5.11.tar.gz

    《深入理解Memcached:基于1.5.11版本的剖析》 Memcached,一个高性能、分布式的内存对象缓存系统,广泛应用于Web应用中,用于减轻数据库的负载,提高数据访问速度。本文将深入探讨Memcached的1.5.11版本,解析其...

    memcached+tomcat7共享session所需要的jar包

    标题中的“memcached+tomcat7共享session所需要的jar包”是指使用Memcached作为分布式缓存系统,实现Tomcat7服务器间的Session共享。这通常是为了在集群环境中解决Session复制或粘滞会话的问题,提高Web应用的可扩展...

    memcached-win-32/64-1.4.4-14

    memcached的基本设置: -p 监听的端口 -l 连接的IP地址, 默认是本机 -d start 启动memcached服务 -d restart 重起memcached服务 -d stop|shutdown 关闭正在运行的memcached服务 -d install 安装memcached服务 -d ...

    java_memcached-release_2.5.1.jar Memcache java jar 包

    Java Memcached是一个流行的Java客户端库,用于与Memcached缓存系统进行交互。Memcached是一种分布式内存对象缓存系统,常用于减轻数据库负载,提高Web应用的性能。在本例中,我们关注的是`java_memcached-release_...

    memcached数据完整迁移到redis

    标题 "memcached数据完整迁移到redis" 描述的是一个数据迁移的过程,从使用 memcached 存储的数据转换到使用 redis 存储。这个过程在 IT 领域中是常见的,因为不同的缓存系统有不同的特性和优势。让我们深入探讨这个...

    memcached安装包以及MemCachedClient

    **Memcached 安装与使用详解** Memcached 是一款高性能的分布式内存缓存系统,用于在Web应用中减轻数据库负载。它将数据存储在内存中,以键值对的形式提供快速访问,尤其适用于高并发场景。Memcached 使用简单,可...

    memcached 完整的项目,服务端(win) 客户端 包括jar包

    **Memcached 完整项目详解** Memcached 是一个高性能、分布式的内存对象缓存系统,用于在应用服务器之间共享数据,减少数据库负载。这个项目包含了 Memcached 的服务端(适用于 Windows)以及 Java 客户端,是开发...

    windows下memcached+memcached.dll 5.3.8

    标题中的“Windows下memcached+memcached.dll 5.3.8”指的是在Windows操作系统上安装和使用Memcached服务的场景,其中`memcached.dll 5.3.8`是Memcached服务器的一个特定版本的动态链接库文件。Memcached是一款高...

    memcached服务器端memcached.exe 下载

    标题“memcached服务器端memcached.exe 下载”指的是获取memcached服务端的可执行文件,`memcached.exe`是Windows环境下运行memcached服务的程序。这个绿色版的memcached意味着它无需安装,下载解压后即可直接运行,...

    memcached-win64-1.4.4-14.zip

    Memcached 是一个高性能、分布式内存对象缓存系统,它广泛应用于Web应用中,用来减轻数据库负载,提高数据访问速度。Memcached的设计理念是简单而快速,通过在内存中存储键值对来提供高速的数据访问。这里我们关注的...

    memcached-win32-1.4.4-14.zip

    标题"memcached-win32-1.4.4-14.zip"指的是Memcached的Windows 32位版本,版本号为1.4.4,构建编号14。这个压缩包是一个软件分发包,用于在32位Windows系统上部署和运行Memcached。 描述中提到,Memcached是一个...

    python-memcached python-memcached

    Python-memcached是Python语言的一个库,用于与Memcached缓存系统进行交互。Memcached是一种高性能、分布式内存对象缓存系统,广泛应用于Web应用中,用于减轻数据库的负载,提高数据访问速度。Python-memcached库则...

Global site tag (gtag.js) - Google Analytics