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
相关推荐
此外,Netty中的高级主题包括实现自定义的编解码器和了解Memcached二进制协议。Netty还提供了对SSL/TLS加密和HTTP/HTTPS应用的支持,以及对空闲连接和超时的处理。 总的来说,Netty是一个功能强大、性能优秀的网络...
还可以使用缓存技术(如Redis或Memcached)来缓存经常访问的数据,减少对数据库的直接访问。 总结来说,SSM+Netty框架搭建能够充分利用SSM的业务处理能力和Netty的网络通信优势,实现高效的服务器端数据获取和传输...
书中通过一个简单的echo服务器和客户端的例子,向开发者展示了如何编写、编译和运行一个Netty应用。这个例子覆盖了Netty应用的基本结构,包括Channel(通道)、EventLoop(事件循环)、以及I/O操作。 Netty中的...
- **写一个echo服务器**:通过实现简单的回显服务器来展示Netty的基本使用方法。 - **写一个echo客户端**:与回显服务器相对应,客户端同样重要,用于测试服务器的功能。 - **编译和运行Echo服务器和客户端**:详细...
通过以上内容的介绍,我们可以看出Netty不仅仅是一个简单的网络库,它还包含了大量高级特性和优化方案,使得开发者能够构建出既高效又可靠的网络应用程序。无论是新手还是有经验的开发者,都能够从Netty中获益良多。
例如,通过使用Netty的NIO模型减少线程开销,利用Spring Boot的Actuator监控应用性能,以及引入Redis或Memcached进行缓存加速。 6. 安全性: 在仿微信的开发中,安全性尤为重要,包括数据传输的安全(HTTPS、JWT等...
一个使用netty框架编写的mecached客户端,实现mecached ASCII协议,性能超过Spymecached。 有许多功能和扩展是完美的。 提供同步和异步两种接口,使用方法非常简单,示例如下: MemcachedClient memcachedClient ...
总的来说,Netty 是一个强大的工具,它简化了网络编程,提供了丰富的功能,适用于各种网络应用的开发,无论是简单的小型项目还是复杂的大型系统,Netty都能提供强大的支持。通过深入理解和实践,开发者可以充分利用...
`spymemcached-2.11.1.jar`包含了`MemcachedClient`类,它是连接到Memcached服务器并执行操作的主要接口。`couchbase-client-1.4.0.jar`虽然在文件列表中,但在这里并不是必需的,因为Couchbase是另一种NoSQL数据库...
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与Tomcat7主要涉及下载和添加spymemcached及其可能的依赖jar包,然后在代码中创建和使用MemcachedClient进行数据缓存操作。记住,根据项目需求,你可能需要调整配置和优化性能。同时,良好的...
3. `netty-3.9.9.Final.jar`:Spymemcached使用的NIO库,提供非阻塞I/O支持。 配置Tomcat以使用`memcached-session-manager`,你需要修改`conf/server.xml`文件中的`<Engine>`或`<Host>`标签。添加一个名为`...
5. **测试**:启动Tomcat,运行你的应用,验证是否能成功连接到Memcached并进行数据操作。 **注意事项** - 在生产环境中,务必对Memcached进行适当的监控和管理,以保证其稳定性和性能。 - 需要考虑缓存一致性问题...
Spymemcached提供了简单易用的API,支持异步操作和自动序列化。在项目中,我们可以通过添加spymemcached.jar来实现与Memcached服务器的交互。 2. **XMemcached**:另一个Java Memcached客户端,它提供了更丰富的...
由于其简单的设计和高效的内存管理,Memcached能提供非常高的并发读写性能。 2. **Tomcat简介**:Tomcat是Java Servlet和JavaServer Pages(JSP)的开源实现。它作为一个轻量级应用服务器,广泛用于部署Java Web...
赠送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依赖信息文件:...
- 其他依赖:可能还需要包括如slf4j、netty等依赖库,以支持通信和日志功能。 配置memcached与Tomcat的集成,你可能需要: 1. 创建自定义`Manager`扩展`DeltaManager`,并实现会话数据到memcached的存储和检索。 2....
SpyMemcached在内部使用了Netty框架来实现异步通信,从而提高了处理效率。 2. **XMemcached**:针对高并发场景进行了特别优化,支持多种缓存算法和一致性哈希等功能。XMemcached还提供了一个灵活的API,允许开发者...
- Memcached 的设计更简单,没有 Redis 的多种数据结构,因此内存管理和操作更高效。 - Memcached 仅支持 ASCII 协议,而 Redis 使用二进制协议,对于某些操作,ASCII 协议可能效率较低。 6. **如何解决 Redis 的...
- **配置与启动**:通常情况下,Memcached可以通过简单的命令行启动,如 `memcached -m 64 -p 11211 -u nobody -l 127.0.0.1`。 #### 基础操作 - **存储数据**:使用`set`命令将键值对存储到Memcached中,例如 `set...