Redis中Jedis版本升级后的问题总结

最近因为jedis 2.1.0接口的一些问题,升级版本了版本,结果出现了一个诡异的问题;时常能正常启动,时常出现jedisPool初始化时 java.lang.IllegalArgumentException: hostname can’t be null

原因出在spring JedisPool构造参数上,之前spring的配置如下

<bean id="jedisPool" class="redis.clients.jedis.JedisPool"> 

    <constructor-arg ref="jedisConfig" />

    <constructor-arg value="${redis.host}" />

    <constructor-arg type="int" value="${redis.port}" />

</bean>
明显是因为host没有注入,但时常又可以,诡异!!!之后弄了jedis源码,加了日志,才定位到原因,查看JedisPool源码,其中的两构造函数如下
public JedisPool(final GenericObjectPoolConfig poolConfig, final String host, final int port) {

 this(poolConfig, host, port, Protocol.DEFAULT_TIMEOUT, null, Protocol.DEFAULT_DATABASE, null);

}

 

public JedisPool(final GenericObjectPoolConfig poolConfig, final URI uri, final int timeout) {

 super(poolConfig, new JedisFactory(uri.getHost(), uri.getPort(), timeout, 

   JedisURIHelper.getPassword(uri), JedisURIHelper.getDBIndex(uri) != null ? 

     JedisURIHelper.getDBIndex(uri) : 0, null));

}
我们调用的是第一个构造函数,但事实是可能会调用第二个构造函数;port当做了timeout,host当做了URI。

不是很明白spring为什么会把value是字符串的参数匹配到URI上,那就明确指定类型吧

<bean id="jedisPool" class="redis.clients.jedis.JedisPool"> 

    <constructor-arg ref="jedisConfig" />

    <constructor-arg type="java.lang.String" value="${redis.host}" />

    <constructor-arg type="int" value="${redis.port}" />

</bean>

jedis之前的异常为,方面遇到同问题的同学

redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool

        at redis.clients.util.Pool.getResource(Pool.java:50)

        at redis.clients.jedis.JedisPool.getResource(JedisPool.java:88)

        at com.renhenet.modules.redis.RedisService.getHash(RedisService.java:364)

        at com.renhenet.modules.member.MemberRedisService.getMemberIndustryByMemberId(MemberRedisService.java:240)

        at com.renhenet.modules.member.MemberService.getMemberIndustry(MemberService.java:236)

        at com.renhenet.modules.member.MemberService$$FastClassByCGLIB$$b34212a.invoke(<generated>)

        at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)

        at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:698)

        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)

        at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:96)

        at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:260)

        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94)

        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)

        at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:631)

        at com.renhenet.modules.member.MemberService$$EnhancerByCGLIB$$1638ea72.getMemberIndustry(<generated>)

        at com.renhenet.fw.struts2.interceptor.LoginRenheInterceptor.intercept(LoginRenheInterceptor.java:68)

        at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)

        at com.renhenet.fw.struts2.interceptor.WebRenheInterceptor.intercept(WebRenheInterceptor.java:27)

        at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)

        at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:54)

        at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:563)

        at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)

        at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:99)

        at com.renhenet.fw.struts2.filter.RenheStruts2Filter.doFilter(RenheStruts2Filter.java:32)

        at com.caucho.server.dispatch.FilterFilterChain.doFilter(FilterFilterChain.java:87)

        at com.caucho.server.webapp.WebAppFilterChain.doFilter(WebAppFilterChain.java:187)

        at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:265)

        at com.caucho.server.hmux.HmuxRequest.handleRequest(HmuxRequest.java:436)

        at com.caucho.server.port.TcpConnection.run(TcpConnection.java:682)

        at com.caucho.util.ThreadPool$Item.runTasks(ThreadPool.java:730)

        at com.caucho.util.ThreadPool$Item.run(ThreadPool.java:649)

        at java.lang.Thread.run(Thread.java:745)

Caused by: java.lang.IllegalArgumentException: hostname can't be null

        at java.net.InetSocketAddress.checkHost(InetSocketAddress.java:149)

        at java.net.InetSocketAddress.<init>(InetSocketAddress.java:216)

        at redis.clients.jedis.Connection.connect(Connection.java:142)

        at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:75)

        at redis.clients.jedis.BinaryJedis.connect(BinaryJedis.java:1572)

        at redis.clients.jedis.JedisFactory.makeObject(JedisFactory.java:69)

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索函数
null
jedis redis 版本、redis和jedis的关系、jedis 密码访问redis、jedis和redis的区别、redisson jedis 比较,以便于您获取更多的相关知识。

时间: 2024-09-25 06:11:56

Redis中Jedis版本升级后的问题总结的相关文章

