首页 > 代码库 > memcached—向memcached中保存Java实体需注意的问题

memcached—向memcached中保存Java实体需注意的问题

         今天以代码实例的形式总结一下向memcached中保存Java实体需注意的问题:

         memcached工具类代码:

package com.ghj.packageoftool;

import java.util.Date;

import com.danga.MemCached.MemCachedClient;
import com.danga.MemCached.SockIOPool;

/**
 * Memcached工具类
 * 
 * @author GaoHuanjie
 */
public class MemcachedUtils {

	private static MemCachedClient memCachedClient;
	static {
         /************************************配置Memcached**************************************/
         SockIOPool sockIOPool = SockIOPool.getInstance();

         sockIOPool.setServers(new String[]{"127.0.0.1:11211"});//设置memcached服务器地址
         sockIOPool.setWeights(new Integer[]{3}); 				//设置每个MemCached服务器权重 
         sockIOPool.setFailover(true);  						//当一个memcached服务器失效的时候是否去连接另一个memcached服务器.
         sockIOPool.setInitConn(10);    						//初始化时对每个服务器建立的连接数目
         sockIOPool.setMinConn(10);     						//每个服务器建立最小的连接数
         sockIOPool.setMaxConn(100);    						//每个服务器建立最大的连接数
         sockIOPool.setMaintSleep(30);  						//自查线程周期进行工作,其每次休眠时间
         sockIOPool.setNagle(false);    						//Socket的参数,如果是true在写数据时不缓冲,立即发送出去。Tcp的规则是在发送一个包之前,包的发送方会等待远程接收方确认已收到上一次发送过来的包;这个方法就可以关闭套接字的缓存——包准备立即发出。
         sockIOPool.setSocketTO(3000);  						//Socket阻塞读取数据的超时时间
         sockIOPool.setAliveCheck(true);						//设置是否检查memcached服务器是否失效
         sockIOPool.setMaxIdle(1000*30*30); 					// 设置最大处理时间 
         sockIOPool.setSocketConnectTO(0);  					//连接建立时对超时的控制

         sockIOPool.initialize();  								// 初始化连接池
         if (memCachedClient == null){
        	 memCachedClient = new MemCachedClient();
         }
	}

	private MemcachedUtils() {
	}

	/**
	 * 向缓存添加键值对并为该键值对设定逾期时间(即多长时间后该键值对从Memcached内存缓存中删除,比如: new Date(1000*10),则表示十秒之后从Memcached内存缓存中删除)。
	 * 
	 * @author GaoHuanjie
	 */
	public static boolean add(String key, Object value, Date expire) {
		try {
			return memCachedClient.add(key, value, expire);
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}

	/**
	 * 根据键获取Memcached内存缓存管理系统中相应的值
	 * 
	 * @author GaoHuanjie
	 */
	public static Object get(String key) {
		try {
			return memCachedClient.get(key);
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
}
         测试main方法所在类代码:
package com.ghj.packageofclient;

import java.util.Date;

import com.ghj.packageoftool.MemcachedUtils;
import com.ghj.packageofvo.User;

public class Client{
	
	public static void main(String[] args) {
		MemcachedUtils.add("user", new User("liunannan", "liunannan@jd"), new Date(1000*60));//向Memcached中添加一个序列化的对象
		User user = (User)(MemcachedUtils.get("user"));
		System.err.println("用户名:"+user.getUserName() + ",密码:" + user.getPassword());
	}
}
         Java实体代码:
package com.ghj.packageofvo;

/**
 * 用户业务bean
 * 
 * @author 高焕杰
 */
public class User{

	private String userName;
	private String password;

	public User(String userName, String password) {
		super();
		this.userName = userName;
		this.password = password;
	}
	
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
}
        运行main方法,你将看到如下异常:

         稍有Java基础的人一看便知:之所以出现这个问题完全是由于Java实体User类没有实例化造成的,所以User类应该改成如下代码:

package com.ghj.packageofvo;

import java.io.Serializable;

/**
 * 用户业务bean
 * 
 * @author 高焕杰
 */
public class User implements Serializable{

	private static final long serialVersionUID = -3371451210123762490L;

	private String userName;
	private String password;

	public User(String userName, String password) {
		super();
		this.userName = userName;
		this.password = password;
	}
	
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
}
        【0分下载工程代码

memcached—向memcached中保存Java实体需注意的问题