php - Redis 多进程Uncaught exception 'RedisException' with message
天蓬老师
天蓬老师 2017-04-10 17:26:31
[PHP讨论组]

1.背景描述:用Swoole作为TcpServer,配置了worker_num = 8 ,task_worker_num =8 .也就是会有16个进程。 创建了一个redid连接,在 onTask(8个task,每个task都会回调onTask方法)方法中读取redis保存的值。

2.问题描述:现在发现会报错Uncaught exception 'RedisException' with message 'read error on connection' 。初步判定是多个进程调用redid导致的,我只用一个task,是没有问题的。
看到swoole的文档:

需要在onWorkerStart中建立redis连接,那么有work 、task 各8个,如果这样的话就会有16个redis连接(task、work启动时都会调用onWorkerStart函数)。

1)需要建立16个redis连接,我这样理解对吗?该如何改进呢?
2)每个redis连接我都要保存吗?这样岂不是用起来有点麻烦。
3)如果我以后work、task的数值增加,岂不会有更多的redis连接,我该怎么办呢?
4)是不是我使用方式有问题,那么我该怎么使用呢?

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(3)
怪我咯

对,每个进程都要创建一个连接。如果启动了200个进程就一定需要200个连接。你的使用方式没错。

巴扎黑

这样使用确实会创建16个连接。
不想保存连接的话,可以在用到redis时再创建连接,用pconnect方式。
由于不同进程的redis连接不能共享,随着进程数增加是会有更多的redis

可以在worker进程中写主要逻辑。涉及redis操作的部分封装成任务,由task进程执行。在启动task时,使用taskwait方法,等待任务的返回。这样相当于把task进程当成了连接池。

如果还有其他的慢速任务需要用task异步处理,则可以在启动task时,传入指定workerid,这样其实就是把task进程区分功能,有的负责redis数据处理,有的负责慢速任务。

ringa_lee

1: redis和mysql机制不一样, 不怕连接多。
2: 没必要用pconnect, swoole本身是长驻内存的,connect之后,除非是worker重启了,连接才失效。
3: read error on connection, 只能你复用了同一个连接,但这个连接可能在其他的进程是被close了。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号