`

MemCachedClient for java

    博客分类:
  • java
阅读更多
memcache的java客户端com.danga.MemCached.MemCachedClient的实现过程
其实很简单,就是一个socket通信过程
最后附上一个山寨版本的MemCachedClient
 
SockIOPool负责管理socket的pools
SockIO是SockIOPool的一个内部类,功能相当于Socket,可以读写数据
MaintThread是SockIOPool内部类,负责pool的runing和stop
MemCachedClient客户端调用类,拥有各种memcached的操作
NIOLoader是MemCachedClient的内部类,负责各种批量操作
 
 

以下是其实现中的一些罗列点

1.SockIOPool.getInstance()是取得名为default的pool
2.简单的一个创建SockIOPool 初始化pool
String[] serverlist = { "cache0.server.com:12345", "cache1.server.com:12345" };
SockIOPool pool = SockIOPool.getInstance();
pool.setServers(serverlist);
pool.initialize();
3.MemCachedClient mcc = new MemCachedClient();就可以使用mcc了
4.get时的socket,向memcache服务器发送socket请求
  String cmd = "get " + key + "\r\n";
  sock.write( cmd.getBytes() );
  sock.flush();
5.getMulti时,按不同的host,组装成get key1 key2,再向服务端发送socket请求
   if ( !cmdMap.containsKey( sock.getHost() ) )
    {
      cmdMap.put( sock.getHost(), new StringBuilder( "get" ) );
    }
    cmdMap.get( sock.getHost() ).append( " " + cleanKey );
6.NATIVE_HASH模式下取得server(另外它还支持OLD_COMPAT_HASH ,NEW_COMPAT_HASH ,CONSISTENT_HASH)
  (long)key.hashCode()再取模
7.初始化socket
  SocketChannel sock = SocketChannel.open();
  sock.socket().connect( new InetSocketAddress( host, port ), timeout );
  return sock.socket();
8.省略N点

下面是一个山寨的MemCachedClient的实现

import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 简单的MemcachedClient
 * 
 * @author gaoliang
 * @date 2011-3-11
 */
public class MemcachedClient {

	public static void main(String[] args) {
		MemcachedClient client = new MemcachedClient(new String[] {
				"127.0.0.1:11211", "127.0.0.1:12000" });
		client.add("aa", "aa");
		System.out.println(client.get("aa"));
		client.set("aa", "bb");
		System.out.println(client.get("aa"));
		client.replace("aa", "cc");
		System.out.println(client.get("aa"));
		client.delete("aa");
		System.out.println(client.get("aa"));
	}

	private Map<String, Socket> socketMap = new HashMap<String, Socket>();
	private List<String> hosts = new ArrayList<String>();
	private int num = 0; // 服务器数量

	public MemcachedClient(String[] servers) {
		init(servers);// 初始化并创建socket连接
	}

	public boolean add(String key, Object obj) {
		return Boolean.valueOf(write("add", key, obj, null));
	}

	public boolean add(String key, Object obj, Date date) {
		return Boolean.valueOf(write("add", key, obj, date));
	}

	public Object get(String key) {
		return write("get", key, null, null);
	}

	public boolean delete(String key) {
		return Boolean.valueOf(write("delete", key, null, null));

	}

	public boolean replace(String key, Object obj) {
		return Boolean.valueOf(write("replace", key, obj, null));
	}

	public boolean set(String key, Object obj) {
		return Boolean.valueOf(write("set", key, obj, null));
	}

	public Map<String,Object> getMulti(String[] keys){
		//省略100字
		//拼接get a b c
		//对返回的value做判断
		return null;
	}
	
	// 初始化并创建socket连接
	private void init(String[] servers) {
		try {
			for (String server : servers) {
				if (server.contains(":")) {
					String[] strs = server.split(":");
					socketMap.put(strs[0], new Socket(strs[0], Integer
							.valueOf(strs[1])));
					hosts.add(strs[0]);
					num++;
				}
			}
		} catch (Exception e) {
			System.out.println("init error");
		}
	}

	// 按hash取server的socket连接
	private Socket getSocket(String key) {
		int t = key.hashCode() % num;
		return socketMap.get(hosts.get(t));
	}

	// 向server发送命令,并返回结果
	private String write(String cmd, String key, Object obj, Date date) {
		byte[] value = null;
		if (obj != null) {
			value = obj.toString().getBytes();
		}
		
		//命令字符串
		String cmdStr = "";
		if ("add".equals(cmd) || "set".equals(cmd) || "replace".equals(cmd)) {
			cmdStr = String.format("%s %s %d %d %d\r\n", cmd, key, 32,
					date != null ? date.getTime() / 1000 : 0, value.length);
		}
		if ("get".equals(cmd)) {
			cmdStr = String.format("%s %s\r\n", cmd, key);
		}
		if ("delete".equals(cmd)) {
			cmdStr = String.format("%s %s\r\n", cmd, key);
		}
		Socket socket = getSocket(key);
		return getResponse(cmd, obj, cmdStr, socket);
	}

	//从数据器读取数据
	private String getResponse(String cmd, Object obj, String cmdStr,
			Socket socket) {

		try {
			BufferedOutputStream out = new BufferedOutputStream(socket
					.getOutputStream());
			DataInputStream in = new DataInputStream(socket.getInputStream());
			out.write(cmdStr.getBytes());
			if (obj != null) {
				out.write(obj.toString().getBytes());
				out.write("\r\n".getBytes());
			}
			out.flush();

			String response = readLine(in);
			if (("add".equals(cmd) || "set".equals(cmd) || "replace"
					.equals(cmd))
					&& "STORED".equals(response)) {
				return "TRUE";
			}
			if (("get".equals(cmd))) {
				if (response.contains("VALUE")) {
					String str = readLine(in);
					readLine(in);
					return str;
				} else {
					return null;
				}
			}
			if (("delete".equals(cmd)) && "DELETED".equals(response)) {
				return "TRUE";
			}
		} catch (Exception e) {
			System.out.println("write error");
			return "FALSE";
		}
		return "FALSE";
	}

	public String readLine(DataInputStream in) throws IOException {

		byte[] b = new byte[1];
		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		boolean eol = false;

		while (in.read(b, 0, 1) != -1) {
			if (b[0] == 13) {
				eol = true;
			} else {
				if (eol) {
					if (b[0] == 10)
						break;

					eol = false;
				}
			}
			bos.write(b, 0, 1);
		}

		return bos.toString().trim();
	}
}
 
分享到:
评论

相关推荐

    memcached client for java

    memcached的java客户端jar包,方便调用memcached的服务

    spring调用memcached client for java

    标题 "spring调用memcached client for java" 涉及的是如何在Java应用程序中,特别是Spring框架下,集成和使用Memcached作为缓存系统。Memcached是一个高性能的分布式内存对象缓存系统,常用于减轻数据库负载,提升...

    基于memcached client for java的cache封装

    本主题将深入探讨如何基于Java客户端对Memcached进行封装,以便更高效地在Java应用中使用它。 首先,我们需要理解Java中的Memcached客户端库,如spymemcached或xmemcached。这两个库都提供了与Memcached服务器通信...

    memcached for java client 例子

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

    Spring memcached 源码

    要配置Spring Memcached,我们需要在Spring的配置文件(如`applicationContext.xml`)中声明`MemcachedClient`。这通常涉及到以下步骤: 1. 引入依赖:在`pom.xml`或`build.gradle`中添加`spring-memcached`的依赖...

    memcached安装包以及MemCachedClient

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

    spring集成memcached

    1. **MemcachedClient for Java**:这是一种较早出现的客户端,以其稳定性和广泛应用而著称。 2. **SpyMemcached**:相比于MemcachedClient for Java,它在性能上有一定的优化。 3. **XMemcached**:该客户端在并发...

    Xmemcached测试实例

    测试类包括Xmemcached客户端与memcached client for java两者,可运行比较性能。 XMemcached简介: XMemcached是基于 java nio的Memcached客户端,java nio相比于传统阻塞 io 模型来说,有 效率高(特别在高并发下...

    memcached java client

    本篇文章将详细介绍两个常用的Java Memcached客户端:xmemcached和memcache-client-forjava。 **1. xmemcached** xmemcached是由Ketoo开发的一个高性能、高可用性的Java Memcached客户端。它提供了丰富的API,支持...

    Memcached java的使用实例

    MemcachedClient client = new MemcachedClient(new InetSocketAddress("localhost", 11211)); // 这里的"localhost"和"11211"是默认的Memcached服务器地址和端口 } catch (IOException e) { e.printStackTrace...

    Xmemcached memcached 实例

    类包括Xmemcached客户端实现和builder实现以及memcached client for java实现,对初学者有借鉴作用,特别是在开发简单例子时出现的超时情况的可以看看是否是同本事例相同。 xmemcached time out 5000 1000

    第八章 企业项目开发--分布式缓存memcached1

    官方提供的Memcached Client for Java基于Java BIO实现,SpyMemcached和XMemcached则是基于Java NIO的实现,其中XMemcached在并发性能上表现更优,SpyMemcached也有不错的性能。在实际应用中,可以根据项目需求选择...

    Memcache原理及实现

    - 客户端库:对于Java开发,常用的客户端库是memcached client for java(也称为spymemcached),它提供方便的API接口,便于Java应用程序与Memcache服务器进行通信。 - 其他依赖:在Windows环境下,可以下载预编译...

    java连接memcached示例代码

    MemcachedClient client = new MemcachedClient( new ConnectionFactoryBuilder().setProtocol(DefaultConnectionFactory.Protocol.BINARY) .build(), AddrUtil.getAddresses("127.0.0.1:11211")); // 假设...

    普通java工程测试java使用memcached连接服务端

    MemcachedClient memcachedClient = new MemcachedClient(new InetSocketAddress("localhost", 11211)); } catch (IOException e) { e.printStackTrace(); } ``` 一旦连接建立,我们就可以进行基本的存取操作。...

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

    MemcachedClient client = new MemcachedClient(AddrUtil.getAddresses("localhost:11211")); // 存储一个键值对 client.set("key", 60, "value"); // key: 键,60: 超时时间(秒),value: 值 // 获取存储的...

    memcached for java

    由memcached开发人员维护的一个 java客户端,效率比较高,比较稳定

    java_memcached-release_2.5.1

    这次主要的优化工作还是在三个方面:应用服务器(Apache,JBoss)配置,业务流程,Cache Client包(http://code.google.com/p/memcache-client-forjava/ )。这里把过去和这次优化对于Cache的使用作一个经验分享,...

    java遍历Memcache详细代码

    MemcachedClient memcachedClient = new MemcachedClient(AddrUtil.getAddresses("127.0.0.1:11211")); // 获取所有键 String[] keys = memcachedClient.getKeys(); // 遍历所有键并打印其值 for (String key...

Global site tag (gtag.js) - Google Analytics