高斋晓开卷,独共圣人语。这篇文章主要讲述使用redis pipeline打包执行多条任务相关的知识,希望能为你提供帮助。
这里重点说一下pipeline。
管道(pipeline)可以一次性发送多条命令并在执行完后一次性将结果返回。
执行流程:
打包开始->
缓存->
打包结束->
发送->
执行->
返回执行结果。
优点:
1.pipeline 通过减少客户端与 redis 的通信次数来实现降低往返延时时间。
pipeline 通过打包命令,一次性执行,可以节省 连接->
发送命令->
返回结果 所产生的往返时间,减少网络I/O的调用次数。
2.而且 Pipeline 实现的原理是队列,而队列的原理是时先进先出,这样就保证数据的顺序性。
通俗点:pipeline就是把一组命令进行打包,然后一次性通过网络发送到Redis。同时将执行的结果批量的返回回来。
缺点:
1.pipeline 每批打包的命令不能过多,因为 pipeline 方式打包命令再发送,那么 redis 必须在处理完所有命令前先缓存起所有命令的处理结果。这样就有一个内存的消耗。
2.pipeline 是责任链模式,这个模式的缺点是,每次它对于一个输入都必须从链头开始遍历(参考Http Server处理请求就能明白),这确实存在一定的性能损耗。
最重要的注意点:
pipeline 不保证原子性,如果要求原子性的,不推荐使用 pipeline。
下面是php redis扩展官方用法介绍
multi, exec, discard.Description: Enter and exit transactional mode.
Parameters(optional) Redis::MULTI or Redis::PIPELINE. Defaults to Redis::MULTI. A Redis::MULTI block of commands runs as a single transaction;
a Redis::PIPELINE block is simply transmitted faster to the server, but without any guarantee of atomicity. discard cancels a transaction.
Return valuemulti() returns the Redis instance and enters multi-mode. Once in multi-mode, all subsequent method calls return the same object until exec() is called.
Example$ret = $redis->
multi()
->
set(key1, val1)
->
get(key1)
->
set(key2, val2)
->
get(key2)
->
exec();
/*
$ret == Array(0 =>
TRUE, 1 =>
val1, 2 =>
TRUE, 3 =>
val2);
*/
这里特意提到一句:
意思是pipeline的目的是快速的将打包的操作传输到redis服务,但不能保证原子性。
php代码实现:
//开启pipeline模式
$pipelineObj = $redis->
multi(Redis::PIPELINE);
//在$pipelineObj对象上增加打包任务操作
$pipelineObj->
set(key1, val1)
->
get(key1)
->
set(key2, val2)
->
get(key2);
//或者这样写
$pipelineObj->
set(key1, val1);
$pipelineObj->
get(key1);
$pipelineObj->
set(key2, val2);
$pipelineObj->
get(key2);
//打包完成,执行exec发送执行任务。
$pipelineObj->
exec();
参考
官网pipeline介绍
【使用redis pipeline打包执行多条任务】php redis官方扩展
推荐阅读
- ubuntu 安装 Visual Studio Code(简称(vsCode))
- XPath|掌握数据采集工具的核心技巧
- 记一次MySql重置root密码无效
- 用 GraphScope 像 NetworkX 一样做图分析
- MySQL数据库高级操作
- 剑指Offer-用两个栈实现队列
- ELT.ZIPOpenHarmony啃论文俱乐部——细数生活中的压缩点滴
- MySQL主从复制与读写分离
- python 包之 Pillow 图像处理教程