0

0

nosql - REDIS+PHP的并发连接数过低

php中文网

php中文网

发布时间:2016-06-06 20:52:01

|

1613人浏览过

|

来源于php中文网

原创

目前碰到一个棘手的问题,用REDIS来做缓存的时候,发现在并发情况下,REDIS 对于短连接的处理能力很差。
测试环境:CENTOS 6.2 PHP 5.4 PHPREDIS2.0插件 nginx/1.1.16
DELL 2950 八核八G REDIS 的并发数的配置文件部分已经注释掉了。硬盘保存功能也关闭了。
内网同样配置的机器用webbench 发起攻击,并发调用同样的PHP

$sUserID = 'abcasdasda';
$sKey = 'ProvinceName';
$redis = new Redis();
$nError = $redis->connect('127.0.0.1', 6379);
if ($nError != 1)
    echo -9998;
$b = $redis->hget($sUserID, $sKey);
if(empty($b))
	echo -9999;
else	
$redis->incr('newCount');
$redis->close();

在浏览器中测试成功后,运行一次php 。newcount 加一。

运行webbench 经过N轮各种参数的测试,每秒newcount 只能增加470个左右。
同样环境下运行插入MYSQL 的PHP

每秒插入的记录数,稳定在2000以上,远远比REDIS 要完成的操作多。

立即学习PHP免费学习笔记(深入)”;

想请问大家,如何能提高REDIS 的并发能力,我们的应用场景是短链接为主,每个链接处理的问题都比较少。
希望能利用REDIS 作为内存数据库 实时高速读写 。

希望高人给出建议 谢谢!

回复内容:

目前碰到一个棘手的问题,用REDIS来做缓存的时候,发现在并发情况下,REDIS 对于短连接的处理能力很差。
测试环境:CENTOS 6.2 PHP 5.4 PHPREDIS2.0插件 nginx/1.1.16
DELL 2950 八核八G REDIS 的并发数的配置文件部分已经注释掉了。硬盘保存功能也关闭了。
内网同样配置的机器用webbench 发起攻击,并发调用同样的PHP

$sUserID = 'abcasdasda';
$sKey = 'ProvinceName';
$redis = new Redis();
$nError = $redis->connect('127.0.0.1', 6379);
if ($nError != 1)
    echo -9998;
$b = $redis->hget($sUserID, $sKey);
if(empty($b))
	echo -9999;
else	
$redis->incr('newCount');
$redis->close();

在浏览器中测试成功后,运行一次php 。newcount 加一。

运行webbench 经过N轮各种参数的测试,每秒newcount 只能增加470个左右。
同样环境下运行插入MYSQL 的PHP

每秒插入的记录数,稳定在2000以上,远远比REDIS 要完成的操作多。

立即学习PHP免费学习笔记(深入)”;

想请问大家,如何能提高REDIS 的并发能力,我们的应用场景是短链接为主,每个链接处理的问题都比较少。
希望能利用REDIS 作为内存数据库 实时高速读写 。

希望高人给出建议 谢谢!

redis号称并发可以达到10W级别,但那是针对C API而言,如果用PHP API效果就差了很多,一般推荐的解决方案是采用nginx lua的扩展来实现nginx对redis的操作,并不穿透到PHP层,PHP对redis的并发也只能到这个层次了

