`

netty简单的操作memcached

 
阅读更多

pom文件

 

 

<dependency>
    	<groupId>io.netty</groupId>
    	<artifactId>netty-example</artifactId>
    	<version>4.1.8.Final</version>
    	<exclusions>
    		<exclusion>
    			<artifactId>netty-tcnative</artifactId>
    			<groupId>io.netty</groupId>
    		</exclusion>
    	</exclusions>
    </dependency>
    <dependency>
    	<groupId>io.netty</groupId>
    	<artifactId>netty-tcnative</artifactId>
    	<version>1.1.33.Fork26</version>
    	<classifier>linux-x86_64-fedora</classifier>
    </dependency>
    <dependency>
    	<groupId>org.apache.commons</groupId>
    	<artifactId>commons-pool2</artifactId>
    	<version>2.4.2</version>
    </dependency>
    <dependency>
    	<groupId>junit</groupId>
    	<artifactId>junit</artifactId>
    	<version>4.4</version>
    </dependency>

 

 

package com.snailteam.netty.memcached;

import java.util.concurrent.atomic.AtomicInteger;

import io.netty.handler.codec.memcache.binary.FullBinaryMemcacheResponse;
import io.netty.util.CharsetUtil;
import junit.framework.Assert;

public class App {
	public static void main(String[] args) throws InterruptedException {
		NioSession session = new NioSession("127.0.0.1", 11211);
		AtomicInteger counter = new AtomicInteger(0);
		while (true) {
			FullBinaryMemcacheResponse res = null;
			String keyString = "user_id:" + counter.getAndIncrement();
			session.send(keyString, keyString);
			res = session.resp();
			session.get(keyString);
			res = session.resp();
			Assert.assertEquals(keyString, res.content().toString(CharsetUtil.UTF_8));
			if (counter.get() > 10000)
				break;
		}
		session.close();
	}
}

 

package com.snailteam.netty.memcached;

import java.net.InetSocketAddress;

import io.netty.bootstrap.Bootstrap;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.Channel;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.memcache.binary.BinaryMemcacheClientCodec;
import io.netty.handler.codec.memcache.binary.BinaryMemcacheObjectAggregator;
import io.netty.handler.codec.memcache.binary.BinaryMemcacheOpcodes;
import io.netty.handler.codec.memcache.binary.BinaryMemcacheRequest;
import io.netty.handler.codec.memcache.binary.DefaultBinaryMemcacheRequest;
import io.netty.handler.codec.memcache.binary.DefaultFullBinaryMemcacheRequest;
import io.netty.handler.codec.memcache.binary.FullBinaryMemcacheResponse;
import io.netty.handler.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;
import io.netty.util.CharsetUtil;

public class NioSession {
	private MemcachedProtocol protocol;
	private Channel channel;
	private Bootstrap boot;

	public NioSession(String host, int port) throws InterruptedException {
		protocol = new MemcachedProtocol();
		boot = new Bootstrap().group(new NioEventLoopGroup()).channel(NioSocketChannel.class)
				.option(ChannelOption.TCP_NODELAY, true).remoteAddress(new InetSocketAddress(host, port))
				.handler(new ChannelInitializer<SocketChannel>() {

					@Override
					protected void initChannel(SocketChannel ch) throws Exception {
						ch.pipeline().addLast(new LoggingHandler(LogLevel.DEBUG), new BinaryMemcacheClientCodec(),
								new BinaryMemcacheObjectAggregator(Integer.MAX_VALUE), protocol);
					}

				});

		channel = boot.connect().sync().channel();
	}

	void send(String keyString, String value) throws InterruptedException {
		ByteBuf key = Unpooled.wrappedBuffer(keyString.getBytes(CharsetUtil.UTF_8));
		ByteBuf content = Unpooled.wrappedBuffer(value.getBytes(CharsetUtil.UTF_8));
		ByteBuf extras = channel.alloc().buffer(8);
		extras.writeZero(8);
		BinaryMemcacheRequest req = new DefaultFullBinaryMemcacheRequest(key, extras, content);
		req.setOpcode(BinaryMemcacheOpcodes.SET);
		channel.writeAndFlush(req);

	}

	public FullBinaryMemcacheResponse resp() throws InterruptedException {
		return protocol.resp();
	}

	public void get(String keyString) throws InterruptedException {
		ByteBuf key = Unpooled.wrappedBuffer(keyString.getBytes(CharsetUtil.UTF_8));
		BinaryMemcacheRequest req = new DefaultBinaryMemcacheRequest(key);
		req.setOpcode(BinaryMemcacheOpcodes.GET);
		channel.writeAndFlush(req);
	}

	public void close() {
		if (channel != null && channel.isActive()) {
			channel.close();
		}
		if( protocol != null ) {
			protocol.wakeUpAll() ;
			protocol = null ;
		}
		channel = null;
		if (boot != null && boot.config() != null) {
			boot.config().group().shutdownGracefully();
		}
		boot = null;
	}
}

 

package com.snailteam.netty.memcached;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedTransferQueue;


import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.handler.codec.memcache.binary.FullBinaryMemcacheResponse;

public class MemcachedProtocol extends ChannelInboundHandlerAdapter {

	private BlockingQueue<FullBinaryMemcacheResponse> queue = new LinkedTransferQueue<FullBinaryMemcacheResponse>();

	@Override
	public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
		queue.add((FullBinaryMemcacheResponse) msg);
	}

	public FullBinaryMemcacheResponse resp() throws InterruptedException {
		return queue.take();
	}
	
	public void wakeUpAll() {
		while ( queue.poll() != null ) {
		}
		this.queue = null ;
	}
	
}

 

参考 https://github.com/fl061157/surf-memcached

 

分享到:
评论

相关推荐

    essential-netty-in-action

    此外,Netty中的高级主题包括实现自定义的编解码器和了解Memcached二进制协议。Netty还提供了对SSL/TLS加密和HTTP/HTTPS应用的支持,以及对空闲连接和超时的处理。 总的来说,Netty是一个功能强大、性能优秀的网络...

    SSM+Netty框架搭建

    还可以使用缓存技术(如Redis或Memcached)来缓存经常访问的数据,减少对数据库的直接访问。 总结来说,SSM+Netty框架搭建能够充分利用SSM的业务处理能力和Netty的网络通信优势,实现高效的服务器端数据获取和传输...

    essential-netty-in-action.pdf

    书中通过一个简单的echo服务器和客户端的例子,向开发者展示了如何编写、编译和运行一个Netty应用。这个例子覆盖了Netty应用的基本结构,包括Channel(通道)、EventLoop(事件循环)、以及I/O操作。 Netty中的...

    netty-in-action中文版

    - **写一个echo服务器**:通过实现简单的回显服务器来展示Netty的基本使用方法。 - **写一个echo客户端**:与回显服务器相对应,客户端同样重要,用于测试服务器的功能。 - **编译和运行Echo服务器和客户端**:详细...

    netty-in-action.pdf

    通过以上内容的介绍,我们可以看出Netty不仅仅是一个简单的网络库,它还包含了大量高级特性和优化方案,使得开发者能够构建出既高效又可靠的网络应用程序。无论是新手还是有经验的开发者,都能够从Netty中获益良多。

    Netty+Spring Boot仿微信 全栈开发高性能后台及客户端

    例如,通过使用Netty的NIO模型减少线程开销,利用Spring Boot的Actuator监控应用性能,以及引入Redis或Memcached进行缓存加速。 6. 安全性: 在仿微信的开发中,安全性尤为重要,包括数据传输的安全(HTTPS、JWT等...

    MemcachedClient4J:它是 java 的 memcached 客户端

    一个使用netty框架编写的mecached客户端,实现mecached ASCII协议,性能超过Spymecached。 有许多功能和扩展是完美的。 提供同步和异步两种接口,使用方法非常简单,示例如下: MemcachedClient memcachedClient ...

    Netty基础应用实战.docx

    总的来说,Netty 是一个强大的工具,它简化了网络编程,提供了丰富的功能,适用于各种网络应用的开发,无论是简单的小型项目还是复杂的大型系统,Netty都能提供强大的支持。通过深入理解和实践,开发者可以充分利用...

    memcached-session-manager tomcat7

    `spymemcached-2.11.1.jar`包含了`MemcachedClient`类,它是连接到Memcached服务器并执行操作的主要接口。`couchbase-client-1.4.0.jar`虽然在文件列表中,但在这里并不是必需的,因为Couchbase是另一种NoSQL数据库...

    tomcate7+memcached所需jar包

    commons-codec-1.5.jar couchbase-client-1.4.0.jar ... javolution-5.4.3.1.jar jettison-1.3.jar kryo-1.04.jar kryo-serializers-0.10.jar... netty-3.5.5.Final.jar reflectasm-0.9.jar spymemcached-2.11.1.jar

    memcached需要的jar包

    综上所述,集成Memcached与Tomcat7主要涉及下载和添加spymemcached及其可能的依赖jar包,然后在代码中创建和使用MemcachedClient进行数据缓存操作。记住,根据项目需求,你可能需要调整配置和优化性能。同时,良好的...

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

    3. `netty-3.9.9.Final.jar`:Spymemcached使用的NIO库,提供非阻塞I/O支持。 配置Tomcat以使用`memcached-session-manager`,你需要修改`conf/server.xml`文件中的`&lt;Engine&gt;`或`&lt;Host&gt;`标签。添加一个名为`...

    tomcat7整合memcached所需jar包

    5. **测试**:启动Tomcat,运行你的应用,验证是否能成功连接到Memcached并进行数据操作。 **注意事项** - 在生产环境中,务必对Memcached进行适当的监控和管理,以保证其稳定性和性能。 - 需要考虑缓存一致性问题...

    memcached用到的包

    Spymemcached提供了简单易用的API,支持异步操作和自动序列化。在项目中,我们可以通过添加spymemcached.jar来实现与Memcached服务器的交互。 2. **XMemcached**:另一个Java Memcached客户端,它提供了更丰富的...

    memcached+tomcat整合所需jar包.zip

    由于其简单的设计和高效的内存管理,Memcached能提供非常高的并发读写性能。 2. **Tomcat简介**:Tomcat是Java Servlet和JavaServer Pages(JSP)的开源实现。它作为一个轻量级应用服务器,广泛用于部署Java Web...

    netty-codec-memcache-4.1.73.Final-API文档-中文版.zip

    赠送jar包:netty-codec-memcache-4.1.73.Final.jar; 赠送原API文档:netty-codec-memcache-4.1.73.Final-javadoc.jar; 赠送源代码:netty-codec-memcache-4.1.73.Final-sources.jar; 赠送Maven依赖信息文件:...

    apache-tomcat-7.0.54+memcached+nginx

    - 其他依赖:可能还需要包括如slf4j、netty等依赖库,以支持通信和日志功能。 配置memcached与Tomcat的集成,你可能需要: 1. 创建自定义`Manager`扩展`DeltaManager`,并实现会话数据到memcached的存储和检索。 2....

    spring集成memcached

    SpyMemcached在内部使用了Netty框架来实现异步通信,从而提高了处理效率。 2. **XMemcached**:针对高并发场景进行了特别优化,支持多种缓存算法和一致性哈希等功能。XMemcached还提供了一个灵活的API,允许开发者...

    分布式缓存 Redis + Memcached 经典面试题!.zip

    - Memcached 的设计更简单,没有 Redis 的多种数据结构,因此内存管理和操作更高效。 - Memcached 仅支持 ASCII 协议,而 Redis 使用二进制协议,对于某些操作,ASCII 协议可能效率较低。 6. **如何解决 Redis 的...

    Memcached客户端手册

    - **配置与启动**:通常情况下,Memcached可以通过简单的命令行启动,如 `memcached -m 64 -p 11211 -u nobody -l 127.0.0.1`。 #### 基础操作 - **存储数据**:使用`set`命令将键值对存储到Memcached中,例如 `set...

Global site tag (gtag.js) - Google Analytics