Jedis是官方推荐的连接redius的客户端,之所以没有使用redis的jdbc的原因是:
1) redis的jdbc的set方法有问题,set字符串,但是取出来的却是字符串长度
2)redis的jdbc的性能低并且不稳定,网上有人做测试证明过。
1.准备好需要的jar包
- spring.jar //spring包
- netty-3.2.4.Final.jar // netty库
- commons-dbcp.jar // dbcp数据库连接池
- mysql-connector-java-5.1.6.jar // dbcp数据库连接池需要依赖
- commons-logging.jar //spring.jar需要依赖
- commons-pool.jar // dbcp数据库连接池需要依赖
- jedis-2.0.0.jar //jedis包
2.新建java工程TestNettyServer并添加spring
3.注入jedis
3.1构建访问redis通用类
在RedisUtil.java里加入
- import redis.clients.jedis.ShardedJedis;
- import redis.clients.jedis.ShardedJedisPool;
- /**
- * 连接和使用数据库资源的工具类
- *
- * @author yifangyou
- * @version IAM 2011-07-27
- */
- public class RedisUtil {
- /**
- * 数据源
- */
- private ShardedJedisPool shardedJedisPool;
- /**
- * 获取数据库连接
- * @return conn
- */
- public ShardedJedis getConnection() {
- ShardedJedis jedis=null;
- try {
- jedis=shardedJedisPool.getResource();
- } catch (Exception e) {
- e.printStackTrace();
- }
- return jedis;
- }
- /**
- * 关闭数据库连接
- * @param conn
- */
- public void closeConnection(ShardedJedis jedis) {
- if (null != jedis) {
- try {
- shardedJedisPool.returnResource(jedis);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- /**
- * 设置数据
- * @param conn
- */
- public boolean setData(String key,String value) {
- try {
- ShardedJedis jedis=shardedJedisPool.getResource();
- jedis.set(key,value);
- shardedJedisPool.returnResource(jedis);
- return true;
- } catch (Exception e) {
- e.printStackTrace();
- }
- return false;
- }
- /**
- * 获取数据
- * @param conn
- */
- public String getData(String key) {
- String value=null;
- try {
- ShardedJedis jedis=shardedJedisPool.getResource();
- value=jedis.get(key);
- shardedJedisPool.returnResource(jedis);
- return value;
- } catch (Exception e) {
- e.printStackTrace();
- }
- return value;
- }
- /**
- * 设置连接池
- * @return 数据源
- */
- public void setShardedJedisPool(ShardedJedisPool shardedJedisPool) {
- this.shardedJedisPool = shardedJedisPool;
- }
- /**
- * 获取连接池
- * @return 数据源
- */
- public ShardedJedisPool getShardedJedisPool() {
- return shardedJedisPool;
- }
- }
3.2HttpRequestHandler注入jedis
在applicationContext.xml里加入
- <!-- POOL配置 -->
- <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
- <property name="maxActive" value="20" />
- <property name="maxIdle" value="10" />
- <property name="maxWait" value="1000" />
- <property name="testOnBorrow" value="true"/>
- </bean>
- <!-- jedis shard信息配置 -->
- <bean id="jedis.shardInfo" class="redis.clients.jedis.JedisShardInfo">
- <constructor-arg index="0" value="122.49.26.60" />
- <constructor-arg index="1" value="6379" />
- </bean>
- <!-- jedis shard pool配置 -->
- <bean id="shardedJedisPool" class="redis.clients.jedis.ShardedJedisPool">
- <constructor-arg index="0" ref="jedisPoolConfig" />
- <constructor-arg index="1">
- <list>
- <ref bean="jedis.shardInfo" />
- </list>
- </constructor-arg>
- </bean>
- <bean id="redisUtil" class="org.jboss.netty.example.http.snoop.RedisUtil">
- <property name="shardedJedisPool" ref="shardedJedisPool" />
- </bean>
- <bean id="httpServerPipelineFactory" class="org.jboss.netty.example.http.snoop.HttpServerPipelineFactory" scope="prototype">
- <property name="httpRequestHandler" ref="httpRequestHandler" />
- </bean>
- <bean id="httpRequestHandler" class="org.jboss.netty.example.http.snoop.HttpRequestHandler" scope="prototype">
- <property name="databaseUtil" ref="databaseUtil" />
- <property name="redisUtil" ref="redisUtil" />
- </bean>
4.测试
访问
http://127.0.0.1:8081/sfds?username=yifangyou
源码下载:http://down.51cto.com/data/229434
修改HttpRequestHandler.java
- package org.jboss.netty.example.http.snoop;
- import static org.jboss.netty.handler.codec.http.HttpHeaders.*;
- import static org.jboss.netty.handler.codec.http.HttpHeaders.Names.*;
- import static org.jboss.netty.handler.codec.http.HttpResponseStatus.*;
- import static org.jboss.netty.handler.codec.http.HttpVersion.*;
- import java.sql.Connection;
- import java.sql.PreparedStatement;
- import java.sql.ResultSet;
- import java.util.List;
- import java.util.Map;
- import java.util.Map.Entry;
- import java.util.Set;
- import org.jboss.netty.buffer.ChannelBuffer;
- import org.jboss.netty.buffer.ChannelBuffers;
- import org.jboss.netty.channel.ChannelFuture;
- import org.jboss.netty.channel.ChannelFutureListener;
- import org.jboss.netty.channel.ChannelHandlerContext;
- import org.jboss.netty.channel.ExceptionEvent;
- import org.jboss.netty.channel.MessageEvent;
- import org.jboss.netty.channel.SimpleChannelUpstreamHandler;
- import org.jboss.netty.handler.codec.http.Cookie;
- import org.jboss.netty.handler.codec.http.CookieDecoder;
- import org.jboss.netty.handler.codec.http.CookieEncoder;
- import org.jboss.netty.handler.codec.http.DefaultHttpResponse;
- import org.jboss.netty.handler.codec.http.HttpChunk;
- import org.jboss.netty.handler.codec.http.HttpChunkTrailer;
- import org.jboss.netty.handler.codec.http.HttpRequest;
- import org.jboss.netty.handler.codec.http.HttpResponse;
- import org.jboss.netty.handler.codec.http.HttpResponseStatus;
- import org.jboss.netty.handler.codec.http.QueryStringDecoder;
- import org.jboss.netty.util.CharsetUtil;
- /**
- * @author <a href="http://www.jboss.org/netty/">The Netty Project</a>
- * @author Andy Taylor (andy.taylor@jboss.org)
- * @author <a href="http://gleamynode.net/">Trustin Lee</a>
- *
- * @version $Rev: 2368 $, $Date: 2010-10-18 17:19:03 +0900 (Mon, 18 Oct 2010) $
- */
- public class HttpRequestHandler extends SimpleChannelUpstreamHandler {
- private DatabaseUtil databaseUtil;
- private RedisUtil redisUtil;
- private HttpRequest request;
- /** Buffer that stores the response content */
- private final StringBuilder buf = new StringBuilder();
- @Override
- public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
- HttpRequest request = this.request = (HttpRequest) e.getMessage();
- redisUtil.setData("yifangyou", "testpassword");
- buf.setLength(0);
- QueryStringDecoder queryStringDecoder = new QueryStringDecoder(request.getUri());
- Map<String, List<String>> params = queryStringDecoder.getParameters();
- if (!params.isEmpty()) {
- HttpResponseStatus httpResponseStatus=HttpResponseStatus.OK;
- if(params.containsKey("username")){
- List<String> values=params.get("username");
- String username="";
- if(values.size()>0){
- username=values.get(0);
- }
- String password=redisUtil.getData(username);
- if(password==null){
- buf.append("not found ");
- }else{
- buf.append(username+"'s password is:"+password);
- }
- }else{
- buf.append("miss username");
- }
- writeResponse(e,httpResponseStatus,buf);
- }else{
- buf.append("miss username");
- writeResponse(e,OK,buf);
- }
- }
- private void writeResponse(MessageEvent e,HttpResponseStatus httpResponseStatus,StringBuilder buf) {
- // Decide whether to close the connection or not.
- boolean keepAlive = isKeepAlive(request);
- // Build the response object.
- HttpResponse response = new DefaultHttpResponse(HTTP_1_1, httpResponseStatus);
- response.setContent(ChannelBuffers.copiedBuffer(buf.toString(), CharsetUtil.UTF_8));
- response.setHeader(CONTENT_TYPE, "text/plain; charset=UTF-8");
- // Write the response.
- ChannelFuture future = e.getChannel().write(response);
- // Close the non-keep-alive connection after the write operation is done.
- future.addListener(ChannelFutureListener.CLOSE);
- }
- private void send100Continue(MessageEvent e) {
- HttpResponse response = new DefaultHttpResponse(HTTP_1_1, CONTINUE);
- e.getChannel().write(response);
- }
- @Override
- public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e)
- throws Exception {
- e.getCause().printStackTrace();
- e.getChannel().close();
- }
- public void setDatabaseUtil(DatabaseUtil databaseUtil) {
- this.databaseUtil = databaseUtil;
- }
- public DatabaseUtil getDatabaseUtil() {
- return databaseUtil;
- }
- public void setRedisUtil(RedisUtil redisUtil) {
- this.redisUtil = redisUtil;
- }
- public RedisUtil getRedisUtil() {
- return redisUtil;
- }
- }
本文出自 “一方有” 博客,请务必保留此出处http://yifangyou.blog.51cto.com/900206/628163
相关推荐
将 Netty 与 Spring 集成,可以利用 Netty 的高性能网络通信能力,同时享受 Spring 提供的便捷的组件管理和应用结构。 在 Netty 和 Spring 集成的过程中,通常涉及以下几个关键知识点: 1. **Spring 上下文**: 在...
集成Netty和Spring MVC的关键在于将Spring的依赖注入(DI)特性引入到Netty的生命周期中。这通常可以通过实现Spring的ApplicationContextAware接口来实现,这样可以在Netty的启动过程中获取到Spring的...
4. **Spring与Netty的集成**:通过Spring的`WebSocketMessageBrokerConfigurer`接口,将Spring的消息传递系统与Netty的WebSocket服务器连接起来。这通常涉及设置WebSocket消息的订阅者和发布者。 5. **客户端支持**...
5. **异常处理**:集成Netty和Spring时,需要确保两者的异常处理机制兼容,以保证系统的健壮性。 6. **测试和监控**:可能包含单元测试代码以及日志和监控配置,以帮助开发者调试和优化系统性能。 7. **部署配置**...
综上所述,"Netty+Spring Boot仿微信 全栈开发高性能后台及客户端"项目是一个综合性的学习和实践平台,涵盖了网络编程、后端开发、全栈集成以及性能优化等多个领域。通过这个项目,开发者不仅可以提升自己的技术能力...
在SpringBoot项目中,我们可以通过添加对应的依赖来引入Netty,例如在`pom.xml`中加入`spring-boot-starter-webflux`,这个依赖集成了Reactor Netty,它是Spring Framework 5.x对响应式编程的支持,底层就是基于...
omen-1.1 自己基于netty开发的服务端,支持spring配置服务器启动模式:http,tcp,websocket等,并支持NIO和OIO方式,项目已应用于生产,可以通过jar形式加入其它项目,业务类实现业务service,启动不依赖于其他应用...
- **集成示例**:如何将Spring的业务逻辑嵌入到Netty的事件处理流程中。 - **最佳实践**:在实际项目中如何合理地利用Netty和Spring的优势。 #### 2. 性能优化技巧 - **代码层面**:针对Netty的性能瓶颈进行优化,...
Netty 是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。...通过学习和理解这些内容,开发者可以更好地掌握 Netty 和 Spring 集成的技巧,从而在实际项目中灵活运用。
在IT行业中,Spring、Netty和MyBatis是三个非常重要的框架,它们分别在不同的领域发挥着关键作用。Spring是一个全面的Java应用框架,提供强大的依赖注入、AOP(面向切面编程)以及丰富的功能模块;Netty则是一个高...
总之,Netty、SpringMVC和Dubbo的集成可以构建出强大、高效的分布式系统。通过合理的配置和优化,我们可以充分利用每个框架的优势,为应用程序提供卓越的性能和可扩展性。在实际开发中,需根据项目需求,灵活运用...
Netty4.x与Spring的集成是现代Java应用中常见的技术结合,主要用于构建高性能、异步的网络应用程序。Netty是一个高性能、异步事件驱动的网络应用程序框架,它为开发自定义网络协议和服务提供了高效率和灵活性。而...
Spring Boot 是一个流行的Java开发框架,它简化了创建独立、生产级别的基于Spring的应用程序的流程。Netty 是一个高性能、异步...同时,利用Spring Boot的自动配置和管理特性,可以使整个系统的集成更加简洁、高效。
4. **启动Netty服务器**:在Spring的启动类或者配置类中,使用Spring注入的Netty服务器配置启动服务器,监听指定端口。 5. **客户端交互**:创建Netty客户端,同样利用Spring管理的bean进行通信,也可以使用Spring...
通过以上步骤,我们可以构建出一个强大的基于Java的后端服务架构,集成了Spring Boot的易用性、Dubbo的分布式服务治理和Netty的高性能网络通信能力。这种架构适用于大型、复杂的企业级应用,能够提供高效、稳定的...
netty-spring-boot-starter 基于Netty的Spring Boot Starter工程。 介绍 支持TCP长连接消息转发到Spring容器 支持自定义消息枚举类( CommandController , CommandMapping ) 支持自定义通信协议解析( ...
- **依赖注入(DI)**:Spring通过XML配置或注解实现对象间的依赖关系,简化了对象的创建和管理。 - **AOP(面向切面编程)**:提供事务管理、日志记录等通用功能,无需侵入业务代码。 - **Spring Boot**:简化...
Spring Netty项目是一个整合了Netty 4和Spring 5框架的应用示例,它展示了如何在Netty服务器中使用Spring的特性,特别是针对UDP通信、MyBatis持久化以及通过Netty Handler访问Spring Bean来实现数据库操作。...
用Netty实现的Spring-boot-protocol将springboot的WebServer更改为NettyTcpServer,为用户扩展了网络编程的能力。多协议服务器,Springboot协议扩展包,允许单端口提供多协议服务。其中内置多个网络传输(标准与规范...
3. Spring Boot整合:将Netty服务器集成到Spring Boot应用中,使其成为服务的一部分,可以通过Spring的依赖注入管理和配置。 4. 错误处理和恢复机制:设计处理连接中断和重连的策略,保证服务的稳定性。 5. 自定义...