Hiredis 構建 Redis 命令實戰指南

一、同步命令構造

1.1 redisCommand(fmt, …)

最常用的同步接口即 redisCommand,其原型如下:

void *redisCommand(redisContext *c, const char *format, ...);
  • 參數

    • c:已連接的 redisContext*
    • format:與 printf 類似的格式字符串
// 基本用法:發送 SET foo bar
redisReply *reply = redisCommand(c, "SET foo bar");// 插值字符串:發送 SET key:1 Hello
char *myKeyNumber = "1", *myValue = "Hello";
redisReply *r2 = redisCommand(c, "SET key:%s %s", myKeyNumber, myValue);
支持二進制數據:%b

當需要存儲或檢索二進制數據(如向量嵌入)時,可使用 %b,并在后面傳入指針與長度:

char *entryNumber = "1";
char *embedding = "<binary data>";
size_t embLen = 13;
char *url = "https://redis.io/";redisReply *r3 = redisCommand(c,"HSET entry:%s embedding %b url %s",entryNumber,embedding, embLen,url
);

注意:除了 %% 外,不支持其它 printf 規格(例如 %d)。

1.2 redisCommandArgv(argv, argvlen)

當參數來自數組或包含多段二進制時,直接使用 redisCommandArgv 更安全:

void *redisCommandArgv(redisContext *c,int argc,const char **argv,const size_t *argvlen
);
  • 示例:發送 SET greeting hello
const char *argv[]     = {"SET", "greeting", "hello"};
const size_t argvlen[] = {3,       8,          5};
int argc = 3;redisReply *reply = redisCommandArgv(c, argc, argv, argvlen);

若傳入 argvlen=NULL,Hiredis 會調用 strlen(),但遇二進制數據仍應顯式提供長度數組。

二、異步命令構造

對于高并發場景,非阻塞地發送命令并處理回調極為關鍵。Hiredis 提供與同步接口對應的異步版本。

2.1 基礎接口

int redisAsyncCommand(redisAsyncContext *ac,redisCallbackFn *fn,void *privdata,const char *format,...
);int redisAsyncCommandArgv(redisAsyncContext *ac,redisCallbackFn *fn,void *privdata,int argc,const char **argv,const size_t *argvlen
);
  • 參數

    • ac:異步上下文 redisAsyncContext*
    • fn:可選的回調函數,命令執行完畢后觸發
    • privdata:用戶自定義數據,回調時原樣傳回
    • format / argv:與同步接口一致

2.2 回調函數簽名

void getCallback(redisAsyncContext *c, void *reply, void *privdata) {redisReply *r = reply;char *key = privdata;if (!r) {if (c->errstr) printf("errstr: %s\n", c->errstr);return;}printf("Key: %s, value: %s\n", key, r->str);// 使用完畢后優雅斷開redisAsyncDisconnect(c);
}

2.3 示例:混合使用

// 1. 異步 SET,不關心結果
char *key = "testkey", *value = "testvalue";
redisAsyncCommand(ac, NULL, NULL, "SET %s %s", key, value);// 2. 異步 GET,需回調處理
redisAsyncCommand(ac, getCallback, key, "GET %s", key);

異步上下文在事件循環中調度,執行完所有回調后,可在回調內調用 redisAsyncDisconnect(ac) 進行優雅斷開;若需立即釋放,使用 redisAsyncFree(ac)

三、處理命令回復

所有命令回復均通過 redisReply 結構體返回,其 type 字段指示具體格式(字符串、整數、數組等),詳見 Hiredis 文檔的“Handle replies”章節。務必檢查 reply->typereply->str / reply->integer 等字段,以確保正確解析。

四、最佳實踐與性能優化

  1. 二進制安全:凡涉及原始字節,統一使用帶長度參數的 %bargvlen,避免 strlen() 截斷。
  2. 復用 Context:長連接或連接池可顯著減少頻繁連接帶來的開銷。
  3. 批量命令:結合 MULTI/EXEC 或 Lua 腳本,減少網絡往返次數。
  4. 異步模式:高并發場景優先考慮異步接口,并合理使用回調釋放資源。
  5. 錯誤處理:檢查 c->errac->errstrreply->type == REDIS_REPLY_ERROR,以便日志告警和重試。

五、總結

Hiredis 雖然接口簡潔,但通過 redisCommand/redisCommandArgvredisAsyncCommand/redisAsyncCommandArgv,可完全滿足同步與異步場景下對 Redis 的靈活訪問需求。結合合適的錯誤檢查、連接復用及批量操作設計,您的 C/C++ 應用即可實現高性能、低延遲的 Redis 通信能力。希望本文能幫助您快速上手 Hiredis,并在生產環境中游刃有余地構造各類 Redis 命令。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/92472.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/92472.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/92472.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【數據庫】國產數據庫的新機遇:電科金倉以融合技術同步全球競爭

7月15日&#xff0c;國產數據庫廠商中電科金倉&#xff08;北京&#xff09;科技股份有限公司&#xff08;以下簡稱“電科金倉”&#xff09;在北京舉行了一場技術發布會&#xff0c;集中發布四款核心產品&#xff1a;AI時代的融合數據庫KES V9 2025、企業級統一管控平臺KEMCC、…

大模型 Function Call 的實現步驟及示例詳解

大模型 Function Call 的實現步驟及示例詳解一、Function Call的核心流程拆解二、結合代碼詳解Function Call實現步驟1&#xff1a;定義工具&#xff08;對應代碼中的tools列表&#xff09;步驟2&#xff1a;實現工具函數&#xff08;對應代碼中的get_current_weather和get_cur…

Linux運維新手的修煉手扎之第24天

mysql服務1 mysql命令客戶端(mysql.cnf)命令 \c--ctrl c \s--顯示當前狀態 \r--客戶端重新連接 \h--查看幫助信息 exit退出客戶端 \G--垂直格式顯示查詢結果連接MySQL服務器--[rootrocky9 ~]# mysql(mysql -u用戶名 - p密碼 -h服務端ip -P服務端port -S服務端sock -e "my…

面向對象分析與設計40講(7)設計原則之合成復用原則

文章目錄 一、概念 二、示例(C++ 實現) 1. 違反合成復用原則的示例(過度使用繼承) 2. 遵循合成復用原則的示例(使用組合) 三、總結 1. 繼承是“強綁定”,組合是“弱關聯” 2. 繼承固化“靜態結構”,組合支持“動態變化” 3. 繼承放大“設計缺陷”,組合隔離“局部問題”…

Git 完全手冊:從入門到團隊協作實戰(4)

Hello大家好&#xff01;很高興我們又見面啦&#xff01;給生活添點passion&#xff0c;開始今天的編程之路&#xff01; 我的博客&#xff1a;<但凡. 我的專欄&#xff1a;《編程之路》、《數據結構與算法之美》、《C修煉之路》、《Linux修煉&#xff1a;終端之內 洞悉真理…

解決Spring事務中RPC調用無法回滾的問題

文章目錄問題分析解決方案實現原理解析執行流程說明運行實例正常流程執行執行異常流程關鍵優勢在分布式系統開發中&#xff0c;我們經常會遇到本地事務與遠程服務調用結合的場景。當本地事務包含RPC調用時&#xff0c;如果事務回滾&#xff0c;RPC調用已經執行就會導致數據不一…

sqli-labs通關筆記-第13關 POST報錯型注入(單引號括號閉合 手工注入+腳本注入兩種方法)

目錄 一、字符型注入 二、limit函數 三、GET方法與POST方法 四、源碼分析 1、代碼審計 2、SQL注入安全分析 3、報錯型注入與聯合注入 五、滲透實戰 1、進入靶場 2、注入點分析 &#xff08;1&#xff09;SQL語句 &#xff08;2&#xff09;admin) #注入探測 &…

康復器材動靜態性能測試臺:精準檢測,為康復器械安全保駕護航

在康復醫療領域&#xff0c;無論是輪椅、拐杖、假肢還是康復床&#xff0c;每一件器械的強度與穩定性都直接關系到使用者的安全與康復效果。如何確保這些器械在實際使用中經得起反復考驗&#xff1f;Delta德爾塔儀器推出的康復器材動靜態性能測試臺&#xff0c;憑借其高精度、智…

vue3中el-table表頭篩選

效果如下&#xff0c;可以勾選表頭進行隱藏&#xff0c;也可以對表頭進行拖動排序index主界面 <script> let tempHead []; const showFilter ref<boolean>(false); let tableHeadList ref<TableHeadItem[]>([{ prop: "displayId", label: "…

數據結構 之 【排序】(直接選擇排序、堆排序、冒泡排序)

