溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

multi與pipeline怎么在redis中使用

發(fā)布時(shí)間:2021-06-02 15:55:19 來(lái)源:億速云 閱讀:184 作者:Leah 欄目:開(kāi)發(fā)技術(shù)

本篇文章給大家分享的是有關(guān)multi與pipeline怎么在redis中使用,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。

multi

簡(jiǎn)介

標(biāo)記一個(gè)事務(wù)塊的開(kāi)始。
事務(wù)塊內(nèi)的多條命令會(huì)按照先后順序被放進(jìn)一個(gè)隊(duì)列當(dāng)中,最后由 EXEC 命令原子性(atomic)地執(zhí)行。

實(shí)現(xiàn)原理

我用php擴(kuò)展調(diào)起redis服務(wù),執(zhí)行,代碼如下:

$redis = new redis();
$redis->connect('127.0.0.1',6379);
$handle = $redis->multi();
$handle->incr('a');
$handle->incr('b');
$handle->exec();

為了查看這期間具體的連接過(guò)程,用wireshark監(jiān)聽(tīng)回環(huán)地址端口6379,抓包請(qǐng)求如下圖所示:

multi與pipeline怎么在redis中使用

redis客戶端與服務(wù)端建立連接后,multi標(biāo)記事務(wù)開(kāi)始,之后每次執(zhí)行,服務(wù)端返回queued隊(duì)列標(biāo)志。查看redis源碼src/multi.c文件:

void queueMultiCommand(client *c) {
    multiCmd *mc;
    int j;

    c->mstate.commands = zrealloc(c->mstate.commands,
            sizeof(multiCmd)*(c->mstate.count+1));
    mc = c->mstate.commands+c->mstate.count;
    mc->cmd = c->cmd;
    mc->argc = c->argc;
    mc->argv = zmalloc(sizeof(robj*)*c->argc);
    memcpy(mc->argv,c->argv,sizeof(robj*)*c->argc);
    for (j = 0; j < c->argc; j++)
        incrRefCount(mc->argv[j]);
    c->mstate.count++;
}

在上述源碼中可以看到redis服務(wù)端每次會(huì)把事務(wù)塊中的命令保存到內(nèi)存中,上述簡(jiǎn)介已經(jīng)解釋過(guò)最后通過(guò)exec命令執(zhí)行,再看下面示例圖的返回結(jié)果可以了解到redis服務(wù)端一次性返回所有命令執(zhí)行返回結(jié)果。

multi與pipeline怎么在redis中使用

pipeline

簡(jiǎn)介

客戶端將執(zhí)行的命令寫入到緩沖中,最后由exec命令一次性發(fā)送給redis執(zhí)行返回。

實(shí)現(xiàn)原理

同樣,用相關(guān)代碼調(diào)用redis抓包;

$redis = new redis();
$redis->connect('127.0.0.1',6379);
$handle = $redis->pipeline();
$handle->incr('a');
$handle->incr('b');
$handle->exec();

繼續(xù)用wireshark抓包,如下圖所示

multi與pipeline怎么在redis中使用

pipeline 客戶端請(qǐng)求包示例圖

multi與pipeline怎么在redis中使用

這上面的圖片簡(jiǎn)要分析一下,pipeline管道操作是需要客戶端與服務(wù)端的支持,客戶端將命令寫入緩沖,最后再通過(guò)exec命令發(fā)送給服務(wù)端,服務(wù)端通過(guò)命令拆分,逐個(gè)執(zhí)行返回結(jié)果。

兩者的區(qū)別

由上面的請(qǐng)求也可以看出了兩者最明顯的區(qū)別是客戶端發(fā)送請(qǐng)求的方式不一樣,具體相關(guān)區(qū)別如下:

  • pipeline選擇客戶端緩沖,multi選擇服務(wù)端緩沖;

  • 請(qǐng)求次數(shù)的不一致,multi需要每個(gè)命令都發(fā)送一次給服務(wù)端,pipeline最后一次性發(fā)送給服務(wù)端,請(qǐng)求次數(shù)相對(duì)于multi減少

  • multi/exec可以保證原子性,而pipeline不保證原子性

以上就是multi與pipeline怎么在redis中使用,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI