hiredis: 一個輕量級、高性能的 C 語言 Redis 客戶端庫

目錄

1.簡介

2.安裝和配置

2.1.源碼編譯安裝(通用方法)

2.2.包管理器安裝(特定系統)

2.3.Windows 安裝

3.常用的函數及功能

3.1.連接管理函數

3.2.命令執行函數

3.3.異步操作函數

3.4.回復處理函數

3.5.錯誤處理

3.6.連接池與線程安全

4.編譯與鏈接

5.常見用法

6.應用場景

7.注意事項


1.簡介

????????hiredis?是一個輕量級、高性能的 C 語言 Redis 客戶端庫,用于與 Redis 數據庫進行通信。它提供了簡潔的 API,支持同步 / 異步操作、管道(pipelining)、事務(transactions)等特性,被廣泛應用于需要與 Redis 交互的 C/C++ 項目中。

下載地址:https://github.com/redis/hiredis

? ? ? ? 它的核心特征有:

  1. 輕量級:僅包含幾個源文件和頭文件,無外部依賴,易于集成。
  2. 高性能:基于非阻塞 I/O,支持批量操作(管道)和異步回調。
  3. 完整的 Redis 協議實現:支持所有 Redis 命令和數據類型。
  4. 線程安全:通過連接池或每個線程獨立連接實現線程安全。
  5. 異步事件驅動:可與 libevent、libev 等事件庫集成,適合高并發場景。

2.安裝和配置

2.1.源碼編譯安裝(通用方法)

步驟 1:獲取源碼

git clone https://github.com/redis/hiredis.git
cd hiredis

步驟 2:編譯與安裝

make        # 編譯庫
make test   # (可選)運行測試
sudo make install  # 安裝到系統目錄(默認:/usr/local/lib 和 /usr/local/include)

步驟 3:更新動態鏈接庫緩存(Linux 系統)

sudo ldconfig

2.2.包管理器安裝(特定系統)

1.Ubuntu/Debian

sudo apt-get install libhiredis-dev

2.CentOS/RHEL

sudo yum install hiredis-devel

3.macOS (via Homebrew)

brew install hiredis

2.3.Windows 安裝

方法 1:使用 vcpkg(推薦)

git clone https://github.com/microsoft/vcpkg.git
cd vcpkg
.\bootstrap-vcpkg.bat
.\vcpkg install hiredis

方法 2:手動編譯(MinGW/MSYS2)

1.安裝 MSYS2 并更新:

pacman -Syu

2.安裝編譯工具鏈和依賴:

pacman -S mingw-w64-x86_64-gcc mingw-w64-x86_64-cmake

3.編譯 hiredis:

git clone https://github.com/redis/hiredis.git
cd hiredis
make CC=x86_64-w64-mingw32-gcc

方法 3:CMake編譯

參考:Windows下通過CMake編譯hiredis及應用_hiredis windows-CSDN博客

3.常用的函數及功能

Hiredis 提供了一系列用于與 Redis 服務器通信的函數,主要分為連接管理命令執行異步操作輔助工具四大類。以下是常用函數及其功能的詳細介紹:

3.1.連接管理函數

redisConnect:創建同步連接到 Redis 服務器。

//函數聲明
redisContext *redisConnect(const char *ip, int port);//示例
redisContext *ctx = redisConnect("127.0.0.1", 6379);
if (ctx->err) {printf("Connection error: %s\n", ctx->errstr);
}

redisConnectWithTimeout:創建同步連接并設置超時時間。

redisContext *redisConnectWithTimeout(const char *ip, int port, struct timeval timeout);

redisFree:釋放 Redis 連接上下文。

void redisFree(redisContext *c);

3.2.命令執行函數

redisCommand:執行 Redis 命令并返回結果。

//函數聲明
redisReply *redisCommand(redisContext *c, const char *format, ...);//示例
redisReply *reply = redisCommand(ctx, "SET key %s", "value");
if (reply->type == REDIS_REPLY_STATUS) {printf("SET result: %s\n", reply->str);
}
freeReplyObject(reply);  // 釋放回復對象

redisCommandArgv:以參數數組形式執行 Redis 命令(避免字符串格式化問題)。

//函數聲明
redisReply *redisCommandArgv(redisContext *c, int argc, const char **argv, const size_t *argvlen);//示例
const char *argv[3] = {"SET", "key", "value"};
size_t argvlen[3] = {3, 3, 5};
redisReply *reply = redisCommandArgv(ctx, 3, argv, argvlen);

