服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Redis - Redis 异常 read error on connection 的解决方案

Redis 异常 read error on connection 的解决方案

2022-08-26 17:16潘广宇 Redis

这篇文章主要介绍了Redis异常read error on connection的解决方案,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的小伙伴可以参考一下

一、造成原因与场景

在接口连接 redis 时,使用了 pconnect 进行 redis 长连接,在 Redis->auth() 中抛出异常:

?
1
PHP Fatal error:  Uncaught exception 'RedisException' with message 'read error on connection'

注:由于 php-fpm 对连接的重用性,所以,当存在cgi进程管理器[如php-fpm,spawn-cgi],使用 pconnect 效率比 connect 高。但是由于每个持久连接会占用内存,当并发量很大的时,很可能造成内存吃紧

二、出现原因

通过 pconnect 的 redis 长连接不会主动释放,会一直保持在php-fpm进程中,等待完成下一个请求的任务,即使通过 close 也仅是使当前php不能再进行redis请求,但无法真正关闭redis长连接,连接在后续请求中仍然会被重用,直至fpm进程生命周期结束。

这样会出现以下两种情况:

1)原因1 使用了已经断开的连接

假如这个连接已经断开了,下个请求可能直接使用上个断开的连接,当 php-fpm 处理下一个请求 reuse 一个断开的连接可能导致 read error on connection 的异常,以下是 phpredis 源码的解释:

Redis 异常 read error on connection 的解决方案

2)原因2:执行超时

  • a)客户端设置的超时时间过短导致的;
  • b)客户端未设置超时时间,但是服务端执行时间超过了默认超时时间设置

php 有一个配置项 default_socket_timeout 表示一个 socket 连接的超时时间,默认是60s,而phpredis 这个扩展的底层连接 redis 是使用的 socket,所以当一个连接在60秒内没有被使用的时候,下次连接就会抛出这个异常。

三、解决方案

1)如果是原因1

长连接改为短连接 或者 在 pconnect 中增加超时时间

?
1
$this->redis->pconnect($host, $port, 2);       //@todo 2秒后该连接超时,将使用新的长连接

2)如果是原因2:修改超时时间

(不推荐) 方案1:

php.ini 中设置

?
1
default_socket_timeout = -1

然后重启php-fpm

方案2:

动态修改 php.ini 

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

方案3:

设置 redis 的超时时间为不超时:

?
1
$this->redis->setOption(Redis::OPT_READ_TIMEOUT, -1);

到此这篇关于Redis 异常 read error on connection 的解决方案的文章就介绍到这了,更多相关Redis 异常 内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://panguangyu.blog.csdn.net/article/details/124296439

延伸 · 阅读

精彩推荐
  • RedisWindows系统安装Redis的详细图文教程

    Windows系统安装Redis的详细图文教程

    但有时候想在windows下折腾下Redis,那么就可以参考下面的方法了,虽然脚本之家小编以前整理了一些,发现这篇做的比较详细,下载也给出来了 ...

    花伦同学ko19632019-11-15
  • RedisRedis教程(五):Set数据类型

    Redis教程(五):Set数据类型

    这篇文章主要介绍了Redis教程(五):Set数据类型,本文讲解了Set数据类型概述、相关命令、命令使用示例、应用范围等内容,需要的朋友可以参考下 ...

    Redis教程网2852020-04-30
  • RedisRedis解决Session共享问题的方法详解

    Redis解决Session共享问题的方法详解

    这篇文章主要为大家详细介绍了分布式系统Redis解决Session共享问题的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下...

    wl_Honest3322022-07-11
  • Redis利用redis实现排行榜的小秘诀

    利用redis实现排行榜的小秘诀

    这篇文章主要给大家介绍了关于如何利用redis实现排行榜的小秘诀,文中通过示例代码介绍的非常详细,对大家学习或者使用redis具有一定的参考学习价值,...

    dodomonster5362019-11-23
  • Redis详解Redis中Lua脚本的应用和实践

    详解Redis中Lua脚本的应用和实践

    这篇文章主要介绍了详解Redis中Lua脚本的应用和实践,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    燕南飞Liam4212019-11-22
  • Redis关于Redis数据持久化的概念介绍

    关于Redis数据持久化的概念介绍

    Redis是内存数据库,数据都是存储在内存中,需要定期将Redis中的数据以某种形式(或命数据令)从内存保存到硬盘,今天给大家分享Redis数据的持久化的概念...

    遙遙背影暖暖流星4842021-09-16
  • Redisspringboot +redis 实现点赞、浏览、收藏、评论等数量的增减操作

    springboot +redis 实现点赞、浏览、收藏、评论等数量的增减操作

    这篇文章主要介绍了springboot +redis 实现点赞、浏览、收藏、评论等数量的增减操作,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一...

    工藤(kodou)9032020-09-20
  • RedisLinux下安装Redis并设置相关服务

    Linux下安装Redis并设置相关服务

    这篇文章主要为大家介绍了Linux下安装Redis并设置相关服务,感兴趣的小伙伴们可以参考一下 ...

    张宏杰7202019-10-27