`
ye5562402
  • 浏览: 7871 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

java Memcached-1

阅读更多
package net.b2bcenter.framework.modules.objectpool;

import java.security.NoSuchAlgorithmException;
import java.util.Date;
import java.util.Map;

import net.b2bcenter.entity15.base.IdEntity;
import net.b2bcenter.framework.modules.utils.EncodeUtils;

import org.apache.log4j.BasicConfigurator;

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

public class ObjectPool {
	private boolean enable;

	private ObjectPoolLogger logger = new ObjectPoolLogger();  
	
	public final static int ONE_MINUTE = 60;  // 1m
	public final static int ONE_HOUR = 60 * 60;  // 1h
	public final static int ONE_DAY = 60 * 60 * 24;  // 1day
	public final static int DEFAULT_LIFE = 60 * 60;  // 1h

	private PoolConfig config = new PoolConfig();
	private MemCachedClient mcc = null;
	private String[] servers = {"localhost:11211"};
	
	private synchronized MemCachedClient _init() {
		return _init(servers);
	}
	
	private synchronized static MemCachedClient _init(String[] servers) {
		// memcached should be running on port 11211 but NOT on 11212
		BasicConfigurator.configure();
		
		SockIOPool pool = SockIOPool.getInstance();
		pool.setServers( servers );
		pool.setFailover( true );
		pool.setInitConn( 10 ); 
		pool.setMinConn( 5 );
		pool.setMaxConn( 250 );
		pool.setMaxIdle( 1000 * 60 * 60 * 6 ); 
		
		// set the sleep for the maint thread
		// it will wake up every x seconds and
		// maintain the pool size
		pool.setMaintSleep( 30 ); 
		// Tcp的规则就是在发送一个包之前,本地机器会等待远程主机
		// 对上一次发送的包的确认信息到来;这个方法就可以关闭套接字的缓存,
		// 以至这个包准备好了就发; 
		pool.setNagle( false );
		
		//连接建立后对超时的控制
		pool.setSocketTO( 3000 );
		//连接建立时对超时的控制
		pool.setSocketConnectTO( 0 ); 
		
		pool.setAliveCheck( true );
		pool.initialize();

		MemCachedClient mcc = new MemCachedClient();

		// turn off most memcached client logging:
		//Logger.getLogger( MemCachedClient.class.getName() ).setLevel( com.schooner.MemCached.Logger. );
		return mcc;
	}
	
	public void setLogFile(String logFile) {
		this.logger.setLogFile(logFile);
	}
	
	public void setEnable(boolean enable) {
		this.enable = enable;
	}

	public boolean isEnable() {
		return enable;
	}

	public void setLogEnable(boolean logEnable) {
		this.logger.setEnable(logEnable);
	}

	public void setServers(String servers) {
		this.servers = servers.split(",");
	}
	
	public void init() {
		mcc = _init();
	}
	
	public void init(String[] servers) {
		mcc = _init(servers);
	}

	/**
	 * @return true if success
	 */
	public boolean set(IdEntity obj) {
		return set(KeyGenerator.getKey(obj), obj);
	}
	
	/**
	 * @return true if success
	 */
	public boolean set(String key, Object value) {
		if (!enable) {
			return true;
		}
		
		if (mcc == null) {
			mcc = _init();
		}
		
//		value = convert(value);
		return mcc.set(encodeKey(key), value);
	}
	
	private boolean _set(String key, Object value) {
		if (!enable) {
			return true;
		}
		
		if (mcc == null) {
			mcc = _init();
		}
		
		return mcc.set(encodeKey(key), value);
	}
	
	/*
	 * @return true if success
	 */
	public boolean set(IdEntity obj, int lifeSeconds) {
		return set(KeyGenerator.getKey(obj), obj, lifeSeconds);
	}
	
	/**
	 * @param lifeSeconds the data will be discard after the given seconds.
	 * @return true if success  
	 */
	public boolean set(String key, Object value, int lifeSeconds) {
		if (!enable) {
			return true;
		}

		if (mcc == null) {
			mcc = _init();
		}

//		value = convert(value);
		return mcc.set(encodeKey(key), value, new Date(lifeSeconds * 1000));
	}
	
	public IdEntity get(Class model, Long id) {
		return (IdEntity)get(KeyGenerator.getKey(model, id));
	}
	
	public IdEntity[] get(Class model, String[] ids) {
		String[] keys = new String[ids.length];
		for (int i = 0 ; i < ids.length ; i++) {
			keys[i] = KeyGenerator.getKey(model, new Long(ids[i]));
		}
		
		Object[] values = get(keys);
		IdEntity[] ret = new IdEntity[values.length];
		for (int i = 0 ; i < values.length ; i++) {
			ret[i] = (IdEntity)values[i];
		}
		return ret;
	}
	
	public Object[] get(String[] keys) {
		if (!enable) {
			return null;
		}
		
		if (mcc == null) {
			mcc = _init();
		}
		
		for (int i = 0 ; i < keys.length ; i++) {
			keys[i] = encodeKey(keys[i]);
		}
		Map<String, Object> values = mcc.getMulti(keys);
		Object[] ret = new Object[keys.length];
		for (int i = 0 ; i < keys.length ; i++) {
			ret[i] = values.get(keys[i]);
			if (ret[i] != null) {
//				ret[i] = convert(ret[i]);
			}
		}
		
		return ret;		
	}
	
	public Object get(String key) {
		if (!enable) {
			return null;
		}
		
		if (mcc == null) {
			mcc = _init();
		}

		Object value = mcc.get(encodeKey(key));
		if (value != null) {
//			value = convert(value);
			logger.writeHitLog(key);
//			System.out.println("Object pool hit: " + key);
		} else {
			logger.writeMissedLog(key);
//			System.out.println("Object pool missed: " + key);
		}
		return value;
	}

	public void remove(IdEntity obj) {
		remove(KeyGenerator.getKey(obj), false);
	}
	
	public void remove(IdEntity obj, boolean force) {
		remove(KeyGenerator.getKey(obj), force);
	}

	public void remove(Class model, String id) {
		remove(model, id, false);
	}
	
	public void remove(Class model, String id, boolean force) {
		remove(KeyGenerator.getKey(model, new Long(id)), force);
	}
	
	public void remove(String key) {
		remove(key, false);
	}
	
	public void remove(String key, boolean force) {
		if (!enable) {
			return;
		}
		
		if (mcc == null) {
			mcc = _init();
		}
		
		String encodedKey = encodeKey(key);
		Object o = mcc.get(encodedKey);
		if (o != null) {
			if (force) {
				mcc.delete(encodedKey);
			} else {
				// 在数据发生改变后,会删掉cache里的值。但这时事务还没提交,数据库里的值还没变,如果有人这时读数据,发现cache里
				// 没值就会去数据库读,这样就会产生脏数据。为了避免这种现象,这里延迟1s再删数据以等待事务提交完成,可以降低产生
				// 脏数据的可能
				mcc.set(encodedKey, o, new Date(1 * 1000));
			}
		}
	}

	public boolean isCachable(Class cls) {
		if (cls.getName().contains("$$")) {
			cls = cls.getSuperclass();
		}
		return config.isCachable(cls);
	}
	
	public int getLife(Class cls) {
		return config.getLife(cls);
	}

	// key maybe include some char invalid for memcache, so we need to encode it 
	private String encodeKey(String key) {
		try {
			java.security.MessageDigest md5 = java.security.MessageDigest.getInstance( "MD5" );
			md5.update(key.getBytes());
		    byte tmp[] = md5.digest(); 
		    key = EncodeUtils.base64Encode(tmp);
			return key;
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
			return key;
		}
	}
	
	public static void main(String[] args) {
		long t1 = new Date().getTime();
		ObjectPool pool = new ObjectPool();
		pool.setEnable(true);
		pool.set("kkk", "OOOO");
		Object o = pool.get("kkk");
		System.out.println("o:"+o);
//		for (int i = 0 ; i < 1000000 ; i++) {
//			pool.set(""+i, ""+i);
//		}
//		
//		long t2 = new Date().getTime();
//		
//		System.out.println("set time:"+(t2-t1));
//		
//		for (int i = 0 ; i < 1000000 ; i++) {
//			pool.get(""+i);
//		}
//		long t3 = new Date().getTime();
//		
//		System.out.println("set time:"+(t3-t2));
	}
}
分享到:
评论

相关推荐

    java-memcached-2.6.6.jar

    java-memcached-2.6.6.jar

    memcached-1.2.1-win32.zip 和 java_memcached-release_1.6.zip

    1. **安装Memcached服务器**:解压`memcached-1.2.1-win32.zip`,按照文档指导配置并启动Memcached服务。这通常包括设置端口号(默认为11211),以及配置内存大小等。 2. **引入Java客户端库**:将`java_memcached-...

    java_memcached-release_2.5.1.jar Memcache java jar 包

    在本例中,我们关注的是`java_memcached-release_2.5.1.jar`这个文件,这是一个包含了Java Memcached客户端库的JAR(Java Archive)包,版本号为2.5.1。 Java Memcached客户端库由Danga Interactive开发,该公司是...

    java_memcached-release_2.0.1.jar

    java_memcached-release_2.0.1.jar。jdk5版本适用。使用log4j。

    session共享 memcached-session-manager 1.9.6 jar

    `memcached-session-manager`是Java的一个库,用于在基于Tomcat的Web应用中实现基于Memcached的session共享,这在分布式环境中尤为重要。 标题中的"session共享 memcached-session-manager 1.9.6 jar"指的正是这个...

    Memcached-Java-Client-release_2.6.1.zip

    《Java与Memcached整合详解——基于Memcached-Java-Client 2.6.1》 在现代Web开发中,缓存技术是提升系统性能的重要手段之一。Memcached是一款高性能、分布式内存对象缓存系统,广泛应用于缓解数据库负载,提高响应...

    java_memcached-release_2.5.1

    Memcached Cache现在已经被大家广泛使用,但是千万不要认为对Cache的操作是低损耗的,要知道这类集中式Cache对Socket连接数(会牵涉到linux操作系统文件句柄可用数),带宽,网络IO都是有要求的,有要求就意味着会有...

    Memcached-Java-Client-3.0.2.jar

    Memcached-Java-Client-3.0.2.jar

    java_memcached-release_2.6.2.jar

    java_memcached-release_2.6.2.jar java缓存工具 memcached

    memcached-session-manager

    2. **Java Servlet会话管理**:在Java Web开发中,Servlet规范定义了会话接口HttpSession,memcached-session-manager 是一个实现该接口的第三方库,允许开发者将默认的基于内存的会话存储替换为分布式存储。...

    java_memcached-release_2.6.6.jar及其依赖包

    在标题和描述中提到的`java_memcached-release_2.6.6.jar`是这个库的特定版本,它包含了实现Memcached协议并与之通信所需的所有Java类和方法。这个版本可能是对早期版本的更新,可能包括性能改进、新功能或错误修复...

    java_memcached-release_2.6.6.rar

    这个“java_memcached-release_2.6.6.rar”压缩包文件包含了用于与Memcached服务器通信的Java库,使得Java开发者能够便捷地集成Memcached到他们的应用中。 Memcached是一个分布式内存对象缓存系统,最初由Danga ...

    java_memcached-release_2.6.3.rar 客户端所有包

    这个`java_memcached-release_2.6.3.rar`压缩包包含了用于Java客户端开发所需的全部依赖库,使得开发者能够轻松地在Java应用中集成Memcached功能。 1. **Memcached**:Memcached是一个高性能、分布式的内存对象缓存...

    memcached-1.5.11.tar.gz

    1. 解压文件:首先,我们需要对"memcached-1.5.11.tar.gz"进行解压,这通常可以通过tar命令完成,例如`tar -zxvf memcached-1.5.11.tar.gz`。 2. 编译与安装:进入解压后的目录,执行`./configure`进行配置,然后`...

    Memcached-session-manager使用说明及相关jar包(tomcat7版)

    Memcached-session-manager使用说明及相关jar包(tomcat7版) 依照文档部署即可实现多服务器多tomcat session共享,jar包中是tomcat7集成所需要的jar包,序列化工具用的是java默认的序列化工具,若要使用其他版本的...

    java_memcached-release_1.3.2的演示工程(JDK1.4)

    在Java Memcached-release 1.3.2版本中,特别强调了对JDK 1.4的支持,这是由于一些老旧系统仍然依赖于这个较早的Java版本。 在Java Memcached 1.3.2的演示工程中,我们通常会看到以下关键知识点: 1. **Java与...

    tomcat-7.0.54配合使用的memcached-session-manager1.6.1的整套jar包

    1. `memcached-session-manager-1.6.1.jar`:主库,包含了`MemcachedSessionManager`和相关的配置类。 2. `spymemcached-2.8.4.jar`:这是一个Java客户端库,用于连接和通信Memcached服务器,`memcached-session-...

    java_memcached-release_2.0.1.zip

    这个zip文件“java_memcached-release_2.0.1.zip”包含了Java Memcached客户端库的源代码、编译后的二进制库、文档和可能的示例。下面将详细讨论该库的关键知识点: 1. **Memcached客户端接口**:Java Memcached...

Global site tag (gtag.js) - Google Analytics