redisAppendCommand:將命令添加到輸出緩沖區(用于管道)。

int redisAppendCommand(redisContext *c, const char *format, ...);

redisGetReply:從輸入緩沖區獲取命令回復(用于管道)。

int redisGetReply(redisContext *c, void **reply);

3.3.異步操作函數

redisAsyncConnect:創建異步連接到 Redis 服務器。

redisAsyncContext *redisAsyncConnect(const char *ip, int port);

redisAsyncSetConnectCallback:設置連接成功 / 失敗的回調函數。

void redisAsyncSetConnectCallback(redisAsyncContext *ac, redisConnectCallback *fn);

redisAsyncCommand:異步執行 Redis 命令。

//函數聲明
int redisAsyncCommand(redisAsyncContext *ac, redisCallbackFn *fn, void *privdata, const char *format, ...);//示例
void getCallback(redisAsyncContext *ac, void *r, void *privdata) {redisReply *reply = r;printf("GET result: %s\n", reply->str);
}redisAsyncCommand(ac, getCallback, NULL, "GET key");

redisAsyncDisconnect:斷開異步連接。

void redisAsyncDisconnect(redisAsyncContext *ac);

3.4.回復處理函數

freeReplyObject:釋放 Redis 回復對象,防止內存泄漏。

void freeReplyObject(void *reply);

3.5.錯誤處理

redisContext.err?和?redisContext.errstr:檢查連接錯誤和錯誤信息。

if (ctx->err) {printf("Error: %s\n", ctx->errstr);
}

3.6.連接池與線程安全

Hiredis 本身不是線程安全的,但可通過以下方式實現線程安全:

1)每個線程獨立連接:為每個線程創建單獨的?redisContext

2)連接池:管理多個?redisContext?實例,線程需要時從池中獲取。

4.編譯與鏈接

編譯時需鏈接 hiredis 庫:

gcc your_file.c -o your_program -lhiredis

5.常見用法

1.同步連接與命令執行

#include <hiredis/hiredis.h>int main() {// 連接到 Redis 服務器redisContext *ctx = redisConnect("127.0.0.1", 6379);if (ctx == NULL || ctx->err) {printf("Connection error: %s\n", ctx ? ctx->errstr : "NULL");return 1;}// 執行命令(SET key value)redisReply *reply = redisCommand(ctx, "SET %s %s", "key", "value");if (reply) {freeReplyObject(reply);  // 釋放回復對象}// 執行命令(GET key)reply = redisCommand(ctx, "GET %s", "key");if (reply && reply->type == REDIS_REPLY_STRING) {printf("GET key: %s\n", reply->str);freeReplyObject(reply);}// 斷開連接redisFree(ctx);return 0;
}

2.管道(Pipelining)

批量發送命令以減少網絡往返:

redisAppendCommand(ctx, "SET key1 value1");
redisAppendCommand(ctx, "SET key2 value2");
redisAppendCommand(ctx, "GET key1");
redisAppendCommand(ctx, "GET key2");// 獲取所有回復
redisReply *reply;
redisGetReply(ctx, (void**)&reply); freeReplyObject(reply);
redisGetReply(ctx, (void**)&reply); freeReplyObject(reply);
redisGetReply(ctx, (void**)&reply); printf("key1: %s\n", reply->str); freeReplyObject(reply);
redisGetReply(ctx, (void**)&reply); printf("key2: %s\n", reply->str); freeReplyObject(reply);

3.異步操作(基于 libevent)

#include <hiredis/async.h>
#include <hiredis/adapters/libevent.h>// 回調函數
void getCallback(redisAsyncContext *ac, void *r, void *privdata) {redisReply *reply = r;if (reply == NULL) return;printf("GET result: %s\n", reply->str);
}int main() {struct event_base *base = event_base_new();redisAsyncContext *ac = redisAsyncConnect("127.0.0.1", 6379);// 設置事件循環redisLibeventAttach(ac, base);// 設置連接回調redisAsyncSetConnectCallback(ac, connectCallback);redisAsyncSetDisconnectCallback(ac, disconnectCallback);// 異步執行命令redisAsyncCommand(ac, getCallback, NULL, "GET key");// 啟動事件循環event_base_dispatch(base);// 清理資源redisAsyncFree(ac);event_base_free(base);return 0;
}

