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

mina 实现与memcached 连接工具

    博客分类:
  • java
阅读更多
前段时间学习了mina框架.就确定写一个小实例玩一下.
看到不少开源第三方的memcached连接工具(xmemcached),都采用NIO方式.
于是就有了一个想法用mina作为底层NIO框架与memcached连接.
希望能给学习Mina的新人帮助.
能力有限项目还没有很好完善.不过基本的相关操作已实现.
如果大家有兴趣和我一起完善这个项目,请站内信联络.
源码(svn):
http://asksite.googlecode.com/svn/trunk/minamemcahed

测试类及相关API调用
public class CacheTest {

	static MinaConnect mc = null;

	static LinkedList<CacheFilter> filterList = new LinkedList<CacheFilter>();

	@BeforeClass
	public static void init() {

		List<MemCachedAddress> addreeList = new ArrayList<MemCachedAddress>();

		//memcached server ip address and port
		InetSocketAddress address1 = new InetSocketAddress("127.0.0.1", 11211);

		InetSocketAddress address2 = new InetSocketAddress("192.168.1.105",11212);

		//add memcached server
		addreeList.add(new MemCachedAddress(address1, 3));

		addreeList.add(new MemCachedAddress(address2, 7));

		mc = new MinaConnect(addreeList);

		//start connect
		mc.connect();
	}

	@AfterClass
	public static void destory() {
		mc.shutDown();
	}

	@Test
	@Ignore
	public void testSet() throws Exception {
		User user = new User();
		user.setId(1);
		user.setName("tina");
		boolean result = mc.set("name", 0, user);
		System.out.println(result);

	}

	@Test
	public void testGet() throws Exception {
		User user = (User) mc.get("name");
		System.out.println(user.getName());
		/*
		 * user = (User) mc.get("user2"); System.out.println(user.getName());
		 * user = (User) mc.get("user3"); System.out.println(user.getName());
		 */
	}

	@Test
	@Ignore
	public void testReplace() throws Exception {
		User user = new User();
		user.setId(1);
		user.setName("replacetest");
		boolean result = mc.replace("test2", 10000, user);
		System.out.println(result);
	}

	@Test
	@Ignore
	public void testDelete() throws Exception {
		boolean result = mc.delete("test2");
		System.out.println(result);
	}

	@Test
	@Ignore
	public void testIncr() throws Exception {
		long i = mc.incr("incrtest", 2);
		System.out.println(i);
	}

	
	@Test
	@Ignore
	public void testGets() throws Exception {

		User[] users = new User[10];

		for (int i = 0; i < users.length; i++) {
			users[i] = new User();
			users[i].setId(i);
			users[i].setName("test" + i);

			if (i == 3) {
				InetSocketAddress address2 = new InetSocketAddress(
						"192.168.1.105", 11212);
				mc.removeServer(address2);
			}

			boolean result = mc.set("user" + i, 0, users[i]);

			System.out.println(result);
		}

		List<String> list = new ArrayList<String>();

		for (int i = 0; i < 10; i++) {
			list.add("user" + i);
		}

		Map<String, Object> map = mc.gets(list);

		Iterator<String> keySet = map.keySet().iterator();

		while (keySet.hasNext()) {
			User user = (User) map.get(keySet.next());
			System.out.println(user.getName());
		}
	}

	@Test
	@Ignore
	public void testSomeNoreplay() throws Exception {

		
		User pan = (User) mc.get("test");

		System.out.println(pan.getName());

	}

	
}


spring 定义服务
	
<bean id="minaBean"
		class="com.memcached.spring.MinaMemcachedFactoryBean">
		<property name="address">
			<list>
				<value>127.0.0.1:11211</value>
			</list>
		</property>
		
		<property name="weights">
		    <list>
		        <value>3</value>
		    </list>
		</property>
	</bean>


相关jar依赖 mina 和 mina依赖的jar 包
jar包在附件中
分享到:
评论
9 楼 yin_bp 2010-03-23  
有空看看开源bbossgroups项目中基于mina协议的rpc调用框架

很实用也很简单:
1.客服端和服务端配置以下组件(基于bboss-aop框架):
<property name="rpc.test" singlable="true" class="org.frameworkset.spi.remote.RPCTest"/>
2.获取远程组件实例
         单点调用

RPCTestInf testInf = (RPCTestInf)BaseSPIManager.getBeanObject("(mina::172.16.17.216:1186)/rpc.test");

         多点调用

RPCTestInf testInf = (RPCTestInf)BaseSPIManager.getBeanObject("(mina::192.168.11.102:1186;192.168.11.102:12346)/rpc.test");

         组播调用

RPCTestInf testInf = (RPCTestInf)BaseSPIManager.getBeanObject("(mina::all)/rpc.test");



         单点调用-传递认证信息

RPCTestInf testInf = (RPCTestInf)BaseSPIManager.getBeanObject("(mina::172.16.17.216:1186)/rpc.test?user=admin&password=123456");

         多点调用-传递认证信息

RPCTestInf testInf = (RPCTestInf)BaseSPIManager.getBeanObject("(mina::192.168.11.102:1186;192.168.11.102:12346)/rpc.test?user=admin&password=123456");

         组播调用-传递认证信息

RPCTestInf testInf = (RPCTestInf)BaseSPIManager.getBeanObject("(mina::all)/rpc.test?user=admin&password=123456");


3.远程方法调用
Object count = testInf.getCount();

4.调用结果处理
单点调用的结果就是服务接口返回的值,无需处理。如果方法调用失败,系统将抛出具体的远程异常。

多点调用和组播调用的结果处理方法一样,以多点调用为例:

