redis的read error on connection错误解决

昨日,公司php调用redis报错:read error on connection 2015-01-29 23:59:050.13330000,redis存放的是用户session。

在网上查询,大家说法都比较一致,说是php.ini文件中的一个配置项导致:

default_socket_timeout = 60

由于redis扩展也是基于php 的socket方式实现,因此该参数值同样会起作用。

解决方法是:

1、直接修改php.ini,将其设置为我们想要的值(这个不推荐)

2、在我们的脚本中通过以下方式设置,这样就比较灵活,不对其他脚本产生影响

ini_set(‘default_socket_timeout‘, -1);  //不超时

但是,一看,修改的两个参数,一个是php的全局参数,一个是redis的超时操作,都应该按照实际情况来修改,而且,设置超长超时时间或者不超时都是不合理的;

继续检查redis发现,/usr/local/redis_16379/src/redis-cli -p 16379 info(服务器配置的redis端口为16379,分配内存为8000M)

used_memory_human:7.49G,占用内存已经7.49G

db10:keys=53090286,键值5000多万

竟然是键值占满了内存,检查php的调用代码,发现php竟然没有设置redis的键值过期时间,修改php代码,对键值设置过期时间

设置完之后,发现之前的键值因为没有设置过期时间,程序不会自动删除,于是用脚本删除主redis上对应的session,

/usr/local/redis_16379/src/redis-cli -p 16379 -n 10 keys "PHPSESSION_wc*" | xargs /usr/local/redis_16379/src/redis-cli -p 16379 -n 10 del

将大部分过期数据删除掉,删除一定数量的数据之后,报错消失,redis连接正常。

但是,发现redis主从,在这样删除之后,从数据竟然没有同步,主的数据和从数据差距有400多万不一致,也没有再发现bgsave操作,查看从日志Trying a partial resynchronization,发现因为过滤keys占用太多资源,造成服务器负载飙升,slave断开与主机的连接,需要从积压空间中找回断开期间的数据更新记录。但是因为删除数据太多,断开的时间足够长,master 拒绝 slave 的部分同步请求,从而 slave 只能进行全同步。

至此,在slave上对数据进行全量同步,数据恢复正常,业务正常。

需要注意几点:

1.redis数据,正常情况下,设置过期时间,否则可能出现,存储键值过多,占用完了预设内存,导致新的键值无法存储,调用redis失败的;

2.超时时间必须根据实际业务来设置;

3.如果slave一直连接不上master,可能需要进行全量同步。

时间: 2024-10-12 16:09:10

redis的read error on connection错误解决的相关文章

error C2039: 'SetDefaultDllDirectories'错误解决办法

使用VS2013+WDK8.1+Win7开发UMDF驱动,当使用了CComPtr类,包含了atlcomcli.h头文件却报错,错误如下: Error 3 error C2039: 'SetDefaultDllDirectories' : is not a member of '`global namespace'' 可是使用VS2012+WDK8.0+Win7却没有这个问题. 经过一番折腾终于找到了解决办法,在预定义中增加一项定义  _USING_V110_SDK71_ 具体见下图: error

error C2039: 'SetDefaultDllDirectories'错误解决办法<转>

使用VS2013+WDK8.1+Win7开发UMDF驱动,当使用了CComPtr类,包含了atlcomcli.h头文件却报错,错误如下: Error 3 error C2039: 'SetDefaultDllDirectories' : is not a member of '`global namespace'' 可是使用VS2012+WDK8.0+Win7却没有这个问题. 经过一番折腾终于找到了解决办法,在预定义中增加一项定义  _USING_V110_SDK71_ 具体见下图: error

升级ionic版本后,创建新项目报Error Initializing app错误解决

命令行,进入项目路径后,运行 ionic start myApp --v2 命令执行后,报如下错误 Installing npm packages...Error with start undefinedError Initializing app: There was an error with the spawned command: npminstallThere was an error with the spawned command: npminstallCaught excepti

mysql登录时,ERROR 1045 (28000): 错误解决办法

错误问题的描述: ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' (using password: NO) ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' (using password: YES) windows下,以上两个错误的解决方法 解决方法: 1.找到配置文件my.ini  ,然后将其打开,可以选择用NotePadd++打开 2.打开后

mysql ERROR 1045 (28000): 错误解决办法

ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' (using password: NO) ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost' (using password: YES) windows下,以上两个错误的解决方法 1.找到配置文件my.ini  ,然后将其打开,可以选择用记事本打开 2.打开后,搜索mysqld关键字找到后,在mysql

[Microsoft][SQLServer 2000 Driver for JDBC]Error establishing socket错误解决方法总结

今天做一个特殊的业务处理,用JDBC连接SQLServer数据库载入驱动的时候,报例如以下错误: java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Error establishing socket. at com.microsoft.jdbc.base.BaseExceptions.createException(Unknown Source) at com.microsoft.jdbc.base.BaseExc

关于wifi的HW hdr error:len/check错误解决方法

在调试博通wifi出现下图所示的错误,找了好久才知道是哪里的问题,具体的错误如下: 解决的方法是,找到内核中的配置CONFIG_MMC_DW_IDMAC,把它注释掉即可.

execl error: Permission denied 错误解决

在调用execl函数执行一个文件的话要确保:全路径名是正确的,第二个参数必须对应为第一个参数的文件名:最后一个参数是 (char *)NULL :可以直接把第一个参数放在命令行运行来检验.否则会出现 Permission denied 错误.值得注意的是,即使执行的是一个解释器文件,也需要其有可执行权限.(这是在看APUE时遇到的问题) 代码如下(需要解释器文本 testinterp 有执行权限): int main(void) { pid_t pid; if ((pid = fork()) <

centos7 安装redis 出现cc: command not found错误解决

安装过程 1. 下载并解压 cd /root/software wget http://download.redis.io/releases/redis-3.2.4.tar.gz tar -zxvf redis-3.2.4.tar.gz 2. 编译安装 cd redis-3.2.4 make && make install 这一步中出现 错误 经过百度,是服务器新安装没有安装gcc环境,需要安装gcc环境,使用yum安装yum install gcc 检查gcc环境是否安装好rpm -qa