关于redis的问题:RedisException with message read error on connection

关于redis的问题:RedisException with message read error on connection

最近碰到在REDIS执行一步get操作的时候报出错误:Uncaught RedisException: read error on connection,感觉不可理解,REDIS连接没有发现问题,但是就是get失败,在redis的日志中也没有找到慢查询,说明这个报错也不是超时。连接没有发生问题,又没有超时,什么会读失败呢?

    在网上找了些答案,但基本都是千遍一律地认为是这行配置的问题:

default_socket_timeout = 60;

     都建议把它改成-1.不超时

ini_set('default_socket_timeout', -1);  //在php程序中修改
default_socket_timeout = -1;            //或者修改配置文件

    原因都写着:由于redis扩展也是基于php 的socket方式实现,因此该参数值同样会起作用。但想想如果是这个配置的问题的话,那意思就是说请求redis读时超时了是不是?可这个配置的单位是秒啊!你能超60秒?如果一个请求超过了60秒还没有执行成功,这个值改大了又有什么意思?不知道网上碰到这个问题并写着按这个方法解决的朋友是不是后面再也没有碰到这个问题。
但我就是怀疑是这个地方的问题!
    在网上找了些相关的资料,也翻墙出去看了一些。看到了这么一篇讨论,里面有一个回答:
http://stackoverflow.com/questions/18072407/php-redis-timeout-read-error-on-connection

    After a lot of study of articles and doing my own strace’s of redis and php, it seemed the issue was easily fixed by this solution. The main issue in my use case was that redis server is not able to fork a process towards saving the in-memory writes to the on-disk db.
    I have left all the timeout values in php.ini and redis.conf as they were without making the hacky changes suggested and then tried the above solution alone, and this issue ‘read error on connection’ that was unfixable using all the suggestions around changing timeout values across php and redis conf files went away.
    I also saw some suggestions around increasing limit on file descriptors to 100000 etc. I am running my use case on a cloud server with file descriptor limit at 1024 and my use case runs even with that limit perfectly.

    其中提到的 by this solution 链接到了这篇文章的这个位置:从上面的说法来看这个是可以解决这个问题,我还没有测试验证。文章链接

    https://groups.google.com/forum/#!msg/redis-db/3Eh2hhsXQ1g/_nAzuK–nYYJ  提到的解决方法如下:

> Ok further investigations showed that probably this is due to 
> /proc/sys/vm/overcommit_memory 
> If it’s zero in your system try to set it to 1 or 2 and check what 
> happens. I’m going to try this in few hours. 

echo 1 > /proc/sys/vm/overcommit_memory 

works perfectly! So the problem was with the kernel _estimating_ how 
much memory would the forked process need. Echoing “1” as I understand 
disables the check and enables the process to fork. 

Since “0” is default of overcommit_memory, perhaps the issue is much 
more common on Linux boxes. It also looks like MacOSX is free of this 
issue. 

If confirmed, it would be nice to have it added to the FAQ. 
Great job and many thanks again 

—————————————————————-

    关于内核参数overcommit_memory的值的意义:                                    
overcommit_memory文件指定了内核针对内存分配的策略,其值可以是0、1、2。                               
0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。 
1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2, 表示内核允许分配超过所有物理内存和交换空间总和的内存

    修改方法:
/etc/sysctl.conf                                                        
vm.overcommit_memory=1
或者
sysctl vm.overcommit_memory=1
或者
echo 1 > /proc/sys/vm/overcommit_memory

本文地址:http://www.04007.cn/article/376.html 未经许可,不得转载. 手机访问本页请扫描下方二维码:

 

在使用redis的时候,出现了Error: read error on connection.
找了一下相关资料,在官方也有很多人提出这个问题
phpredis的作者的意思是,是因为default_socket_timeout的问题,将它设为0就好了.
但很多人都说设为0,在60秒后还是会挂 ,只有设为-1才OK
于是,在命令行下subscribe的时候,先init_set(‘default_socket_timeout’,-1);
问题解决 .

http://www.neatstudio.com/show-2357-1.shtml

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/112950.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 如何正确使用 Composer 安装 Laravel 扩展包

    如何正确使用 Composer 安装 Laravel 扩展包

    2021年11月7日
    66
  • java中级考试 考点_java中级面试题的考点「建议收藏」

    java中级考试 考点_java中级面试题的考点「建议收藏」在我们对java有一定的基础学习后,能力再往上升一些就是中级。对于初级和中级来说,后者除了对于基础java内容把握能力强外,在一些知识点的比较分析和原理解剖上有所理解能力。本篇就java中级面试题进行了整理,挑出了一些典型的高频试题,都来看看具体内容吧。1.比较接口和抽象类的语法区别(1)抽象类可以有构造方法,接口中不能有构造方法。(2)抽象类中可以有普通成员变量,接口中没有普通成员变量!!!(注…

    2022年10月10日
    3
  • 项目从 tomcat7部署到tomcat8「建议收藏」

    项目从 tomcat7部署到tomcat8「建议收藏」这段时间将一个老项目从tomcat7部署到tomcat8上,期间遇到的典型问题。接下来我会介绍下整个升级过程和在升级中遇到的问题。首先要装个jdk8+,因为开发环境用的是eclipse,还要搞个兼容tomcat8的eclipse.新下的tomcat8里是自带20几个jar的,这是要留着的不能直接拿来tomcat7的lib就用。因为老项目要依赖的jar都放在了tomcat下没有用maven,所以拿来…

    2022年7月18日
    27
  • VS2010序列号正式版附激活成功教程方法详细攻略

    VS2010序列号正式版附激活成功教程方法详细攻略全球开发者最为瞩目的VisualStudio2010开发工具在4月12日正式发布,现为大家制作一个简单的激活成功教程教程有两种方法,操作不一样,原都一样(针对旗舰版,其他版本方法一样):教程一:步骤1.下载VS2010正式版,下载地址:页面:http://www.microsoft.com/downloads/details.aspx?displaylang=en&Fam

    2022年7月20日
    16
  • Java使用RSA加密解密签名及校验

    Java使用RSA加密解密签名及校验

    2021年4月9日
    159
  • ReLU和BN层简析[通俗易懂]

    ReLU和BN层简析[通俗易懂]卷积神经网络中,若不采用非线性激活,会导致神经网络只能拟合线性可分的数据,因此通常会在卷积操作后,添加非线性激活单元,其中包括logistic-sigmoid、tanh-sigmoid、ReLU等。sigmoid激活函数应用于深度神经网络中,存在一定的局限性,当数据落在左右饱和区间时,会导致导数接近0,在卷积神经网络反向传播中,每层都需要乘上激活函数的导数,由于导数太小,这样经过几次传播后,靠…

    2022年10月9日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号