日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

redis管道的使用

發布時間:2024/2/28 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 redis管道的使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

簡言

1. 總所周知,redis以高性能著稱,官方號稱QPS可以達到10萬次

2. 如果我們做實驗,即便是執行最簡單的set,get命令,也難以達到官方號稱的性能,原因在于沒有使用管道(pipe)

3. 不使用管道的時候,由于每個命令都要經過一個完整的網絡來回才能得到結果,執行N個命令就要等待N個網絡來回時間,效率很低

4. 使用管道的時候,redis服務器并沒有任何改變,仍然是順序處理每一個命令。是redis客戶端做的一個技巧,發出一個命令后不再等待它返回,而是接著發送下一條命令,直到全部發送完。接收的時候也是等待所有命令都返回了才一次性返回給用戶。整個過程只有一個網絡來回,可以極大的提高效率

5. 總結:簡單的set, get命令,使用管道可以提高效率800%左右

實驗如下圖(執行了3次,可以看到同樣是執行了10W次set命令,使用管道時耗時620ms左右不使用管道時耗時4900ms左右

完整代碼鏈接

https://download.csdn.net/download/yzf279533105/19035958

管道使用代碼如下(該函數為管道的封裝,筆者使用的是C++, 第三方庫為hiredis)

// 使用管道運行一批命令(命令列表,回復列表) bool CRedisClient::PipeCommand(vector<string>& commands, vector<CAutoRedisReply>& replys) {REDIS_SAFE_ACCESS// 參數檢測if (commands.size()==0 || replys.size()==0 || (commands.size() != replys.size())){ERROR("CRedisClient::PipeCommand(), params err, commands.size()=%ld, replys.size()=%ld", commands.size(), replys.size());return false;}bool bSuc = connect();if (!bSuc) {ERROR("CRedisClient::PipeCommand(), connect failed");return false;}// 所有命令for (size_t i=0;i<commands.size();i++){redisAppendCommand(m_redisCtx, commands[i].c_str());}// 所有回復for (size_t i=0;i<commands.size();i++){redisReply* pReply = NULL;redisGetReply(m_redisCtx,(void**)(&pReply));// 由于命令的返回各種各樣,無法準確判斷結果是否真的正確,所以這里認為沒出錯即認為正常if (pReply == NULL || pReply->type == REDIS_REPLY_ERROR){ERROR("CRedisClient::PipeCommand(), get reply error, command=%s, pReply->type=%d, pReply->str=%s", commands[i].c_str(), pReply->type, pReply->str);return false;}replys[i].set(pReply);}return true; }

?

總結

以上是生活随笔為你收集整理的redis管道的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。