您的位置:首页 > 数据库 > Redis

Redis使用中的一些问题

2020-02-01 21:19 701 查看

最近使用Redis作为内存缓存使用,系统是java的web应用,采用的是Redis官方推荐的Jedis。Jedis使用很简单,网上的例子很多,不赘述。但是在使用者,遇到了很多问题,网上的答案也不多,特意记录下来。

 

1)Jedis Pool崩溃

     我们做了一些压力测试,在大并发量的情况下(或者长时间运行后),Jedis时不时会崩溃掉。异常为:JedisConnectionException。 崩溃后,整个Redis无法使用。只要报这个异常,整个Redis无法使用,让人很无语。

JedisConnectionException进一步跟踪,引起该异常的原因很多,常见的:

  •   redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool at redis.clients.util.Pool.getResource(Pool.java:22)
  • .JedisConnectionException: java.net.SocketTimeoutException: Read timed out
  • 其他一些:比超出max clients等等

总之,只要client 从pool中拿不到一个Jedis client instance, Jedis就会抛出JedisConnectionException, 然后整个redis 就无法连接上了。网上都是说怎么样配置,但是即使你正确的配置了参数,也不能保证Jedis Pool不崩溃,还是偶尔崩溃,没有特别好的解决方法。我们后来就workaround这个问题:catch这个异常(拿不到Jedis客户端),destroy现在的pool,然后重启一个。 

网上有个其他网友的方案,可以参考一下:http://lyongq04.iteye.com/blog/2043329

 

2)Jedis Server的一些配置项:

      redis.conf的比较重要的配置项:

      timeout (客户端idle time,超过这个时间后,Jedis关闭这个链接),默认是300s(5分钟),我使用了默认配置。

     maxclients 50000 (我设置为50000)

     详细配置参考:http://dumbee.net/archives/114

 

3)Tomcat 报 too many files open

这个比较简单,就是linux服务器可打开的最大文件数低了,设置大一点:ulimit -n 100000  (修改系统设置)

 

4)Tomcat 报NoRouteToHostException can not assigen address...

原因:Tomcat服务器上的端口不够用了。Jedis客户端每开一个connection,就占用一个端口,在大并发量的情况下,connect虽然断开,但占用的端口来不及回收重用。

 使用命令查看使用的端口数: netstat -an|wc –l , 一段时间后,数字不断上升,不下降或稳定,说明来不及释放,或不释放。

设置linux的内核参数:

 

 

 1. 调低端口释放后的等待时间, 默认为60s, 修改为15~30s
        echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
    2. 修改tcp/ip协议配置, 通过配置/proc/sys/net/ipv4/tcp_tw_resue, 默认为0, 修改为1, 释放TIME_WAIT端口给新连接使用。
        echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
    3. 修改tcp/ip协议配置,快速回收socket资源,  默认为0, 修改为1.
        echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
同时设置:
     echo 120 > /proc/sys/net/ipv4/tcp_keepalive_time
     echo 2 > /proc/sys/net/ipv4/tcp_keepalive_intvl
     echo 1 > /proc/sys/net/ipv4/tcp_keepalive_probes 请注意:上面的设置是针对IPV4, 如果你的tomcat监听的端口(8080)是IPV6, 请把tomcat 的监听方式改到IPV4:

tomcat的启动参数:

添加java参数 :

JAVA_OPTS= $JAVA_OPTS -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv4Addresses=true

 

怎么查看tomcat监听是IPV4还是IPV6:  #netstat -nl

后看到监听的8080端口是:TCP 还是TCP6

tcp        0      0 0.0.0.0:3389            0.0.0.0:*               LISTEN     

tcp        0      0 127.0.0.1:8005          0.0.0.0:*               LISTEN     

tcp        0      0 0.0.0.0:8009            0.0.0.0:*               LISTEN     

tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN         

tcp6       0      0 :::22                   :::*                    LISTEN     

 

tcp6       0      0 ::1:631                 :::*                    LISTEN

 

个人经验是:Jedis Pool Config文件中active client配置5000就OK了,不要过大。一台Redis服务器max client配置2w基本上OK。 

 

另外,感觉Jedis客户端不够稳定,正在测试其他的Java客户端,有好的效果,也会报告给大家。

     

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 点赞
  • 收藏
  • 分享
  • 文章举报
iteye_21253 发布了5 篇原创文章 · 获赞 0 · 访问量 332 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: