婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 深入理解redis中multi與pipeline

深入理解redis中multi與pipeline

熱門標簽:超呼電話機器人 宿遷便宜外呼系統平臺 北京400電話辦理收費標準 魔獸2青云地圖標注 山東外呼銷售系統招商 貴州電銷卡外呼系統 日本中國地圖標注 鄭州人工智能電銷機器人系統 十堰營銷電銷機器人哪家便宜

背景

由于對redis緩存中數據有批量操作,例如預熱緩存數據,或者在列表頁批量去獲取緩存數據,在使用了multi批量提交事務后,發現redis壓力高居不下,而使用了pipeline之后壓力回落了平常,也因為這個案例,特在此寫個分析與筆記。

multi

簡介

標記一個事務塊的開始。
事務塊內的多條命令會按照先后順序被放進一個隊列當中,最后由 EXEC 命令原子性(atomic)地執行。

實現原理

我用php擴展調起redis服務,執行,代碼如下:

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

為了查看這期間具體的連接過程,用wireshark監聽回環地址端口6379,抓包請求如下圖所示:

redis客戶端與服務端建立連接后,multi標記事務開始,之后每次執行,服務端返回queued隊列標志。查看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服務端每次會把事務塊中的命令保存到內存中,上述簡介已經解釋過最后通過exec命令執行,再看下面示例圖的返回結果可以了解到redis服務端一次性返回所有命令執行返回結果。

pipeline

簡介

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

實現原理

同樣,用相關代碼調用redis抓包;

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

繼續用wireshark抓包,如下圖所示

pipeline 客戶端請求包示例圖

這上面的圖片簡要分析一下,pipeline管道操作是需要客戶端與服務端的支持,客戶端將命令寫入緩沖,最后再通過exec命令發送給服務端,服務端通過命令拆分,逐個執行返回結果。

兩者的區別

由上面的請求也可以看出了兩者最明顯的區別是客戶端發送請求的方式不一樣,具體相關區別如下:

  • pipeline選擇客戶端緩沖,multi選擇服務端緩沖;
  • 請求次數的不一致,multi需要每個命令都發送一次給服務端,pipeline最后一次性發送給服務端,請求次數相對于multi減少
  • multi/exec可以保證原子性,而pipeline不保證原子性

到此這篇關于深入理解redis中multi與pipeline 的文章就介紹到這了,更多相關redis multi與pipeline 內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Redis可視化客戶端小結
  • 詳解基于redis實現分布式鎖
  • 詳解Redis基本命令與使用場景
  • 詳解Redis集群搭建的三種方式
  • 硬核 Redis 高頻面試題解析

標簽:楊凌 北京 大慶 吉安 果洛 臺州 朝陽 江蘇

巨人網絡通訊聲明:本文標題《深入理解redis中multi與pipeline》,本文關鍵詞  深入,理解,redis,中,multi,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《深入理解redis中multi與pipeline》相關的同類信息!
  • 本頁收集關于深入理解redis中multi與pipeline的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 正镶白旗| 南宫市| 延川县| 永胜县| 永定县| 民丰县| 辽源市| 阜平县| 磴口县| 乌苏市| 错那县| 诸暨市| 东城区| 固镇县| 来安县| 邵武市| 西城区| 汝城县| 潮安县| 高安市| 湖北省| 柳江县| 宣威市| 镇赉县| 离岛区| 肥西县| 库尔勒市| 麦盖提县| 广平县| 鄂伦春自治旗| 盖州市| 昌江| 泾源县| 二连浩特市| 武威市| 马龙县| 玛沁县| 清远市| 合阳县| 镇平县| 双流县|