Redis - PHP扩展 - phpredis - 安装和使用

1.应用场景

主要用于学习php redis扩展库,phpredis的使用,如何在项目中应用。

2.学习/操作

1.文档阅读

https://pecl.php.net/package/redis

源码

GitHub - phpredis/phpredis: A PHP extension for Redis -- Redis

phpredis/cluster.markdown at develop · phpredis/phpredis · GitHub -- RedisCluster 机群使用

补充

网络编程释疑之:TCP半开连接的处理_永远的朋友的技术博客_51CTO博客

网络编程释疑之:TCP连接拔掉网线后会发生什么_永远的朋友的技术博客_51CTO博客

2.整理输出

介绍

phpredis

是php的针对redis编写的底层扩展库,使用c语言+ php + other编写,支持单实例和机群实例操作。

安装扩展

PHP - PECL - PHP扩展库 - 学习/实践

或者通过编译安装

phpredis -- Redis编译安装,PHP 7 安装 Redis 扩展 - web开发 - 亿速云

命令如下:

wget https://github.com/phpredis/phpredis/archive/refs/tags/5.3.7.tar.gz

mv 5.3.7.tar.gz ./tmp/

tar -zxvf ./tmp/phpredis-5.3.7.tar.gz

cd phpredis-5.3.7

phpize

./configure

make -j

make install

编译安装后的结果:

添加

extension=redis.so

或者「.so后缀可省」

extension=redis

到php.ini配置文件中

php --ri redis

插入:

centOS7中安装 php redis扩展

2.1 单实例Redis使用

code example

$redis = new Redis([
    'host' => '127.0.0.1',
    'port' => 6379,
    'connectTimeout' => 2.5,
    'auth' => ['phpredis', 'phpredis'],
    'ssl' => ['verify_peer' => false],
    'backoff' => [
        'algorithm' => Redis::BACKOFF_ALGORITHM_DECORRELATED_JITTER,
        'base' => 500,
        'cap' => 750,
    ],
]);

更多详情参见

GitHub - phpredis/phpredis: A PHP extension for Redis

2.2 多实例机群RedisCluster使用

code example

// Create a cluster setting three nodes as seeds
$obj_cluster = new RedisCluster(NULL, Array('host:7000', 'host:7001', 'host:7003'));

// Connect and specify timeout and read_timeout
$obj_cluster = new RedisCluster(NULL, Array("host:7000", "host:7001"), 1.5, 1.5);

// Connect with read/write timeout as well as specify that phpredis should use
// persistent connections to each node.
$obj_cluster = new RedisCluster(NULL, Array("host:7000", "host:7001"), 1.5, 1.5, true);

// Connect with cluster using password.
$obj_cluster = new RedisCluster(NULL, Array("host:7000", "host:7001"), 1.5, 1.5, true, "password");

详情使用参见:

phpredis/cluster.markdown at develop · phpredis/phpredis · GitHub

后续补充

...

3.问题/补充

1. phpredis的通信过程,通信协议?

通信协议应该是基于TCP协议,进行封装的应用层私有协议,Redis协议。

通信过程,就是在TCP协议基础上,添加了一些私有信息,请求头,请求体等,从而可以在Client和Server之间进行通信。

phpredis使用基于TCP的通信协议与Redis服务器进行通信,并采用Redis协议进行封装和解析。

通信过程大致如下:

  1. phpredis使用底层的TCP连接与Redis服务器建立连接。

  2. 客户端(phpredis)构建请求消息,包括请求头和请求体。请求头通常包括Redis命令(如SET、GET等)以及相应的参数。

  3. 客户端将请求消息发送给Redis服务器,通过底层的TCP连接将消息传输到服务器端。

  4. 服务器接收到请求消息后,使用Redis协议解析请求消息,提取出命令和参数。

  5. 服务器执行相应的命令操作,并生成响应消息,包括响应头和响应体。响应头通常包括状态码和内容长度等信息。

  6. 服务器将响应消息发送回客户端,通过TCP连接将消息传输到客户端。

  7. 客户端接收到响应消息后,使用Redis协议解析响应消息,提取出响应结果。

  8. 客户端根据需要处理响应结果,完成相应的业务逻辑。