6.應用場景

  • 緩存系統:作為 Redis 客戶端,實現數據緩存。
  • 實時統計:利用 Redis 的原子操作實現計數器、排行榜等。
  • 消息隊列:結合 Redis 的?LIST?或?STREAM?實現消息隊列。
  • 分布式鎖:使用 Redis 的?SETNX?或?SET ... NX?實現分布式鎖。

7.注意事項

1.內存管理:每次調用?redisCommand()?或?redisGetReply()?后,需通過?freeReplyObject()?釋放回復對象。

2.線程安全redisContext?非線程安全,多線程環境需為每個線程創建獨立連接或使用連接池。

3.異步回調:異步模式下,回調函數會在事件循環線程中執行,需注意線程安全。

掌握hiredis的接口函數后,你可以根據項目需求選擇同步或異步方式與 Redis 服務器交互,實現緩存、消息隊列等功能。

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

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

相關文章

TCP套接字

1.概念套接字是專門進行網絡間數據通信的一種文件類型&#xff0c;可以實現不同主機之間雙向通信&#xff0c;包含了需要交換的數據和通信雙方的IP地址和port端口號。2.套接字文件的創建int socket(int domain, int type, int protocol); 功能&#xff1a;該函數用來創建各種各…

Go語言高并發聊天室(一):架構設計與核心概念

Go語言高并發聊天室&#xff08;一&#xff09;&#xff1a;架構設計與核心概念 &#x1f680; 引言 在當今互聯網時代&#xff0c;實時通信已成為各類應用的核心功能。從微信、QQ到各種在線協作工具&#xff0c;高并發聊天系統的需求無處不在。本系列文章將手把手教你使用Go語…

Java基礎:泛型

什么是泛型&#xff1f; 簡單來說&#xff0c;Java泛型是JDK 5引入的一種特性&#xff0c;它允許你在定義類、接口和方法時使用類型參數&#xff08;Type Parameters&#xff09;。這些類型參數可以在編譯時被具體的類型&#xff08;如 String, Integer, MyCustomClass 等&…

RMSNorm實現

當前Qwen、Llama等系列RMSNorm實現源碼均一致。具體現實如下&#xff1a; class RMSNorm(nn.Module):def __init__(self, hidden_size, eps1e-6):super().__init__()self.weight nn.Parameter(torch.ones(hidden_size))self.variance_epsilon epsdef forward(self, hidden_s…

智能Agent場景實戰指南 Day 11:財務分析Agent系統開發

【智能Agent場景實戰指南 Day 11】財務分析Agent系統開發 文章標簽 AI Agent,財務分析,LLM應用,智能財務,Python開發 文章簡述 本文是"智能Agent場景實戰指南"系列第11篇&#xff0c;聚焦財務分析Agent系統的開發。文章深入解析如何構建一個能夠自動處理財務報表…

人工智能安全基礎復習用:可解釋性

一、可解釋性的核心作用1. 錯誤檢測與模型改進發現模型的異常行為&#xff08;如過擬合、偏見&#xff09;&#xff0c;優化性能。例&#xff1a;醫療模型中&#xff0c;可解釋性幫助識別誤診原因。2. 安全與可信性關鍵領域&#xff08;醫療、軍事&#xff09;需透明決策&#…

Qt:QCustomPlot類介紹

QCustomPlot的核心類就是QCustomPlot類。這個類繼承自QWidget&#xff0c;因此可以像其他QWidget一樣使用&#xff0c;比如放入布局中。QCustomPlot類基本結構一個QCustomPlot對象可以包含多個圖層&#xff08;通過QCPLayer表示&#xff09;&#xff0c;通常使用默認圖層。它包…

Visual Studio 2022 上使用ffmpeg

目錄 1. 添加包含目錄 2. 添加庫目錄 3. 添加依賴項 4. 添加動態庫目錄 5. 測試 在解決方案中右擊項目名稱&#xff0c;彈出的窗口中選擇 "屬性"。 1. 添加包含目錄 "C/C" -> "常規" -> "附加包含目錄"中添加 ffmpeg中的…

Elasticsearch 線程池

Elasticsearch 線程池「每個線程池到底采用哪種實現策略」&#xff1a;Elasticsearch 線程池&#xff08;ThreadPool&#xff09;中 **所有內置線程池名稱的常量定義**。 每個字符串常量對應一個 **線程池的名字&#xff08;name&#xff09;**&#xff0c;也就是你在 Thread…

深入理解 Next.js API 路由:構建全棧應用的終極指南