Redis客户端Jedis(一)

  Redis官方并未提供windows版本,我们可以在github上下载windows版,https://github.com/MSOpenTech/redis/releases 下面是redis.windows.conf    #是否作为守护进程运行 daemonize no #Redis 默认监听端口 port 6479 #客户端闲置多少秒后,断开连接 timeout 300 #日志显示级别 loglevel verbose #指定日志输出的文件名,也可指定到标准输出端口 logfile

阿里云ECS部署spring-boot访问redis出现redis.clients.jedis.HostAndPort - cant resolve localhost address

问题LOG 2017-08-17 09:06:52.526 [main] ERROR redis.clients.jedis.HostAndPort - cant resolve localhost address door_1 | java.net.UnknownHostException: iZuf6buf42e89crw6zf: iZuf6buf42e89crw6zf: Name or service not known door_1 | at java.net.InetAddress.g

深入理解Redis中的主键失效及其实现机制

   作为一种定期清理无效数据的重要机制,主键失效存在于大多数缓存系统中,Reids也不例外.在Redis提供的诸多命令中,EXPIRE.EXPIREAT.PEXPIRE.PEXPIREAT以及SETEX和PSETEX均可以用来设置一条Key-Value对的失效时间,而一条Key-Value对一旦被关联了失效时间就会在到期后自动删除(或者说变得无法访问更为准确).可以说,主键失效这个概念还是比较容易理解的,但是在具体实现到Redis中又是如何呢?最近本博主就对Redis中的主键失效机制产生了几个

如何监控 redis 中lsit集合

问题描述 多个县城同时网redis中的某个list集合中添加元素如何对这个list集合做监控目前是写了一个while(true){......}的循环,一直在遍历这个list集合,感觉这样不太好有没有更好的方法来监控这个list集合 解决方案 解决方案二:楼主说的监控是要做什么要达到什么目的呢解决方案三:引用1楼suciver的回复: 楼主说的监控是要做什么要达到什么目的呢 这个list集合就是一个堆栈,如果堆栈中有增加数据(元素),则需要对该元素做相应的处理解决方案四:引用2楼haorengo

Redis中5种数据结构的使用场景介绍

这篇文章主要介绍了Redis中5种数据结构的使用场景介绍,本文对Redis中的5种数据类型String.Hash.List.Set.Sorted Set做了讲解,需要的朋友可以参考下. 一.redis 数据结构使用场景 原来看过 redisbook 这本书,对 redis 的基本功能都已经熟悉了,从上周开始看 redis 的源码.目前目标是吃透 redis 的数据结构.我们都知道,在 redis 中一共有5种数据结构,那每种数据结构的使用场景都是什么呢? String--字符串 Hash--字典

【每日一博】Redis 中的字符串实现 sds

在C中子字符串的实现都是用 char *来实现的,用起来很不方便,而且容易出现内存泄露,并且效率不高,在Redis内部,字符串采用了 sds 的方式进行了封装,似的字符串在Redis中可以方便.高效的使用,Redis字符串的实现如要依赖一下两个数据类型和结构(以下代码可以在 src/sds.h中找到): typedef char *sds; sds 存放了字符串的具体值 struct sdshdr { int len; //字符串对象已经使用的内存数量 int free; //字符串对象剩余的内

Redis中5种数据结构的使用场景介绍_Redis

一.redis 数据结构使用场景 原来看过 redisbook 这本书,对 redis 的基本功能都已经熟悉了,从上周开始看 redis 的源码.目前目标是吃透 redis 的数据结构.我们都知道,在 redis 中一共有5种数据结构,那每种数据结构的使用场景都是什么呢? String--字符串 Hash--字典 List--列表 Set--集合 Sorted Set--有序集合 下面我们就来简单说明一下它们各自的使用场景: 1. String--字符串 String 数据结构是简单的 key-

redis中list类型详解及常用命令

redis中的list类型有点类似于编程语言中的数组,list类型如下图所示,实际上是一种双向链表结构,通过lpush.lpop.rpush.rpop这几个命令来控制链表中数据出入,所以list类型可以用作栈,也可以用作队列一样. redis链表list类型 从元素插入和删除的效率来看,如果从链表的两头插入或删除元素,会非常的高效,即使链表中已经存储了上百万条的记录,也可以在很短的时间内完成.然而需要说明的是,如果元素插入或删除操作是作用于链表中间,那将会是非常低效的.相信对于有良好数据结构基础

redis中使用java脚本实现分布式锁_Redis

redis被大量用在分布式的环境中,自然而然分布式环境下的锁如何解决,立马成为一个问题.例如我们当前的手游项目,服务器端是按业务模块划分服务器的,有应用服,战斗服等,但是这两个vm都有可能同时改变玩家的属性,这如果在同一个vm下面,就很容易加锁,但如果在分布式环境下就没那么容易了,当然利用redis现有的功能也有解决办法,比如redis的脚本. redis在2.6以后的版本中增加了Lua脚本的功能,可以通过eval命令,直接在RedisServer环境中执行Lua脚本,并且可以在Lua脚本中调用