Memcache Java 客户端使用

来源:互联网 发布:淘宝实木家具骗局真缘 编辑:程序博客网 时间:2024/05/22 14:24
前面我们讲解了memcache的概念及安装,本节我们使用java客户端连接测试,看一下其如何在开发过程中使用。
Memcached Client目前有3种: 
1.Memcached Client for Java
项目地址:https://github.com/gwhalin/Memcached-Java-Client/
2.SpyMemcached
项目地址:http://code.google.com/p/spymemcached/
3.XMemcached
项目地址:https://github.com/killme2008/xmemcached
这三种Client一直存在各种争议: 
Memcached Client for Java比SpyMemcached更稳定、更早、更广泛;
SpyMemcached 比 Memcached Client for Java更高效;
XMemcached 比 SpyMemcache并发效果更好。
用数据来说话,参考官方性能对比: 
Memcached Client for Java: https://github.com/gwhalin/Memcached-Java-Client/wiki/PERFORMANCE  
XMemcached: https://github.com/killme2008/xmemcached/blob/master/benchmark/benchmark.html

下面我们以Memcached Client for Java为例演示一下其使用。
1.在maven仓库中添加java-memcached-2.6.2.jar
由于目前java memcached client没有官方的maven repository可供使用,因此使用时需要手动将其安装到本地repository。java memcached client的jar包下载地址:https://github.com/gwhalin/Memcached-Java-Client/downloads 目前2.6.2版本的java memcached client要依赖slf4j-simple、slf4j-api、commons-pool三个包,依此我们可以为其编辑一个pom文件,将java memcached client的jar包和pom文件一起安装,解决java memcached client对其他jar包的依赖。安装命令:
mvn install:install-file -Dfile=/path/to/java-memcached-release_2.6.2.jar -DpomFile=/path/to/java-memcached-2.6.2.pom

其中Java-memcached-2.6.2.pom的内容为:

[html] view plain copy print?在CODE上查看代码片派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">  
  4.   <modelVersion>4.0.0</modelVersion>  
  5.   <groupId>com.danga</groupId>  
  6.   <artifactId>java-memcached</artifactId>  
  7.   <version>2.6.2</version>  
  8. <dependencies>  
  9.     <dependency>  
  10.         <groupId>org.slf4j</groupId>  
  11.         <artifactId>slf4j-simple</artifactId>  
  12.         <version>1.6.2</version>  
  13.     </dependency>  
  14.     <dependency>  
  15.         <groupId>org.slf4j</groupId>  
  16.         <artifactId>slf4j-api</artifactId>  
  17.         <version>1.6.2</version>  
  18.     </dependency>  
  19.     <dependency>  
  20.         <groupId>commons-pool</groupId>  
  21.         <artifactId>commons-pool</artifactId>  
  22.         <version>1.5.6</version>  
  23.     </dependency>  
  24.     <dependency>  
  25.         <groupId>log4j</groupId>  
  26.         <artifactId>log4j</artifactId>  
  27.         <version>1.2.12</version>  
  28.     </dependency>  
  29. </dependencies>  
  30. </project>  
2.添加jar到工程的pom.xml
[html] view plain copy print?在CODE上查看代码片派生到我的代码片
  1. <dependency>  
  2.         <groupId>com.danga</groupId>  
  3.         <artifactId>java-memcached</artifactId>  
  4.         <version>2.6.2</version>  
  5.     </dependency>  
3.实例代码

实体:User.java

[java] view plain copy print?在CODE上查看代码片派生到我的代码片
  1. package cn.slimsmart.memcache.demo.test;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. //实体需要序列化  
  6. public class User implements Serializable{  
  7.     private static final long serialVersionUID = 1L;  
  8.       
  9.     private String userName;  
  10.     private String password;  
  11.       
  12.     public String getUserName() {  
  13.         return userName;  
  14.     }  
  15.     public void setUserName(String userName) {  
  16.         this.userName = userName;  
  17.     }  
  18.     public String getPassword() {  
  19.         return password;  
  20.     }  
  21.     public void setPassword(String password) {  
  22.         this.password = password;  
  23.     }  
  24. }  
客户端工具类:MemCachedManager.java