目錄 1.直接選擇排序 1.1直接選擇排序的思想 1.2直接選擇排序的代碼邏輯 1.3完整排序代碼 1.3.1一次只選一個最值 1.3.2一次篩選出兩個最值 1.4直接選擇排序的時間復雜度與空間復雜度 2.堆排序 2.1堆排序的思想 2.2堆排序的具體步驟 2.3堆排序圖解 2.4完整排序代碼…

用手機當外掛-圖文并茂做報告紀要

前陣參加一個峰會,看到演講嘉賓每翻一頁PPT,下面的觀察就舉起手機一頓拍。實話說這種拍下來的,難說還會拿出來看,而且再看的時候也未必能對應到當時主講人的一些解釋 。 如果現場將圖片保存到筆記本電腦,并快速記錄關鍵信息,這樣聽完一個報告可能就直接輸出一篇報道了。 有…

Vue的ubus emit/on使用

這段代碼是 Vue.js 組件中的 mounted 生命周期鉤子函數&#xff0c;主要作用是監聽一個名為 “macSelectData” 的全局事件。具體行為如下&#xff1a;分步解釋&#xff1a;mounted() 生命周期鉤子 當組件被掛載到 DOM 后&#xff0c;Vue 會自動調用 mounted() 方法。這里常用于…

rsync報錯解決

問題說明 [rootlocalhost shyn]# rsync -avz --checksum "root192.168.159.133:/tmp/shyn" "/tmp /shyn"WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! …

ArKTS: DAL,Model,BLL,Interface,Factory using SQLite

HarmonyOS 用ohos.data.rdb 用DBHelper.ets 共用調用SQLite 庫&#xff0c;進行DAL,Model,BLL,Interface,Factory 框架模式&#xff0c;表為CREATE TABLE IF NOT EXISTS signInRecord ( id INTEGER PRIMARY KEY AUTOINCREMENT, employeeId TEXT NOT NULL, employeeName TEXT NO…

MySQL JSON 數據類型用法及與傳統JSON字符串的對比 JSON數據類型簡介

文章目錄前言1. 基本用法JSON數據類型 vs 傳統JSON字符串1. 存儲方式2. 查詢方式對比3. 索引支持JSON存儲對象和數組的性能考慮1. 存儲對象2. 存儲數組性能對比總結最佳實踐建議前言 MySQL從 5.7 版本開始引入了 JSON 數據類型&#xff0c;專門用于存儲 JSON 格式的數據。與傳…

C++:list(1)list的使用

list的使用一.list基本的結構1.環狀雙向鏈表2.哨兵節點3.迭代器4.節點結構5.鏈表遍歷6.迭代器失效二.list的基本使用1.test01函數&#xff1a;主要測試std::list的初始化方式及遍歷2.test02函數&#xff1a;主要測試std::list的常用成員函數操作3.測試結果如下三.list的其他操作…

ArcGIS地形起伏度計算

地形起伏度計算地形起伏度步驟1&#xff1a;計算最大值。步驟2&#xff1a;計算最小值。步驟3&#xff1a;計算地形起伏度。地形起伏度、地形粗糙度、地表切割深度和高程變異系數均為坡面復雜度因子&#xff0c;是一種宏觀的地形信息因子&#xff0c;反映的是較大的區域內地表坡…

llama factory新手初步運行完整版

1、新建conda環境名稱為llama_factory&#xff0c;并激活 conda create -n llama_factory python3.10 conda activate llama_factory2、激活后可檢查內部包是否純凈&#xff0c;要確保環境內包較純凈&#xff0c;不然后續安裝對應包會出現一系列水土不服的問題&#xff0c;導致…

Tomcat與JDK版本對照全解析:避坑指南與生產環境選型最佳實踐

&#x1f49d;&#x1f49d;&#x1f49d;歡迎蒞臨我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;希望您在這里可以感受到一份輕松愉快的氛圍&#xff0c;不僅可以獲得有趣的內容和知識&#xff0c;也可以暢所欲言、分享您的想法和見解。 持續學習&#xff0c;不斷…

短視頻矩陣的未來前景:機遇無限,挑戰并存

在當今數字化信息飛速傳播的時代&#xff0c;短視頻以其獨特的魅力迅速席卷全球&#xff0c;成為人們獲取信息、娛樂消遣的重要方式之一。短視頻矩陣作為一種高效的內容傳播與運營模式&#xff0c;正逐漸展現出其強大的影響力和潛力。本文將深入探討短視頻矩陣的未來前景&#…