redis管道的使用
生活随笔
收集整理的這篇文章主要介紹了
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管道的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: golang语言操作文件
- 下一篇: golang程序如何优雅地退出