在这个通信过程中,phpredis和Redis服务器之间通过TCP连接进行数据传输,并使用Redis协议对请求消息和响应消息进行封装和解析。Redis协议是一种简单的文本协议,使用行协议,以明确的格式表示命令和响应。这种协议设计简洁高效,使得phpredis能够与Redis服务器进行有效的通信。

2. Redis是单reactor单线程模型

使用Epoll IO多路复用模型。

不准确。Redis是一个使用事件驱动的单线程模型,但它可以使用多个反应器(reactor)实例来处理并发请求。每个反应器负责处理一部分客户端连接和请求。虽然Redis本身在处理命令时是单线程的,但通过使用I/O多路复用技术和非阻塞I/O操作,它能够高效地处理并发请求。

Redis的单线程模型使得它能够避免多线程操作的复杂性和线程安全问题,并且通过使用事件循环和非阻塞操作,可以实现高性能和低延迟的数据访问。然而,需要注意的是,Redis的单线程模型适用于大多数情况下的高并发读写操作,但在某些特定场景下,如大规模写入操作或复杂计算密集型任务,可能会有性能限制。

总结一下,Redis采用的是单线程的事件驱动模型,通过利用事件循环和非阻塞I/O操作来处理并发请求,从而提供高性能的数据存储和访问能力。

3. 如果没有看到连接关闭的相关代码,是使用默认的短链接,以及默认的超时时间?

初步判断应该是使用TCP段连接,数据传输完毕后,会close连接。

过程:

创建/open connect --> 数据传输 --> close connect

默认超时时间是否可配置:「应可配置」

而且TCP短连接,不单单是Redis,对于其他服务/组件使用TCP短连接应都是如此。

是的,如果在代码中没有显式关闭Redis连接的相关代码,通常会使用默认的短连接方式和默认的超时时间。

在Redis客户端中,如果没有显式调用关闭连接的方法,例如close()disconnect()等,那么客户端会默认使用短连接方式。短连接是指在每次操作完成后立即关闭与Redis服务器的连接,这样可以确保及时释放资源,但也会增加与服务器建立连接的开销。

对于超时时间,默认情况下,Redis客户端会使用默认的超时时间设置,通常为几秒钟。这意味着如果Redis服务器在一定时间内没有响应客户端的请求,客户端会认为连接超时,并关闭连接。

需要注意的是,虽然使用短连接和默认超时时间可能是合适的,但在某些特定的应用场景中,可能需要根据实际需求进行自定义配置,例如使用长连接或更长的超时时间来适应特定的业务需求。因此,在开发中,需要根据具体情况,显式地管理Redis连接的打开和关闭,并根据需要设置适当的超时时间。

4. 长连接可以使用在集群服务[切片集群]中吗?

如redis-cluster,或者 mysql-cluster等 ?

GitHub - phpredis/phpredis: A PHP extension for Redis

关于pconnect, popen的一段话,

The connection will not be closed on end of request until the php process ends. So be prepared for too many open FD's errors (specially on redis server side) when using persistent connections on many servers connecting to one redis server.

在 php 进程结束之前,连接不会在请求结束时关闭。

因此,在连接到一个 redis 服务器的多台服务器上使用持久连接时,请为过多的 open FD 错误(特别是在 redis 服务器端)做好准备。

同时加上redis-cluster支持随机读写算法,也就意味着,上一次的连接[Server 1],可能下一次[Server 2],但是Server2并没有建立TCP连接的情况。

从而个人认为,可以初步推断,应该是不行。更多确认TBD --------> (后来)

如果没有连接server2的连接, 就重新建立连接(长连接), 然后将这些连接保存共享, 等待复用.

5. predis 与 phpredis扩展的区别

实际上,Redis和HTTP都是应用层协议。

应用层协议是在网络通信中位于最高层的协议,用于定义不同应用程序之间的通信规则和数据交换格式。它们建立在传输层(如TCP)之上,使用传输层提供的可靠的数据传输服务。

Redis和HTTP都运行在应用层,而不是直接在IP/TCP协议上操作。它们定义了特定的通信规则和数据格式,以便客户端和服务器之间进行有效的交互。

总结:Redis和HTTP都是应用层协议,用于定义数据交换和通信规则,但在通信方式、数据格式和用途上有所不同。

4.参考

参见上面文档列表

后续补充

...

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值