RPCTestInf testInf = (RPCTestInf)BaseSPIManager.getBeanObject("(mina::192.168.11.102:1186;192.168.11.102:12346)/rpc.test?User=admin&password=123456");

Object count = testInf.getCount();

Object count = testInf.getCount();

获取192.168.11.102:1186返回的结果:

Object count_1186 = BaseSPIManager.getRPCResult("192.168.11.102", "1186", count);如果返回值是异常,那么直接抛出该异常。

或者

Object count_1186 = BaseSPIManager.getMinaRPCResult

("192.168.11.102:1186", count);如果返回值是异常,那么直接抛出该异常。

或者

Object count_1186 =

    BaseSPIManager.getRPCResult("192.168.11.102:1186", count,

org.frameworkset.remote.Target.BROADCAST_TYPE_MINA);  如果返回值是异常,那么直接抛出该异常。

获取192.168.11.102:12346返回的结果:

Object count_12346 = BaseSPIManager.getRPCResult("192.168.11.102", "12346", count); 如果返回值是异常,那么直接抛出该异常。

或者

Object count_12346 = BaseSPIManager.getMinaRPCResult

("192.168.11.102:12346", count);

或者

Object count_12346 =

    BaseSPIManager.getRPCResult("192.168.11.102:12346", count,

org.frameworkset.remote.Target.BROADCAST_TYPE_MINA);  如果返回值是异常,那么直接抛出该异常。

很简单吧
详细信息参考博客文章:
http://blog.csdn.net/yin_bp/archive/2010/03/20/5398418.aspx
bbossgroups项目下载地址:
https://sourceforge.net/projects/bboss/files/
8 楼 pan_java 2010-02-28  
有空学习一下netty.
7 楼 nicky_hk 2010-02-28  
nishizhutou 写道
pan_java 写道
lvgang 写道
jboss 的 netty 也不错

好像听说过比mina的性能还要好,不知稳定性怎么样.


我记得都是同一个作者。

是一个韩国人,trustin Lee。我最近在看netty的源代码,觉得netty的建模比较好
6 楼 tapestry1122 2010-02-26  
nishizhutou 写道
pan_java 写道
lvgang 写道
jboss 的 netty 也不错

好像听说过比mina的性能还要好,不知稳定性怎么样.


我记得都是同一个作者。


都是lee写的,不过netty3性能确实比mina好

plurk的comet server就是用netty3实现的
引用

Using Netty we have comet running on 100.000+ open connections - this uses some GB of memory and 20% of CPU on a quad core server. I.e. we have solved the C10k * 10 problem using non-blocking technology and some pretty impressive libraries (namely Java NIO and Netty).

A big kudos goes to Trustin Lee for his amazing work on Netty!

5 楼 nishizhutou 2010-02-25  
pan_java 写道
lvgang 写道
jboss 的 netty 也不错

好像听说过比mina的性能还要好,不知稳定性怎么样.


我记得都是同一个作者。
4 楼 pan_java 2010-02-25  
lvgang 写道
jboss 的 netty 也不错

好像听说过比mina的性能还要好,不知稳定性怎么样.
3 楼 lvgang 2010-02-25  
jboss 的 netty 也不错
2 楼 pan_java 2010-02-25  
memcached 写道
构思不错,正学习Mina有用.

希望对你有用,多提建议.
1 楼 memcached 2010-02-25  
构思不错,正学习Mina有用.

相关推荐

    基于mina的一个Memcached客户端首发

    3. **MINA客户端实现**:阐述如何使用MINA建立与Memcached服务器的连接,创建自定义的协议解码器和编码器来处理通信过程。 4. **数据序列化与反序列化**:在Memcached中存储的对象通常需要进行序列化,讨论如何选择...

    java 有用的jar包

    本压缩包中的"有用的jar包"涉及了几个关键领域的库:MySQL数据库连接、Memcached缓存处理、Apache MINA网络通信框架以及JSON数据序列化。下面将详细解释这些jar包所涵盖的知识点。 1. MySQL JDBC驱动: MySQL JDBC...

    java开源包4

    BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加...

    java开源包3

    BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加...

    人人网使用的开源软件列表.pdf

    Tokyo Tyrant则作为Tokyo Cabinet的网络接口,支持Memcached传输协议,负责网络连接和协议解析,与Tokyo Cabinet配合实现网络存储功能。 ICE(Internet Communications Engine)是一个跨语言的网络通信框架,提供了...

    JAVA上百实例源码以及开源项目源代码

    Java实现的FTP连接与数据浏览程序 1个目标文件 摘要:Java源码,网络相关,FTP Java实现的FTP连接与数据浏览程序,实现实例化可操作的窗口。 部分源代码摘录: ftpClient = new FtpClient(); //实例化FtpClient对象 ...

    java开源包1

    BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加...

    java开源包11

    BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加...

    java开源包2

    BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加...

    java开源包6

    BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加...

    java开源包5

    BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加...

    java开源包10

    BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加...

    java开源包8

    BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加...

    java开源包7

    BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加...

    java开源包9

    BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加...

    java开源包101

    BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加...

    Java资源包01

    BoneCP 是一个高性能的开源java数据库连接池实现库。它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现,BoneCP是最快的连接池。BoneCP很小,只有四十几K(运行时需要slf4j和guava的支持,这二者加...

    Dubbo 30道面试题及答案.docx

    基于Zookeeper的临时节点特性,当服务提供者断开连接时,临时节点消失,从而实现服务剔除。 7. **版本管理和服务调用链问题** 通过多版本开发避免影响旧版本服务;使用分布式服务追踪工具如Zipkin来解决调用链过...

Global site tag (gtag.js) - Google Analytics