Next.js 是一個強大的 React 框架&#xff0c;不僅支持服務端渲染&#xff08;SSR&#xff09;和靜態站點生成&#xff08;SSG&#xff09;&#xff0c;還提供了內置的 API 路由功能&#xff0c;使開發者能夠輕松構建全棧應用。傳統的全棧開發通常需要單獨搭建后端服務&#xf…

【6.1.2 漫畫分布式事務技術選型】

漫畫分布式事務技術選型 &#x1f3af; 學習目標&#xff1a;掌握架構師核心技能——分布式事務技術選型與一致性解決方案&#xff0c;構建高可靠的分布式系統 &#x1f3ad; 第一章&#xff1a;分布式事務模式對比 &#x1f914; 2PC vs 3PC vs TCC vs Saga 想象分布式事務就…

液冷智算數據中心崛起,AI算力聯動PC Farm與云智算開拓新藍海(二)

從算法革新到基礎設施升級&#xff0c;從行業滲透到地域布局&#xff0c;人工智能算力正以 “規模擴張 效率提升”雙輪驅動中國數字經濟轉型。中國智能算力規模將在 2025 年突破 1000 EFLOPS&#xff0c;2028 年達到 2781.9 EFLOPS&#xff0c;五年復合增長率 46.2%&#xff0…

《QtPy:Python與Qt的完美橋梁》

QtPy 是什么 在 Python 的廣袤編程宇宙中&#xff0c;當涉及到圖形用戶界面&#xff08;GUI&#xff09;開發&#xff0c;Qt 框架宛如一顆璀璨的明星&#xff0c;散發著獨特的魅力。而 QtPy&#xff0c;作為 Python 與 Qt 生態系統交互中的關鍵角色&#xff0c;更是為開發者們開…

ubuntu環境下調試 RT-Thread

調試 RT-Thread 下載源碼 github 搜索 RT-Thread 下載源碼 安裝 python scons 環境 你已經安裝了 kconfiglib&#xff0c;但 scons --menuconfig 仍然提示找不到它。這種情況通常是由于 Python 環境不一致 導致的&#xff1a;你在一個 Python 環境中安裝了 kconfiglib&#xff…

【數據結構初階】--順序表(二)

&#x1f525;個人主頁&#xff1a;草莓熊Lotso &#x1f3ac;作者簡介&#xff1a;C研發方向學習者 &#x1f4d6;個人專欄&#xff1a; 《C語言》 《數據結構與算法》《C語言刷題集》《Leetcode刷題指南》 ??人生格言&#xff1a;生活是默默的堅持&#xff0c;毅力是永久的…

Java中的方法傳參機制

1. 概述Java中的方法傳參機制分為兩種&#xff1a;值傳遞&#xff08;Pass by Value&#xff09; 和 引用傳遞&#xff08;Pass by Reference&#xff09;。然而&#xff0c;Java中所有的參數傳遞都是值傳遞&#xff0c;只不過對于對象來說&#xff0c;傳遞的是對象的引用地址的…

C++——this關鍵字和new關鍵字

一、this 關鍵字1. 什么是 this&#xff1f;this 是 C 中的一個隱式指針&#xff0c;它指向當前對象&#xff08;即調用成員函數的對象&#xff09;&#xff0c;在成員函數內部使用&#xff0c;用于引用調用該函數的對象。每個類的非靜態成員函數內部都可以使用 this。使用 thi…

Python中類靜態方法:@classmethod/@staticmethod詳解和實戰示例

在 Python 中&#xff0c;類方法 (classmethod) 和靜態方法 (staticmethod) 是類作用域下的兩種特殊方法。它們使用裝飾器定義&#xff0c;并且與實例方法 (def func(self)) 的行為有所不同。1. 三種方法的對比概覽方法類型是否訪問實例 (self)是否訪問類 (cls)典型用途實例方法…

FastGPT革命:下一代語言模型的極速進化

本文深度解析FastGPT核心技術架構&#xff0c;涵蓋分布式推理、量化壓縮、硬件加速等前沿方案&#xff0c;包含完整落地實踐指南&#xff0c;助你掌握大模型高效部署的終極武器。引言&#xff1a;當大模型遭遇速度瓶頸2023年&#xff0c;ChatGPT引爆全球AI熱潮&#xff0c;但企…

Geant4 安裝---Ubuntu

安裝工具 C/C工具包 sudo apt install build-essentialCmake sudo apt install -y cmakeccmake sudo apt install -y cmake-curses-gui安裝Qt可視化工具(不需要可視化可以不安裝) sudo apt-get install qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools qtcreator 安裝Ope…