[java] view plain copy print?在CODE上查看代码片派生到我的代码片
  1. package cn.slimsmart.memcache.demo.test;  
  2.   
  3. import java.util.Date;  
  4.   
  5. import com.meetup.memcached.MemcachedClient;  
  6. import com.meetup.memcached.SockIOPool;  
  7.   
  8. /** 
  9.  * 客户端工具类 
  10.  */  
  11. public class MemCachedManager {  
  12.   
  13.     // 创建全局的唯一实例  
  14.     private static MemcachedClient memcachedClient;  
  15.   
  16.     private static MemCachedManager memCachedManager = new MemCachedManager();  
  17.   
  18.     static {  
  19.         // 设置缓存服务器列表,当使用分布式缓存的时,可以指定多个缓存服务器。这里应该设置为多个不同的服务  
  20.         String[] servers = { "192.168.100.110:11211""192.168.100.110:11311""192.168.100.110:11411" };  
  21.         // 设置服务器权重  
  22.         Integer[] weights = { 321 };  
  23.         // 创建一个Socked连接池实例  
  24.         SockIOPool sockIOPool = SockIOPool.getInstance();  
  25.   
  26.         sockIOPool.setServers(servers);// 设置memcached服务器地址  
  27.         sockIOPool.setWeights(weights);// 设置每个MemCached服务器权重  
  28.         sockIOPool.setFailover(true); // 当一个memcached服务器失效的时候是否去连接另一个memcached服务器.  
  29.         sockIOPool.setInitConn(10); // 初始化时对每个服务器建立的连接数目  
  30.         sockIOPool.setMinConn(10); // 每个服务器建立最小的连接数  
  31.         sockIOPool.setMaxConn(100); // 每个服务器建立最大的连接数  
  32.         sockIOPool.setMaintSleep(30);// 自查线程周期进行工作,其每次休眠时间  
  33.         sockIOPool.setNagle(false); // Socket的参数,如果是true在写数据时不缓冲,立即发送出去。Tcp的规则是在发送一个包之前,包的发送方会等待远程接收方确认已收到上一次发送过来的包;这个方法就可以关闭套接字的缓存——包准备立即发出。  
  34.         sockIOPool.setSocketTO(3000);// Socket阻塞读取数据的超时时间  
  35.         sockIOPool.setAliveCheck(true);// 设置是否检查memcached服务器是否失效  
  36.         sockIOPool.setMaxIdle(1000 * 30 * 30);// 设置最大处理时间  
  37.         sockIOPool.setSocketConnectTO(0);// 连接建立时对超时的控制  
  38.         sockIOPool.setMaintSleep(30);// 设置主线程睡眠时间,每30秒苏醒一次,维持连接池大小  
  39.   
  40.         sockIOPool.initialize();// 初始化连接池  
  41.         if (memcachedClient == null) {  
  42.             memcachedClient = new MemcachedClient();  
  43.         }  
  44.         // 压缩设置,超过指定大小(单位为K)的数据都会被压缩  
  45.         memcachedClient.setCompressEnable(true);  
  46.         memcachedClient.setCompressThreshold(64 * 1024);  
  47.     }  
  48.   
  49.     /** 
  50.      * 获取唯一实例. 
  51.      *  
  52.      * @return 
  53.      */  
  54.     public static MemCachedManager getInstance() {  
  55.         return memCachedManager;  
  56.     }  
  57.   
  58.     private MemCachedManager() {  
  59.     }  
  60.   
  61.     /** 
  62.      * 向缓存添加键值对并为该键值对设定逾期时间(即多长时间后该键值对从Memcached内存缓存中删除,比如: new 
  63.      * Date(1000*10),则表示十秒之后从Memcached内存缓存中删除)。 
  64.      * 设置过期时间:设置10分钟后过期,是应该设置date为System.currentTimeInMillis()+10*60*1000 
  65.      * 还是10*60*1000 服务端是两种方式都兼容的,一个是多少秒后过期,一个是什么时候过期, 但后者因为设置时间是在客户端, 
  66.      * 存储在服务端,假如两台服务器时间差别很大,就会导致数据的过期时间和我要求的时间点不符合。 
  67.      *  
  68.      */  
  69.     public static boolean add(String key, Object value, Date expire) {  
  70.         return memcachedClient.add(key, value, expire);  
  71.     }  
  72.   
  73.     /** 
  74.      * 根据键获取Memcached内存缓存管理系统中相应的值 
  75.      */  
  76.     public static Object get(String key) {  
  77.         return memcachedClient.get(key);  
  78.     }  
  79.   
  80.     public boolean replace(String key, Object value) {  
  81.         return memcachedClient.replace(key, value);  
  82.     }  
  83.   
  84.     public boolean replace(String key, Object value, Date expiry) {  
  85.         return memcachedClient.replace(key, value, expiry);  
  86.     }  
  87. }  
测试类:

[java] view plain copy print?在CODE上查看代码片派生到我的代码片
  1. package cn.slimsmart.memcache.demo.test;  
  2.   
  3. import java.util.Date;  
  4.   
  5. //测试  
  6. public class Test {  
  7.     public static void main(String[] args) {  
  8.         User user = new User();  
  9.         user.setUserName("lucy");  
  10.         user.setPassword("abc123");  
  11.         MemCachedManager.add("user", user, new Date(1000 * 60));// 向Memcached中添加一个序列化的对象  
  12.         user = (User) (MemCachedManager.get("user"));  
  13.         System.err.println("用户名:" + user.getUserName() + ",密码:" + user.getPassword());  
  14.     }  
  15. }  
运行打印:

用户名:lucy,密码:abc123

关于SpyMemcached的使用添加相应jar

[html] view plain copy print?在CODE上查看代码片派生到我的代码片
  1. <dependency>  
  2.             <groupId>net.spy</groupId>  
  3.             <artifactId>spymemcached</artifactId>  
  4.             <version>2.11.6</version>  
  5.         </dependency>  

具体请参考代码示例:


转载:http://blog.csdn.net/zhu_tianwei/article/details/44570379

0 0