最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入理解redis中multi與pipeline

 更新時(shí)間:2021年06月02日 11:38:00   作者:Walker5883  
pipeline 只是把多個(gè)redis指令一起發(fā)出去,redis并沒有保證這些指定的執(zhí)行是原子的;multi相當(dāng)于一個(gè)redis的transaction的,保證整個(gè)操作的原子性,避免由于中途出錯(cuò)而導(dǎo)致最后產(chǎn)生的數(shù)據(jù)不一致。本文詳細(xì)的介紹,感興趣的可以了解一下

背景

由于對redis緩存中數(shù)據(jù)有批量操作,例如預(yù)熱緩存數(shù)據(jù),或者在列表頁批量去獲取緩存數(shù)據(jù),在使用了multi批量提交事務(wù)后,發(fā)現(xiàn)redis壓力高居不下,而使用了pipeline之后壓力回落了平常,也因?yàn)檫@個(gè)案例,特在此寫個(gè)分析與筆記。

multi

簡介

標(biāo)記一個(gè)事務(wù)塊的開始。
事務(wù)塊內(nèi)的多條命令會按照先后順序被放進(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();

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

redis客戶端與服務(wù)端建立連接后,multi標(biāo)記事務(wù)開始,之后每次執(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ù)端每次會把事務(wù)塊中的命令保存到內(nèi)存中,上述簡介已經(jīng)解釋過最后通過exec命令執(zhí)行,再看下面示例圖的返回結(jié)果可以了解到redis服務(wù)端一次性返回所有命令執(zhí)行返回結(jié)果。

pipeline

簡介

客戶端將執(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抓包,如下圖所示

pipeline 客戶端請求包示例圖

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

兩者的區(qū)別

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

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

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

相關(guān)文章

  • 使用Redis緩存時(shí)高效的批量刪除的幾種方案

    使用Redis緩存時(shí)高效的批量刪除的幾種方案

    這篇文章主要介紹了使用Redis緩存時(shí)高效的批量刪除的幾種方案的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • redis啟動(dòng)失敗問題之完美解決方案

    redis啟動(dòng)失敗問題之完美解決方案

    這篇文章主要介紹了redis啟動(dòng)失敗問題之完美解決方案,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Redis服務(wù)器的啟動(dòng)過程分析

    Redis服務(wù)器的啟動(dòng)過程分析

    這篇文章主要介紹了Redis服務(wù)器的啟動(dòng)過程分析,本文講解了初始化Redis服務(wù)器全局配置、加載配置文件、初始化服務(wù)器、加載數(shù)據(jù)、開始網(wǎng)絡(luò)監(jiān)聽等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • redis實(shí)現(xiàn)延時(shí)隊(duì)列的兩種方式(小結(jié))

    redis實(shí)現(xiàn)延時(shí)隊(duì)列的兩種方式(小結(jié))

    這篇文章主要介紹了redis實(shí)現(xiàn)延時(shí)隊(duì)列的兩種方式(小結(jié)),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Redis主從復(fù)制詳解

    Redis主從復(fù)制詳解

    今天小編就為大家分享一篇關(guān)于Redis主從復(fù)制詳解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • CentOS6.4 安裝Redis 教程詳解

    CentOS6.4 安裝Redis 教程詳解

    這篇文章主要介紹了CentOS6.4 安裝Redis 教程詳解,需要的朋友可以參考下
    2017-05-05
  • Redis定期刪除過期數(shù)據(jù)的操作流程

    Redis定期刪除過期數(shù)據(jù)的操作流程

    Redis是一種內(nèi)存級數(shù)據(jù)庫,所有數(shù)據(jù)均存放在內(nèi)存中,內(nèi)存中的數(shù)據(jù)可以通過TTL指令獲取其狀態(tài),本文給大家介紹了Redis定期刪除過期數(shù)據(jù)的操作流程,文中通過代碼示例介紹的講解的非常詳細(xì),需要的朋友可以參考下
    2024-05-05
  • Redis實(shí)戰(zhàn)之百度首頁新聞熱榜的實(shí)現(xiàn)代碼

    Redis實(shí)戰(zhàn)之百度首頁新聞熱榜的實(shí)現(xiàn)代碼

    這篇文章主要介紹了Redis實(shí)戰(zhàn)之百度首頁新聞熱榜的實(shí)現(xiàn)代碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • Redis協(xié)議具體用法詳解

    Redis協(xié)議具體用法詳解

    在本篇文章中小編給大家整理了關(guān)于Redis協(xié)議具體用法以及相關(guān)內(nèi)容知識點(diǎn),需要的朋友們學(xué)習(xí)下。
    2019-06-06
  • Redis節(jié)省內(nèi)存的十個(gè)技巧分享

    Redis節(jié)省內(nèi)存的十個(gè)技巧分享

    你是否在工作中遇到過Redis的bigkey導(dǎo)致的內(nèi)存占用嚴(yán)重、查詢耗時(shí)大大增加?同時(shí)bigKey還可能導(dǎo)致Redis實(shí)例的崩潰,因?yàn)閮?nèi)存不夠用了,所以本文給大家介紹了Redis極大節(jié)省內(nèi)存的10個(gè)技巧,需要的朋友可以參考下
    2024-04-04

最新評論

区。| 霍邱县| 深泽县| 德昌县| 绥中县| 松滋市| 顺义区| 罗山县| 元朗区| 福州市| 日土县| 东城区| 张家口市| 葫芦岛市| 韶山市| 荔波县| 大名县| 长海县| 肃宁县| 遂川县| 武穴市| 龙里县| 石门县| 和平县| 马山县| 高州市| 郁南县| 进贤县| 福安市| 绥棱县| 延吉市| 古田县| 中阳县| 长武县| 丽江市| 水富县| 寻乌县| 牙克石市| 陕西省| 蓬溪县| 青阳县|