我在自己的双核cpu的测试机上,测试的结果也跟你大同小异,但是我要说的是大家都忽略了一个事实,那就是redis是单进程单线程的,而mysql是多进程并发的。也就是说redis只能利用到计算机的一个核心,而mysql可以用到所有核心。在redis的官方benchmark页面(http://redis.io/topics/benchmarks)有这样一句话

Redis is a single-threaded server. It is not designed to benefit from multiple CPU cores. People are supposed to launch several Redis instances to scale out on several cores if needed. It is not really fair to compare one single Redis instance to a multi-threaded data store.

你的测试服务器有8个核心,那么mysql测试出来的数据是2000左右,平均到单核就是250左右,redis显然比它高一些,虽然说不能这么简单的换算,但是还是能说明一部分问题。

还有就是缓存发挥最大作用的地方应该是随机读写,在这一部分它跟传统数据库拉开了性能差距。

PHP真是躺着也中枪,如果用对了,phpredis的效能实际并不比所谓行业标准差太多,请放心。

ecshop
ecshop

本版本全面兼容php5.6+,并且修复了许多官方程序的低级代码bug。在apache 2.4.17+php5.6.15环境下测试通过,人格保证无毒无木马,仅仅是一名ecshop热爱者心血来潮之作。ecshop编译更新日志:1、加入最新官方补丁。2、修改数据库连接底层为mysqli, 现在完美无缺了。3、再次对所有代码进行细节修复。4、adminers更新至1.1.2, 在线管理数据库的神器。5、测

下载

首先,MySQL并不慢,可以把MySQL想象成非常快的文件读写服务。insert语句只不过是顺序地在文件尾部附加内容,更何况还有执行优化(并不是每条insert都flush到磁盘)。

其次,你的测试代码不公平,由于没有用Redis的pipeline(意味着每个操作都要取得返回值),你先调了一个hGet,这就已经是网络IO的一个来回了;然后才incr操作(又一个来回)。相当于你在MySQL里先select一下,再insert。

最后,虽然影响因子不大,但Redis的incr应该和MySQL的update比较吧……

题外话:你单个脚本需要做的redis读写比较少,并不意味着你的redis就得短连接,相反更应该用长连接。

EDIT:phpredis本身就支持长连接:https://github.com/nicolasff/phpredis...

这个问题很多使用PHP + Redis的人都会遇到。为了减少Redis的连接开销,最简单直接的方法就是通过proxy收敛连接数据。

目前比较靠谱的是应该算Twitter开源的twemproxy

twemproxy中文介绍:http://blog.nosqlfan.com/html/4147.html

对于nginx + lua操作Redis的方案,逻辑上可以指定连接池大小,连接池中的连接是持久连接,建立后可以重用,当并发数超过连接池中的连接数,lua会创建短连接来支持。但我们线上出现过问题,在长时间运行后,连接数会超过连接池设置的大小且不释放,直接导致Redis连接数超标拒绝连接。

如果短连接不释放的话,可以通过系统配置来回收socket连接。
sysctl net.ipv4.tcp_timestamps=1
sysctl net.ipv4.tcp_tw_recycle=1

或者
vim /etc/sysctl.conf
net.ipv4.tcp_timestamps=1
net.ipv4.tcp_tw_recycle=1
/sbin/sysctl -p //使之生效
第一种方法重启后失效

主要问题是在tcp连接消耗上,可以采用长连接来解决这个问题,pconnect()

nginx lua的扩展 有哪种可以推荐的 。这样一来是不是就是把REDIS 封装成了一个HTTP代理服务?

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Java 项目构建与依赖管理(Maven / Gradle)
Java 项目构建与依赖管理(Maven / Gradle)

本专题系统讲解 Java 项目构建与依赖管理的完整体系,重点覆盖 Maven 与 Gradle 的核心概念、项目生命周期、依赖冲突解决、多模块项目管理、构建加速与版本发布规范。通过真实项目结构示例,帮助学习者掌握 从零搭建、维护到发布 Java 工程的标准化流程,提升在实际团队开发中的工程能力与协作效率。

11

2026.01.12

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

106

2026.01.09

c++框架学习教程汇总
c++框架学习教程汇总

本专题整合了c++框架学习教程汇总,阅读专题下面的文章了解更多详细内容。

64

2026.01.09

学python好用的网站推荐
学python好用的网站推荐

本专题整合了python学习教程汇总,阅读专题下面的文章了解更多详细内容。

139

2026.01.09

学python网站汇总
学python网站汇总

本专题整合了学python网站汇总,阅读专题下面的文章了解更多详细内容。

13

2026.01.09

python学习网站
python学习网站

本专题整合了python学习相关推荐汇总,阅读专题下面的文章了解更多详细内容。

19

2026.01.09

俄罗斯手机浏览器地址汇总
俄罗斯手机浏览器地址汇总

汇总俄罗斯Yandex手机浏览器官方网址入口,涵盖国际版与俄语版,适配移动端访问,一键直达搜索、地图、新闻等核心服务。

93

2026.01.09

漫蛙稳定版地址大全
漫蛙稳定版地址大全

漫蛙稳定版地址大全汇总最新可用入口,包含漫蛙manwa漫画防走失官网链接,确保用户随时畅读海量正版漫画资源,建议收藏备用,避免因域名变动无法访问。

480

2026.01.09

php学习网站大全
php学习网站大全

精选多个优质PHP入门学习网站,涵盖教程、实战与文档,适合零基础到进阶开发者,助你高效掌握PHP编程。

52

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
进程与SOCKET
进程与SOCKET

共6课时 | 0.3万人学习

Redis+MySQL数据库面试教程
Redis+MySQL数据库面试教程

共72课时 | 6.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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