问题答案

目前碰到一个棘手的问题,用REDIS来做缓存的时候,发现在并发情况下,REDIS 对于短连接的处理能力很差。

测试环境:CENTOS 6.2 PHP 5.4 PHPREDIS2.0插件 nginx/1.1.16

DELL 2950 八核八G REDIS 的并发数的配置文件部分已经注释掉了。硬盘保存功能也关闭了。

内网同样配置的机器用webbench 发起攻击,并发调用同样的PHP


 

  1. $sUserID = 'abcasdasda'
  2.  
  3. $sKey = 'ProvinceName'
  4.  
  5. $redis = new Redis(); 
  6.  
  7. $nError = $redis->connect('127.0.0.1', 6379); 
  8.  
  9. if ($nError != 1) 
  10.  
  11.     echo -9998; 
  12.  
  13. $b = $redis->hget($sUserID$sKey); 
  14.  
  15. if(emptyempty($b)) 
  16.  
  17.     echo -9999; 
  18.  
  19. else     
  20.  
  21. $redis->incr('newCount'); 
  22.  
  23. $redis->close(); 

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


运行webbench 经过N轮各种参数的测试,每秒newcount 只能增加470个左右。

同样环境下运行插入MYSQL 的PHP


 

  1. <?php 
  2.  
  3. $con = mysql_connect("localhost","root","abc123"); 
  4.  
  5. if (!$con) { 
  6.  
  7. die('Could not connect: ' . mysql_error()); 
  8.  
  9. echo -9999;//...... 
  10.  
  11. return -9999; 
  12.  
  13.  
  14. else { 
  15.  
  16. mysql_select_db("test"$con); 
  17.  
  18.  
  19.  
  20. if(isset($_SERVER["HTTP_X_FORWARDED_FOR"])) 
  21.  
  22.  
  23.         $realip = $_SERVER["HTTP_X_FORWARDED_FOR"];   
  24.  
  25.     } 
  26.  
  27.     elseif (isset($_SERVER["HTTP_CLIENT_IP"])) 
  28.  
  29.  
  30.         $realip = $_SERVER["HTTP_CLIENT_IP"];   
  31.  
  32.     } 
  33.  
  34.     else 
  35.  
  36.  
  37.         $realip = $_SERVER["REMOTE_ADDR"]; 
  38.  
  39.     } 
  40.  
  41. $URL=$_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; 
  42.  
  43. $query="Insert into url_log (time,url,u_return,client_ip) values ( now(), '".$URL."', '".$strReturn."','".$realip."')"
  44.  
  45. if(mysql_query($query)) 
  46.  
  47.  
  48.         echo "DB Insert OK";//...... 
  49.  
  50.     } 
  51.  
  52.     else 
  53.  
  54.  
  55.         echo "DB Insert Error";//...... 
  56.  
  57.     } 
  58.  
  59.  
  60. mysql_close($con); 
  61.  
  62. ?> 

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


想请问大家,如何能提高REDIS 的并发能力,我们的应用场景是短链接为主,每个链接处理的问题都比较少。

希望能利用REDIS 作为内存数据库 实时高速读写 。


希望高人给出建议 谢谢!

标签: PHP redis
答案

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

举一反三