redis使用管道pipeline提升批量操作性能(php演示)

Redis是一个TCP服务器,支持请求/响应协议。 在Redis中,请求通过以下步骤完成:

  • 客户端向服务器发送查询,并从套接字读取,通常以阻塞的方式,用于服务器响应。
  • 服务器处理命令并将响应发送回客户端。

如果需要一次执行多个redis命令,以往的方式需要发送多次命令请求,有redis服务器依次执行,并返回结果,

为了解决此类问题,设计者设计出了redis管道命令:

  • 客户端可以向服务器发送多个请求,而不必等待回复,并最终在一个步骤中读取回复,从而大大增加了协议性能

做了测试,使用pipeline的时长为603.4ms,不使用则为10716.9ms,差距有18倍之多!

以下是代码:

<?php

namespace App\Http\Controllers;
use Illuminate\Support\Facades\Redis;

class LessonsController extends Controller
{
    public function showProfile()
    {

        $this->G(‘t‘);
//        redis::pipeline();
        for ($i=0; $i < 100000 ; $i++) {
            redis::set("test_{$i}", pow($i, 2));
            redis::get(‘test_{$i}‘);
        }
        redis::exec();
        $this->G(‘t‘,‘r‘);
    }

    public function G($start,$end=‘‘,$dec=4)
    {
        static $_info = array();
        if (!empty($end))
        {
            if(!isset($_info[$end])) $_info[$end] = microtime(TRUE);
            $sconds = number_format(($_info[$end]-$_info[$start]), $dec) * 1000;
            echo "{$sconds}ms<br />";
        }
        else
        {
            $_info[$start] = microtime(TRUE);
        }
    }
}

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; line-height: 19.0px; font: 13.0px "Helvetica Neue" }

原文地址:https://www.cnblogs.com/lamp01/p/8448931.html

时间: 2024-10-29 19:38:05

redis使用管道pipeline提升批量操作性能(php演示)的相关文章

redis之管道——pipeline

redis 是 CS 模式,Redis客户端与Redis之间使用TCP协议进行连接,一个客户端可以通过一个socket连接发起多个请求命令,每个请求命令发出后client通常会阻塞并等待redis服务处理,redis处理完后请求命令后会将结果通过响应报文返回给client,因此当执行多条命令的时候都需要等待上一条命令执行完毕才能执行.如果一次性批量数据单次操作,会有网络延迟.而redis也是单线程的. 而Pipelining可以满足批量的操作,把多个命令连续的发送给Redis Server,然后

redis学习笔记 - Pipeline与事务

原文 Redis提供了5种数据结构,但除此之外,Redis还提供了注入慢查询分析,Redis Shell.Pipeline.事务.与Lua脚本.Bitmaps.HyperLogLog.PubSub.GEO等附加功能,这些功能可以在某些场景发挥很重要的作用. Pipeline 1. Pipeline概念 Redis客户端执行一条命令分为以下四个步骤: 1.发送命令2.命令排队3.命令执行4.返回结果 其中,第一步+第四步称为Round Trip Time(RTT,往返时间). Redis提供了批量

[Linux] 流 ( Stream )、管道 ( Pipeline ) 、Filter- 笔记

流 ( Stream ) 1. 流,是指可使用的数据元素一个序列. 2. 流,可以想象为是传送带上等待加工处理的物品,也可以想象为工厂流水线上的物品. 3. 流,可以是无限的数据. 4. 有一种功能,处理这一个流同时产生着另一个流.这种功能被成为 过滤 ( Filter ).使用管道 ( pipelie ) 将这些功能进行连接. Unix 管道 ( Pipeline ) 1. 管道连接着处理元素,一个处理元素的输出是下一个处理处理元素的输入. 2. 管道能加快数据处理速度. 2. Unix 下的

redis 使用管道提升写入的性能[pipeline]

看了手册的都知道multi这个命令的作用就好比是mysql的事务的功能,但是大家都知道事务吗,就是在操作的过程中,把整个操作当作一个原子来处理,避免由于中途出错而导致最后产生的数据不一致,而产生BUG ,Mysql的事务功能可以做到这点,但是在redis中的multi,手册中说是把多个命令当作个事务来处理,但是在真正的测试之后发现并没有所说的事务的功能,个人经过测试发现,只有把他watch命令结合起来用,方可显现出其具有事务的功能,所以这点很是迷惑,关键是有一点很诧异,当启用了multi命令之后

redis通过pipeline提升吞吐量

案例目标 简单介绍 redis pipeline 的机制,结合一段实例说明pipeline 在提升吞吐量方面发生的效用. 案例背景 应用系统在数据推送或事件处理过程中,往往出现数据流经过多个网元: 然而在某些服务中,数据操作对redis 是强依赖的,在最近的一次分析中发现: 一次数据推送会对 redis 产生近30次读写操作! 在数据推送业务中的性能压测中,以数据上报 -> 下发应答为一次事务: 而对于这样的读写模型,redis 的操作过于频繁,很快便导致系统延时过高,吞吐量低下,无法满足目标:

JDBC批量操作性能提升

JDBC 当使用INSERT INTO....VALUES()语句批量插入的时候,应该使用JDBC的PreparedStatement的批量操作方法,而不是采用一条一条执行的方法. 例如(来源:http://superjavason.iteye.com/blog/255423): 如上图,代码有3个关键的处理步骤: 1)关闭自动提交 2)addBatch 3)executeBatch 使用这种方法,SQLite测试时的效果提升非常明显,从 10000/s提升到100000/s(数据仅做参考,不能

redis pipe管道

redis命令在从提交到返回处理结果的过程中,消耗的时间我们称之为RTT(往返时间). 在需要批量执行redis 命令的场景下,如果命令单条逐个执行,那么总共花费的时间是命令条数 N * RTT. redis 提供了管道技术来提高批量执行效率,即将多个命令打包发送给redis服务端,所有命令执行完后,再将所有结果打包返回. 在所有命令执行结束前,redis服务器会缓存已执行结束的结果. 在redis-cli命令行中, 使用redis管道技术时,我们通常将待执行的命令放到一个文本里,比如comma

使用python操作redis(管道)

一.redis连接 redis提供两个类Redis和StrictRedis用于实现Redis的命令,StrictRedis用于实现大部分官方的命令,并使用官方的语法和命令,Redis是StrictRedis的子类,用于向后兼容旧版本的redis-py. redis连接实例是线程安全的,可以直接将redis连接实例设置为一个全局变量,直接使用.如果需要另一个Redis实例(or Redis数据库)时,就需要重新创建redis连接实例来获取一个新的连接. 安装redis pip install re

U3D:如何使用collision pipeline提升游戏开发优势

如何将事件的执行顺序应用于您的优势 当我在移动设备上工作的时候,我遇到了一个二维的基于网格的动作难题,我遇到了一个复杂的问题,但是使用Unity3D的collision pipeline,我可以用一种可靠的方式来解决它. 好的,想象一下你有一个2D的基于网格的游戏,玩家可以在直线上运行,然后撞到墙上,你需要让玩家在游戏中运行一些基于这样原理的关卡. 我们使用一个带有一个BoxCollider2D的精灵来制作一个"块",并附加一个"块"脚本,当玩家碰到它时,它会将这个