Redis异常汇总,希望可以帮助到你

 1、Could not get a resource from the pool, Connection refused: connect

 

windows Java这边客户端链接被拒接了,想想问题

1.Vmware里面的linux所安装的redis已经正常启动 
2.在windows用ssh客户端链接linux可以操作redis 
3.linux防火墙已经关闭 
4.拼linux的ip也能拼通

按理说应该没问题,下利用telnet测试下端口

telnet 192.168.0.104 6379

发现端口不能拼通,但是linu下其他的端口能拼通,说明就是redis自身配置的问题了,看了下配置文件,发现配置文件绑定了本地ip,该配置会导致,其他ip登录被拒绝,所以我们把它注释掉

 

 

2DENIED Redis is running in protected mode because protected mode is enabled…

 

该问题说,redis目前处于受保护模式,不允许非本地客户端链接,我们可以通过给redis设置密码,然后客户端链接的时候,写上密码就可以解决了

配置redis的命令 
config set requirepass 123456  ->123456是密码

auth 123456

现在java客户端通过配置主机ip号,密码就能链接上了

 

3、 Caused by: redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketException: Too many open files

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

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

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

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

at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:868)

at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:435)

at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:363)

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

... 9 more

 

1 查看linux默认打开文件数:ulimit -a

通过以上命令,我们可以看到open files 的最大数为1024

对于并发量比较大的网站这个限制是有些捉襟见肘的,所以我通过这个命令

ulimit -n 4096
把打开文件数的上限设为了4096,这下好了,项目又稳定了

没想到过两天后又重新出这个错误了,郁闷,两个小时报一次,报之后就挂掉了

在重新用ulimit -a查看,发现open files (-n) 1024 又变回了1024了,

报这个错误就在我那次登陆更新之后又报的,原来ulimit -n 4096 命令只能临时的改变open files 的值,当

重新登陆后又会恢复,所以需要永久设置open files 的值才行啊,

用ulimit -n 修改open files 总是不能保持。所以用下面一个简单的办法更好些。

修改/etc/security/limits.conf 添加如下一行:

* - nofile 1006154

修改/etc/pam.d/login添加如下一行

session required /lib/security/pam_limits.so

这次永久修改后程序就再没那个问题了,一直稳定运行。

另外遇到这个问题这后还需要检查我们的程序对于操作io的流是否在操作完之后关闭,这才是从最更本上的解决。

 

 

4、 (error) MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk.

今天运行Redis时发生错误,错误信息如下:

(error) MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.

Redis被配置为保存数据库快照,但它目前不能持久化到硬盘。用来修改集合数据的命令不能用。请查看Redis日志的详细错误信息。

原因:

强制关闭Redis快照导致不能持久化。

解决方案一:

运行config set stop-writes-on-bgsave-error no 命令后,关闭配置项stop-writes-on-bgsave-error解决该问题。

root@ubuntu:/usr/local/redis/bin# ./redis-cli
127.0.0.1:6379> config set stop-writes-on-bgsave-error no
OK
127.0.0.1:6379> lpush myColour "red"
(integer) 1

解决方案二:

若对于Redis持久化要求不高,可以讲持久化注释掉

四、当我们获取连接后对redis进行操作时,抛出redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: Read timed out异常。

异常代码如下:

redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: Read timed out

at redis.clients.jedis.Protocol.process(Protocol.java:79)
at redis.clients.jedis.Protocol.read(Protocol.java:131)
at redis.clients.jedis.Connection.getIntegerReply(Connection.java:188)
at redis.clients.jedis.Jedis.sismember(Jedis.java:1266)

单机Redis 当数据量达到百万级以上(未进行Redis性能调优的情况下),默认超时时间redis.clients.jedis.Protocol.DEFAULT_TIMEOUT = 2000 ,

若Jedis设置超时时间较短,会出现连接超时异常,

/**百万级别数据以下*/
int timeout = 5000;
new JedisPool(new JedisPoolConfig(), host,port,timeout,password)

解决方案:

超时时间加大:timeout = 5000*10

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值