首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Hiredis C 客戶端庫核心 API 詳解:同步/異步操作與訂閱發布實戰

     編輯:關於C語言

Hiredis 深度解析:Redis C 客戶端庫同步 API、數據結構、錯誤處理、Pub/Sub 實戰

Hiredis 是輕量級 Redis C 客戶端,本文系統講解上下文管理、命令執行、回覆解析、連接池、發布訂閱模式完整流程。

核心數據結構


// 連接上下文
typedef struct redisContext {
    int err;              // 錯誤碼
    char errstr[128];     // 錯誤信息
    int fd;               // 套接字
    int flags;
    char *obuf;           // 輸出緩衝區
    redisReader *reader;  // 協議解析器
    // 連接參數...
} redisContext;

// 回覆對象
typedef struct redisReply {
    int type;             // 類型
    long long integer;    // 整數值
    int len;              // 字符串長度
    char *str;            // 字符串/錯誤/狀態
    size_t elements;      // 數組元素數
    struct redisReply **element; // 數組元素指針
} redisReply;

回覆類型常量

常量值含義數據字段
REDIS_REPLY_STRING1字符串str, len
REDIS_REPLY_ARRAY2數組element, elements
REDIS_REPLY_INTEGER3整數integer
REDIS_REPLY_NIL4空值-
REDIS_REPLY_STATUS5狀態(OK等)str, len
REDIS_REPLY_ERROR6錯誤str, len

同步 API 流程

  1. 連接:redisConnect(ip, port) → 檢查 ctx->err
  2. 執行命令:redisCommand(ctx, fmt, ...) → 返回 redisReply*
  3. 解析回覆:按 reply->type 分支處理
  4. 釋放回覆:freeReplyObject(reply) (必須調用)
  5. 斷開連接:redisFree(ctx)

命令執行變體


// 格式化命令 (支援 %b 二進制)
redisCommand(ctx, "SET %s %b", key, val, len);

// 數組參數命令 (二進制安全)
redisCommandArgv(ctx, argc, argv, argvlen);

// Pipeline 批量發送
redisAppendCommand(ctx, "GET key1");
redisAppendCommand(ctx, "GET key2");
redisGetReply(ctx, &reply1);
redisGetReply(ctx, &reply2);

錯誤碼定義

常量值含義
REDIS_ERR_IO1讀寫錯誤
REDIS_ERR_EOF3連接關閉
REDIS_ERR_PROTOCOL4協議解析錯誤
REDIS_ERR_OOM5內存不足
REDIS_ERR_OTHER2其他錯誤

發布訂閱實戰


redisContext *ctx = redisConnect("127.0.0.1", 6379);
redisReply *reply = redisCommand(ctx, "SUBSCRIBE channel");
freeReplyObject(reply);  // 訂閱確認回覆

while (redisGetReply(ctx, (void**)&reply) == REDIS_OK) {
    if (reply->type == REDIS_REPLY_ARRAY && reply->elements == 3) {
        redisReply *msg = reply->element[2];  // [subscribe, channel, message]
        printf("收到消息: %s\n", msg->str);
    }
    freeReplyObject(reply);
}
redisFree(ctx);

工程化最佳實踐

  • 連接池管理:複用連接,避免頻繁建連
  • 超時設置:redisConnectWithTimeout
  • 錯誤重試:指數退避重連邏輯
  • 內存管理:嚴格配對 freeReplyObject
  • 線程安全:Hiredis 非線程安全,需外部鎖或連接池隔離

異步 API 提示

異步模式基於 redisAsyncContext,需事件循環支援,適合高併發場景,此處不展開。

掌握 Hiredis 核心 API,是 C/C++ 系統接入 Redis 的必經之路。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved