`
uniseraph
  • 浏览: 83600 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

开发了一个高性能memcached java client

阅读更多
用mina开发了一个memcached java client ,性能测试表现良好, 用我的t61做客户端测试,最高能到28000tps。
代码在:http://commons-client.googlecode.com/svn/trunk/,有兴趣的朋友可以看看。我准备把这个项目开源,后面还有不少优化余地,有兴趣的朋友请和我联系,呵呵。


前提条件
1 jdk1.6
2 安装maven
3 安装ant

编译: ant
运行测试程序:  ant run -Dip=....  -Dthread=100 -Drepeat=10000 -Dsize=2
ip: memcached server ip
thread : 测试线程数
repeat : 每个线程循环此处,每次10000次,每次有两个memcache调用
size:  连接数
可以在命令行中输入参数,也可以修改build.properties中的默认参数


正在写文档,以后慢慢补上。

BTW, 有兴趣可以看看我blog的相关文档,http://uniseraph.iteye.com
分享到:
评论
30 楼 lxiaodao 2009-01-31  
简单看了一下源码,给后来要的朋友提醒:使用了jdk6里面String的str.getBytes(charset)方法,jdk5支持不了(我下载了jdk6后再看看)。顺便说一下,mina使用的是2.0版本。
不知道楼主可不可以改一下源码让JDK5也可以支持?
29 楼 liuye 2008-10-28  
uniseraph 写道
liuye 写道

get/set只能对字符串/字节操作,Object怎么办?另外,是不是没有考虑连接多个memcached服务器呀?


有数据了,再进行序列化和反序列化是很简单的。后续会包装一些接口。

连接多个服务器也是准备后续再做的,以现在的结构而言,支持起来很简单。

现在我正在考虑把单位时间内的多个get合并成一个gets操作,这样对系统性能提升应该有更大的帮助。



应该优先实现“连接多个memcached服务器”
28 楼 ThinkInJava 2008-10-27  
这个项目值得研究,我想稳定之后,将来应该是一个趋势了,理论很简单,就是内存越大,机器越快,期望能有更大的发展空间!
27 楼 fly_hyp 2008-10-27  
鼓励一下,之前我也尝试做过。
不过一个开源软件要取得成功,需要投入很多时间。还需要一些运作,和商业软件一样。
26 楼 uniseraph 2008-10-23  
贴一下测试代码:
public static void  main(String[] args){
//....
	MemcachedClient mc = new MemcachedClient(ip, port, size);

		CountDownLatch cdl = new CountDownLatch(thread);
		long t = System.currentTimeMillis();
		for (int i = 0; i < thread; i++) {
			new Thread(new TestRunnable(mc, i * 10000, cdl, repeat)).start();
		}

		try {
			cdl.await();
		} catch (InterruptedException e) {

		}

		long all = 2 * thread * repeat;
		long usingtime = (System.currentTimeMillis() - t);
		log
				.info(String
						.format(
								"thread num=%d, repeat=%d,size=%d, all=%d ,velocity=%d , using time:%d",
								thread, repeat, size, all, 1000 * all
										/ usingtime, usingtime));

		mc.pool.close();
}


static private class TestRunnable implements Runnable {

		private MemcachedClient mc;
		private CountDownLatch cd;
		int repeat;
		int start;

		public TestRunnable(MemcachedClient mc, int start, CountDownLatch cdl,
				int repeat) {
			super();
			this.mc = mc;
			this.start = start;
			this.cd = cdl;
			this.repeat = repeat;

		}

		public void run() {

			for (int i = 0; i < repeat; i++) {

				String key = Integer.toString(i);
				mc.set(key, key.getBytes());
				byte[] value = mc.get(key);
				if (log.isInfoEnabled()) {
					String result = new String(value);
					if (!result.equals(key)) {
						log.info(String
								.format("key:%s->result:%s", key, result));
						throw new IllegalStateException();
					}
				}

			}

			cd.countDown();
			// if (log.isDebugEnabled())
			// log.debug(String.format("%s count down", Thread.currentThread()
			// .getName()));
		}

	}



基本算法是:启动100个线程,每个线程循环10000次,每次发送两个操作,一个set一个get。100个线程全部退出,则记时结束。
25 楼 uniseraph 2008-10-22  
liuye 写道
uniseraph 写道
liuye 写道

get/set只能对字符串/字节操作,Object怎么办?另外,是不是没有考虑连接多个memcached服务器呀?


有数据了,再进行序列化和反序列化是很简单的。后续会包装一些接口。

连接多个服务器也是准备后续再做的,以现在的结构而言,支持起来很简单。

现在我正在考虑把单位时间内的多个get合并成一个gets操作,这样对系统性能提升应该有更大的帮助。


根据你的set/get写了read/write方法,对Object进行读写,write方法好像正常,但read方法在运行GetReponse rsp = (GetReponse) pool.send(command, true)时出错。代码如下:

	public Object read(String key) {

		GetCommand command = new GetCommand();

		command.setValue(key);

		GetReponse rsp = (GetReponse) pool.send(command, true);

		if (rsp != null && rsp.isSuccess()) {
			byte[] result = rsp.getResult();
			try {
				return bytes2Object(result);
			} catch (Exception e) {
				log.error(e.getMessage());
				e.printStackTrace();
			}

		}
		return null;
	}

	public void write(String key, Serializable value) {
		byte[] bytes = null;
		try {
			bytes = object2Bytes(value);
		} catch (Exception e) {
			log.error(e.getMessage());
			e.printStackTrace();
		}
		if (bytes != null) {
			SetCommand setCommand = new SetCommand();
			setCommand.setKey(key);
			setCommand.setValue(bytes);
			SetReponse rsp = (SetReponse) pool.send(setCommand, true);
			if (rsp != null && rsp.isSuccess()) {
			}
		}
	}

	public static Object bytes2Object(byte[] objBytes) throws Exception {
		if (objBytes == null || objBytes.length == 0) {
			return null;
		}
		ByteArrayInputStream bi = new ByteArrayInputStream(objBytes);
		ObjectInputStream oi = new ObjectInputStream(bi);
		return oi.readObject();
	}

	public static byte[] object2Bytes(Serializable obj) throws Exception {
		if (obj == null) {
			return null;
		}
		ByteArrayOutputStream bo = new ByteArrayOutputStream();
		ObjectOutputStream oo = new ObjectOutputStream(bo);
		oo.writeObject(obj);
		return bo.toByteArray();
	}





问题已经解决,主要是新增加了一个基于IoBuffer的协议解析器NormalReponseDecoder,取消了原来基于TextLineDecoder的LinedReponseDecoder。到现在为止已经有三种协议解析方法了,回头再做个测试,比较一下三个的区别。


代码已经提交到https://commons-client.googlecode.com/svn/branches/0.1.1 ,暂时不提主干,稳定以后再说。

测试代码如下:
public class Test {

	/**
	 * @param args
	 * @throws IOException
	 */
	public static void main(String[] args) throws IOException {
		ByteArrayOutputStream bo = new ByteArrayOutputStream();
		ObjectOutputStream oo = new ObjectOutputStream(bo);
		oo.writeObject(new Example(1, "hello"));
		byte[]  buffer = bo.toByteArray();
		
		MemcachedClient  mc = new MemcachedClient("10.2.224.34",11211,2);
		 mc.set("aaa", buffer);
		 byte[] result = mc.get("aaa" );
		 
		 boolean b = Arrays.equals(buffer, result);
		System.out.println(b);
		 
	}

	private static class Example implements Serializable {
		private int age;
		private String desc;

		public Example(int age, String desc) {
			super();
			this.age = age;
			this.desc = desc;
		}

	}
}

24 楼 uniseraph 2008-10-22  
Externalizable以前用过,比serialize快得多,但是比较麻烦,会要求每个结构都去实现这个接口,如果消息种类太多,那么开发工作量会比较大。不利于上层应用开发。

其实对于我这个框架来说,不关心是怎么进行序列化/反序列化的,我暴露byte[]出来,如果你关心效率,那么你可以用Externalizable或者hessian的序列化/反序列化,如果你不关心,那么就可以用serialize或者json,总之这属于接口友好性的领域。对项目本身影响不大。
23 楼 movingboy 2008-10-22  
其实JDK还提供了另一个接口Externalizable,相比使用Serializable的性能应该有提高。不知道对你有没有什么帮助
22 楼 uniseraph 2008-10-22  
问题已经确定,在解析命令响应的时候使用了mina提供的TextLineDecoder,这东东可以把一个IoBuffer分成多个指定间隔符的字符串数组,而使用Serializable序列化的byte数组有些认为是特殊字符,无法识别成字符串。

多谢帮我发现问题,呵呵,所以说开源就是好!

不过我的初衷是觉得java自带的序列化/反序列化效率太低了,所以希望能够自己实现。不管怎么样,我使用TextLineDecoder还是太偷懒了,呵呵,回头改一下。

21 楼 uniseraph 2008-10-22  
liuye 写道

uniseraph 写道liuye 写道
get/set只能对字符串/字节操作,Object怎么办?另外,是不是没有考虑连接多个memcached服务器呀?


有数据了,再进行序列化和反序列化是很简单的。后续会包装一些接口。

连接多个服务器也是准备后续再做的,以现在的结构而言,支持起来很简单。

现在我正在考虑把单位时间内的多个get合并成一个gets操作,这样对系统性能提升应该有更大的帮助。

根据你的set/get写了read/write方法,对Object进行读写,write方法好像正常,但read方法在运行GetReponse rsp = (GetReponse) pool.send(command, true)时出错。代码如下:

Java代码 public&nbsp;Object&nbsp;read(String&nbsp;key)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetCommand&nbsp;command&nbsp;=&nbsp;new&nbsp;GetCommand();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;command.setValue(key);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetReponse&nbsp;rsp&nbsp;=&nbsp;(GetReponse)&nbsp;pool.send(command,&nbsp;true);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(rsp&nbsp;!=&nbsp;null&nbsp;&amp;&amp;&nbsp;rsp.isSuccess())&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte[]&nbsp;result&nbsp;=&nbsp;rsp.getResult();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;bytes2Object(result);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(Exception&nbsp;e)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.error(e.getMessage());&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;null;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;write(String&nbsp;key,&nbsp;Serializable&nbsp;value)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte[]&nbsp;bytes&nbsp;=&nbsp;null;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bytes&nbsp;=&nbsp;object2Bytes(value);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(Exception&nbsp;e)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.error(e.getMessage());&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(bytes&nbsp;!=&nbsp;null)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetCommand&nbsp;setCommand&nbsp;=&nbsp;new&nbsp;SetCommand();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setCommand.setKey(key);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setCommand.setValue(bytes);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetReponse&nbsp;rsp&nbsp;=&nbsp;(SetReponse)&nbsp;pool.send(setCommand,&nbsp;true);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(rsp&nbsp;!=&nbsp;null&nbsp;&amp;&amp;&nbsp;rsp.isSuccess())&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;Object&nbsp;bytes2Object(byte[]&nbsp;objBytes)&nbsp;throws&nbsp;Exception&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(objBytes&nbsp;==&nbsp;null&nbsp;||&nbsp;objBytes.length&nbsp;==&nbsp;0)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;null;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ByteArrayInputStream&nbsp;bi&nbsp;=&nbsp;new&nbsp;ByteArrayInputStream(objBytes);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectInputStream&nbsp;oi&nbsp;=&nbsp;new&nbsp;ObjectInputStream(bi);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;oi.readObject();&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;byte[]&nbsp;object2Bytes(Serializable&nbsp;obj)&nbsp;throws&nbsp;Exception&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(obj&nbsp;==&nbsp;null)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;null;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ByteArrayOutputStream&nbsp;bo&nbsp;=&nbsp;new&nbsp;ByteArrayOutputStream();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectOutputStream&nbsp;oo&nbsp;=&nbsp;new&nbsp;ObjectOutputStream(bo);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oo.writeObject(obj);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;bo.toByteArray();&nbsp;&nbsp;}&nbsp;&nbsp; public Object read(String key) {

GetCommand command = new GetCommand();

command.setValue(key);

GetReponse rsp = (GetReponse) pool.send(command, true);

if (rsp != null &amp;&amp; rsp.isSuccess()) {
byte[] result = rsp.getResult();
try {
return bytes2Object(result);
} catch (Exception e) {
log.error(e.getMessage());
e.printStackTrace();
}

}
return null;
}

public void write(String key, Serializable value) {
byte[] bytes = null;
try {
bytes = object2Bytes(value);
} catch (Exception e) {
log.error(e.getMessage());
e.printStackTrace();
}
if (bytes != null) {
SetCommand setCommand = new SetCommand();
setCommand.setKey(key);
setCommand.setValue(bytes);
SetReponse rsp = (SetReponse) pool.send(setCommand, true);
if (rsp != null &amp;&amp; rsp.isSuccess()) {
}
}
}

public static Object bytes2Object(byte[] objBytes) throws Exception {
if (objBytes == null || objBytes.length == 0) {
return null;
}
ByteArrayInputStream bi = new ByteArrayInputStream(objBytes);
ObjectInputStream oi = new ObjectInputStream(bi);
return oi.readObject();
}

public static byte[] object2Bytes(Serializable obj) throws Exception {
if (obj == null) {
return null;
}
ByteArrayOutputStream bo = new ByteArrayOutputStream();
ObjectOutputStream oo = new ObjectOutputStream(bo);
oo.writeObject(obj);
return bo.toByteArray();
}





把错误信息发出来看看。
20 楼 liuye 2008-10-22  
uniseraph 写道
liuye 写道

get/set只能对字符串/字节操作,Object怎么办?另外,是不是没有考虑连接多个memcached服务器呀?


有数据了,再进行序列化和反序列化是很简单的。后续会包装一些接口。

连接多个服务器也是准备后续再做的,以现在的结构而言,支持起来很简单。

现在我正在考虑把单位时间内的多个get合并成一个gets操作,这样对系统性能提升应该有更大的帮助。


根据你的set/get写了read/write方法,对Object进行读写,write方法好像正常,但read方法在运行GetReponse rsp = (GetReponse) pool.send(command, true)时出错。代码如下:

	public Object read(String key) {

		GetCommand command = new GetCommand();

		command.setValue(key);

		GetReponse rsp = (GetReponse) pool.send(command, true);

		if (rsp != null && rsp.isSuccess()) {
			byte[] result = rsp.getResult();
			try {
				return bytes2Object(result);
			} catch (Exception e) {
				log.error(e.getMessage());
				e.printStackTrace();
			}

		}
		return null;
	}

	public void write(String key, Serializable value) {
		byte[] bytes = null;
		try {
			bytes = object2Bytes(value);
		} catch (Exception e) {
			log.error(e.getMessage());
			e.printStackTrace();
		}
		if (bytes != null) {
			SetCommand setCommand = new SetCommand();
			setCommand.setKey(key);
			setCommand.setValue(bytes);
			SetReponse rsp = (SetReponse) pool.send(setCommand, true);
			if (rsp != null && rsp.isSuccess()) {
			}
		}
	}

	public static Object bytes2Object(byte[] objBytes) throws Exception {
		if (objBytes == null || objBytes.length == 0) {
			return null;
		}
		ByteArrayInputStream bi = new ByteArrayInputStream(objBytes);
		ObjectInputStream oi = new ObjectInputStream(bi);
		return oi.readObject();
	}

	public static byte[] object2Bytes(Serializable obj) throws Exception {
		if (obj == null) {
			return null;
		}
		ByteArrayOutputStream bo = new ByteArrayOutputStream();
		ObjectOutputStream oo = new ObjectOutputStream(bo);
		oo.writeObject(obj);
		return bo.toByteArray();
	}

19 楼 uniseraph 2008-10-22  
其实之前也有不少朋友想用nio做memcached client,在javaeye的论坛上也有过相关的讨论。不过问题在于memcached的协议中没有流水号,而一般异步框架都是通过流水号实现命令异步到同步的映射。

这次我是分析了memcached的源码,发现memcached在同一个session,命令处理是依次完成的,所以才能解决这个问题。

有兴趣可以看一下 ,我blog上关于memcached通讯层次的问题。
18 楼 uniseraph 2008-10-22  
iso1600 写道

uniseraph 写道liuye 写道
get/set只能对字符串/字节操作,Object怎么办?另外,是不是没有考虑连接多个memcached服务器呀?


有数据了,再进行序列化和反序列化是很简单的。后续会包装一些接口。

连接多个服务器也是准备后续再做的,以现在的结构而言,支持起来很简单。

现在我正在考虑把单位时间内的多个get合并成一个gets操作,这样对系统性能提升应该有更大的帮助。

合并get可能会费力不讨好


这与场景以及合并算法相关,先尝试尝试。
17 楼 iso1600 2008-10-22  
uniseraph 写道
liuye 写道

get/set只能对字符串/字节操作,Object怎么办?另外,是不是没有考虑连接多个memcached服务器呀?


有数据了,再进行序列化和反序列化是很简单的。后续会包装一些接口。

连接多个服务器也是准备后续再做的,以现在的结构而言,支持起来很简单。

现在我正在考虑把单位时间内的多个get合并成一个gets操作,这样对系统性能提升应该有更大的帮助。


合并get可能会费力不讨好
16 楼 liuye 2008-10-22  
uniseraph 写道
liuye 写道

get/set只能对字符串/字节操作,Object怎么办?另外,是不是没有考虑连接多个memcached服务器呀?


有数据了,再进行序列化和反序列化是很简单的。后续会包装一些接口。

连接多个服务器也是准备后续再做的,以现在的结构而言,支持起来很简单。

现在我正在考虑把单位时间内的多个get合并成一个gets操作,这样对系统性能提升应该有更大的帮助。



序列化和反序列化完成后,有时间我来做个完成的性能测试。
15 楼 uniseraph 2008-10-22  
liuye 写道

get/set只能对字符串/字节操作,Object怎么办?另外,是不是没有考虑连接多个memcached服务器呀?


有数据了,再进行序列化和反序列化是很简单的。后续会包装一些接口。

连接多个服务器也是准备后续再做的,以现在的结构而言,支持起来很简单。

现在我正在考虑把单位时间内的多个get合并成一个gets操作,这样对系统性能提升应该有更大的帮助。
14 楼 davidgrubby 2008-10-22  
干得不错,一起研究一下
13 楼 liuye 2008-10-22  
get/set只能对字符串/字节操作,Object怎么办?另外,是不是没有考虑连接多个memcached服务器呀?
12 楼 fredguo 2008-10-22  
学习ing
11 楼 uniseraph 2008-10-21  
liyao20050101 写道

补充下lib嘛。


编译的时候,会自动下载lib。

相关推荐

    memcaChed java client jar包

    总的来说,`memcached java client jar包`是Java应用连接到Memcached服务器的关键组件,它允许开发者利用Memcached的高性能缓存能力来优化应用程序的性能,降低对数据库的依赖。通过选择合适的客户端库,如...

    memcached java client

    xmemcached是由Ketoo开发的一个高性能、高可用性的Java Memcached客户端。它提供了丰富的API,支持异步和同步操作模式,能够满足各种应用需求。以下是一些xmemcached的关键特性: - **高性能**:xmemcached利用NIO...

    memcached for java client 例子

    "memcached for java client 例子" 指的是一个使用Java语言编写的客户端库,用于与memcached缓存系统进行交互。Memcached是一种高性能、分布式内存对象缓存系统,常用于减轻数据库负载,提升Web应用的响应速度。 **...

    Memcached java的使用实例

    首先,我们需要创建一个`MemcachedClient`实例,连接到运行的Memcached服务器: ```java import net.spy.memcached.AddrUtil; import net.spy.memcached.MemcachedClient; import java.net.InetSocketAddress; ...

    memcached安装包以及MemCachedClient

    对于 Java 开发者,`MemCachedClient` 是一个常用的 Memcached 客户端库。这里我们关注的是 `java_memcached-release_2.6.6.jar` 文件,这是 Spymemcached 库的一个版本,它提供了与 Memcached 服务器通信的接口。 ...

    Memcached-Java-Client-release_2.6.1.zip

    - 创建一个简单的Java应用,使用Memcached-Java-Client 2.6.1实现用户登录信息的缓存,提高登录速度。 - 演示如何在Spring框架中配置和使用Memcached,结合Spring的AOP特性实现自动缓存管理。 通过以上内容,我们...

    MemCached Cache Java Client封装优化历程.docx

    Memcached 是一个高性能、分布式的内存对象缓存系统,主要用于减少数据库的负载,提高应用程序的性能。它通过在内存中存储数据来提供快速访问,而不是每次请求时都去查询数据库。Memcached 的设计目标是简洁、高效,...

    memcached 的简单java实例

    Memcached是一种高性能、分布式内存对象缓存系统,用于在Web应用程序中减少数据库负载,提高数据访问速度。它将数据和对象存储在内存中,以便快速检索,从而提高了应用程序的响应时间。Memcached是无模式的,这意味...

    java使用Memcached简单教程

    Memcached是一个高性能的分布式内存对象缓存系统,通过减轻数据库负载来加速动态Web应用,提高网站的浏览速度。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而极大地提高了应用程序的性能。 #### 二、...

    java中连接memcached服务器

    Memcached是一款高性能、分布式内存对象缓存系统,能够临时存储键值对数据,减轻数据库的压力。接下来,我们将深入探讨如何在Java环境中配置和使用Memcached。 首先,要连接到Memcached服务器,你需要一个Java...

    memcached java源码(performance分支)

    Memcached是一款高性能的分布式内存对象缓存系统,广泛应用于Web应用中,用于缓解数据库的负载。在Java环境中,我们常常使用Java客户端库来与Memcached服务器进行交互。这个文档将深入探讨"performance"分支的Java...

    memcached java简单实例

    在代码中,我们可以创建一个`MemcachedClient`实例,指定服务器的IP地址和端口: ```java import net.spy.memcached.MemcachedClient; import net.spy.memcached.AddrUtil; import ...

    Memcached学习笔记 — 第四部分:Memcached Java 客户端-gwhalin(1)-介绍及使用

    gwhalin的Memcached Java客户端是一个轻量级、高性能的库,使得Java开发者可以轻松地与Memcached服务器进行交互。 ### 一、Memcached简介 Memcached是Danga Interactive公司开发的一个开源项目,主要用于存储和检索...

    spring调用memcached client for java

    Memcached是一个高性能的分布式内存对象缓存系统,常用于减轻数据库负载,提升Web应用的响应速度。 首先,我们需要了解Spring的缓存抽象。Spring 3.1引入了缓存抽象,允许开发者通过简单的注解来实现缓存管理。它...

    java连接memcached示例代码

    Memcached是一款高性能、分布式内存对象缓存系统,用于减轻数据库负载,提高网站性能。下面我们将详细探讨如何在Java中使用Memcached以及相关知识点。 首先,我们需要引入一个Java库来与Memcached通信,例如...

    memcached-java链接所需jar包,以及java链接代码

    Memcached是一种高性能、分布式内存对象缓存系统,用于在分布式环境中快速存储和检索数据。它通过将数据存储在内存中,显著提高了数据访问速度。在Java应用中与Memcached进行交互,我们需要依赖特定的Java客户端库,...

    java使用memcached的实例

    在IT领域,尤其是在JavaWeb开发中,Memcached作为一种高性能、分布式的内存对象缓存系统,被广泛用于加速动态网络应用的加载速度。本文将详细解析如何在Java项目中使用Memcached,包括其配置方法以及一个具体的示例...

    java+memcached所需文件

    Java与Memcached结合使用可以构建高性能的分布式缓存系统,以提高Web应用程序的响应速度和数据处理能力。这里提供的文件包含在Windows环境下运行Memcached以及Java应用中集成Memcached所需的必要组件。 首先,我们...

    java使用memcached demo

    Memcached 是一个高性能、分布式的内存对象缓存系统,广泛应用于减轻数据库负载,提高Web应用的响应速度。在Java中,我们可以借助各种客户端库来与Memcached进行交互。本篇文章将深入探讨如何在Java项目中集成并使用...

Global site tag (gtag.js) - Google Analytics