Redis长短链接的区别
|
本文介绍了phpredis中与redis建立连接的两种方式:connect(短连接)和pconnect(长连接)的区别。
问题背景:
项目采用LNMP架构,考虑到数据访问性能问题,因此使用redis来做数据存储,之前一直都是通过直连IP的方式来访问redis,但是运维说redis用sentinel做的高可用,如果直连IP去访问,高可用就无法生效了,因此决定切换成域名的访问方式。
切换域名之后,问题就来了,很多接口出现调用超时的情况,在php-fpm的慢日志中可以看到超时接口的函数调用栈,接口的逻辑很简单,只是从redis取一些数据出来,并没有做其他事情,甚至连日志都没打,为何会超时呢?
问题追踪:
既然当天做了切换访问方式的变更,就一定跟这个有关。切换前后唯一的区别就是切换成域名的访问方式之后,每次连接redis需要先到域名服务器将域名解析成IP,然后再去连接,如果直连IP就可以省去域名解析的过程,难道是域名解析速度太慢导致超时?
问题定位:
写了一个简单的脚本,看了一下域名访问和IP访问的耗时差别到底多大,代码如下,
//test.php
<?php
function microtime_float()
{
list($usec, $sec) = explode(” “, microtime());
return ((float)$usec + (float)$sec);
}
$begin = microtime_float();
$redis=new Redis();
$redis->connect(“10.100.24.198″,6380);
$end = microtime_float();
$ip_cost = intval(($end – $begin)*1000000);
$begin = microtime_float();
$redis->connect(“videogh-6380-redis1.m6.tudou.com”,6380);
$end = microtime_float();
$domain_cost = intval(($end – $begin)*1000000);
echo “ip cost
ip_cost us,domain_cost domain_cost us\n”;//结果
ip cost:514 us,domain_cost:26972 us
IP直连和域名连接的耗时竟然差了40倍之多!!难怪会有如此多的请求超时。
问题解决:
既然切换成域名后,与redis频繁建立连接导致超时,因此考虑redis的长连接方式,即pconnect方式。注意,这里说的长连接和短连接,并不是指TCP和UDP,其实redis本身也只支持域套接字和TCP连接,这里说的长连接是指多次请求之间可以对redis连接进行复用,即只在第一次执行请求是建立连接,以后每次请求只是从连接池中将连接取出,不再重新建立连接;而短连接表示连接在多次请求之间不可复用,每次请求都需要重新建立连接。
理论上虽然可行,但还需要对pconnect的实际执行效果进行验证,验证过程如下。
验证过程:
考虑用抓包和lsof两种方式进行验证,
准备工作
环境:
Linux+nginx+fpm+PHP5.5
将fpm的参数配置为
pm.max_children = 1;
pm.start_servers = 1;
pm.max_spare_servers = 1;
通过修改php-fpm的参数,将php-fpm的进程设置为一个,这样就可以准确找到执行请求的php-fpm进程id,
![]() 页面对应的php代码
public function test_redis()
{
$redis = new Redis();
//redis->connect(“127.0.0.1”, 6379); //connect连接
redis->pconnect(“127.0.0.1”, 6379); //pconnect连接
exit();
}
1、lsof方式
先用pconnect的方式连接方式请求页面的test_redis函数,并执行命令lsof –n –p (fpm-pid),查看php-fpm的句柄使用情况,如下图所示
![]() 说明请求结束后,php-fpm中仍然保持与redis的连接,下次请求仍然可以对该连接进行复用;如果使用connect,则获取不到连接信息。
2、抓包方式
抓包命令:tcpdump –i any –X –v –vv tcp and dst port 6379
同样用connec方式和pconnect方式执行多次,通过抓包发现,使用connect方式连接每次都能抓到包,说明connect每次都会建立连接;使用pconnect方式连接只有第一次访问的时候能抓到包,以后每次执行都抓不到包,说明连接只建立一次。
而且,当使用pconnect方式连接时,通过redis-cli连接到redis,并执行info clients,可以看到connected_clients=2,排除终端的命令行连接以外,还有一个是与php-fpm保持的长连接,说明即使请求结束,php-fpm仍然会保留与redis的连接;如果采用connect方式进行连接,则connected_clients=1,即请求结束后php-fpm就释放了与redis的连接。
|
原文链接:http://bbs.redis.cn/forum.php?mod=viewthread&tid=721
Redis长短链接的区别的更多相关文章
- C#语法——泛型的多种应用 C#语法——await与async的正确打开方式 C#线程安全使用(五) C#语法——元组类型 好好耕耘 redis和memcached的区别
C#语法——泛型的多种应用 本篇文章主要介绍泛型的应用. 泛型是.NET Framework 2.0 版类库就已经提供的语法,主要用于提高代码的可重用性.类型安全性和效率. 泛型的定义 下面定义了 ...
- 转:Redis和Memcache的区别分析
Redis和Memcache的区别分析 原文链接:http://blog.csdn.net/u013474436/article/details/48632665 简单区别: 1. Redis中,并 ...
- MySQL、MongoDB、Redis 数据库之间的区别与使用(本章迭代更新)
MySQL.MongoDB.Redis 数据库之间的区别与使用 MySQL.MongoDB.Redis 数据库之间的区别与使用(本章迭代更新) update:2019年2月20日 15:21:19(本 ...
- Redis与Memcache的区别
Redis与Memcache的区别 数据类型: redis数据类型丰富,支持set liset等类型 memcache支持简单数据类型,需要客户端自己处理复杂对象 持久性: red ...
- Redis和Memcache的区别
Redis和Memcache的区别 总结一: 1.数据类型 redis数据类型丰富,支持set liset等类型 memcache支持简单数据类型,需要客户端自己处理复杂对象 2.持久性 redis支 ...
- Redis与Memcached的区别
传统MySQL+ Memcached架构遇到的问题 实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样的架构,但随着业务数据量 ...
- 也谈谈 Redis 和 Memcached 的区别
本文作者: 伯乐在线 - 朱小厮 . 说到redis就会联想到memcached,反之亦然.了解过两者的同学有那么个大致的印象: redis与memcached相比,比仅支持简单的key-value数 ...
- 【转载】Redis与Memcached的区别
传统MySQL+ Memcached架构遇到的问题 实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样的架构,但随着业务数据量 ...
- redis 资料链接
redis 资料链接 http://blog.nosqlfan.com/html/3537.html
随机推荐
- 小技巧 Mongodb 动态查询 除去 _class 条件
最近在做通用模板标准示例项目,在使用 spring data jpa Mongodb 的时候,动态查询会代入 _class条件. 为什么这么做其实也很好理解,写入数据库的数据中是有这个字段的.接受 ...
- 子组件props接受父组件传递的值,能不能修改的问题
参考链接:https://www.cnblogs.com/pangchunlei/p/11139356.html
- rpm 包安装调试缺少依赖无法安装的方法
今天在给龙芯中标机器安装360 10.0.2001.1 版本时 发现有依赖过不去. 因为依赖关系而调过软件包: browser360-cn-stable-10.0.2001.0-1.mips64el ...
- 二维状压DP经典题
炮兵阵地 题目链接 题目大意:在n*m的地图上放置炮兵,每个炮兵的攻击范围是上下左右两格内,有两种不同的地形,山地(用"H" 表示),平原(用"P"表示),只有 ...
- JavaScript(js)笔记
js注释 JavaScript注释与Java注释相同 // 单行注释 /* 多行注释 */ js五大基本类型: number(数值型).string(字符串性).boolean(布尔型).unde ...
- Java考题知识点
挑战10个最难回答的Java面试题(附答案) - 里奥ii的文章 - 知乎 https://zhuanlan.zhihu.com/p/79186037 1.java的基本编程单元是类,基本存储单元是变 ...
- fiddler笔记:Find Session窗口
通过Edit菜单选项或CTRL+F打开Find Session窗口.其主要是用来搜索捕捉到的请求和响应. find 指定要搜索的文本 Options Search 支持的搜索选项:Requests a ...
- python保留字及其说明
保留字 说 明 and 用于表达式运算,逻辑与操作 as 用于类型转换 assert 断言,用于判断变量或条件表达式的值是否为真 break 中断循环语句的执行 class 用于定义类 con ...
- 消息服务百科全书——Kafka基本原理介绍
架构 1.1 总体架构 因为Kafka内在就是分布式的,一个Kafka集群通常包括多个代理. 为了均衡负载,将话题分成多个分区,每个代理存储一或多个分区.多个生产者和消费者能够同时生产和获取消息. 一 ...
- MVC和WebApi中设置Area中的页为首页
拿WebApi为例,我们一般会生成一份帮助文档,帮助文档会在Area中 我们现在要讲帮助文档设为首页 只需在App_Start文件夹下添加 RouteConfig 类 public class Rou ...
ip_cost us,domain_cost
