c/c++(hiredis)異步調用redis【轉】


 

    同步方式

不過大多數情況下,我們采用的都是同步的調用方式。

沒錯,同步的方式就是這么簡單易用。

 

    異步方式

不過說到了同步,那必然得說異步。同步簡單,異步性能高。為了性能,或者說為了裝B,必須得用一下異步調用方式才能顯示得出高大上。

當然,本文不是描述基於libevent,或者基於redis本身得ae網絡庫的異步方式。而是基於公司(或者自己)已有的異步服務器框架上,我們需要:

  1. 將發送redis的請求按照redis的既有協議打包到一個buffer。
  2. 將這個buffer丟給異步服務器框架,由框架負責和redis服務器建立(維護)連接,發送請求buffer,並取得redis返回的數據buffer。框架保證這個過程是異步高性能的。
  3. 然后框架會給出redis的回包buffer。我們需要按照redis的既有協議解開這個包,並得到結果。

 

redis的既有協議,這里先不展開描述。回到上面的需求,我們怎么才能打包redis的請求,解包redis的返回數據呢?用習慣了同步的方式,還曾經抱怨hiredis為什么不提供一個打包的函數和一個解包的函數呢。原來是自己眼拙,沒看出hiredis庫的打包和解包的使用方式。

打包函數系列:

 

解包是通過一個redisReader來完成的。

 

呵呵,打包和解包看來不是一個簡單的函數搞定的,就原諒自己的眼拙了。哈哈。

 

    實戰演習

來一個簡單的例子(demo.c),假設實例里面的函數

int asyncFrameWork(const uint8_t* sendBuf, int sendBufLen, uint8_t* recvBuf, int* recvBufLen);

就是公司高大上的異步服務器框架了啊。(汗顏一下。。。)

或者把這個asyncFrameWork替換為目前很前沿的微線程(協程)技術,那性能也是相當高的。

 

 

編譯

 

 

執行

用valgrind執行一下,看結果是否正確的同時,也順便看看是否有內存泄露。

 

[amcool@leoox redisDemo]$ valgrind –leak-check=full –tool=memcheck ./demo
==3868== Memcheck, a memory error detector.
==3868== Copyright (C) 2002-2006, and GNU GPL’d, by Julian Seward et al.
==3868== Using LibVEX rev 1658, a library for dynamic binary translation.
==3868== Copyright (C) 2004-2006, and GNU GPL’d, by OpenWorks LLP.
==3868== Using valgrind-3.2.1, a dynamic binary instrumentation framework.
==3868== Copyright (C) 2000-2006, and GNU GPL’d, by Julian Seward et al.
==3868== For more details, rerun with: -v
==3868==
redisFormatCommand result: len = 37, cmdBuf = *3
$3
SET
$7
company
$5
leoox

asyncFrameWork recv len = 5
asyncFrameWork return : recvBuf = +OK
, recvBufLen = 5
redisReader get reply : 5
r->type = 5
————————————-
set key(company) OK
————————————-
redisFormatCommand result: len = 28, cmdBuf = *2
$3
GET
$9
company..

asyncFrameWork recv len = 5
asyncFrameWork return : recvBuf = $-1
, recvBufLen = 5
redisReader get reply : 4
r->type = 4
————————————-
key(company..) not exists!
————————————-
redisFormatCommand result: len = 26, cmdBuf = *2
$3
GET
$7
company

asyncFrameWork recv len = 11
asyncFrameWork return : recvBuf = $5
leoox
, recvBufLen = 11
redisReader get reply : 1
r->type = 1
r->len = 5
r->str = leoox
————————————-
key(company), value=(leoox)
————————————-
==3868==
==3868== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 5 from 1)
==3868== malloc/free: in use at exit: 0 bytes in 0 blocks.
==3868== malloc/free: 41 allocs, 41 frees, 2,352 bytes allocated.
==3868== For counts of detected errors, rerun with: -v
==3868== All heap blocks were freed — no leaks are possible.

 

結果正確,並且沒有內存泄露。perfect!哦,聖誕過完了,那提前說元旦快樂,新的一年要任性!

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM