C++ 连接 Redis:redis-plus-plus 安装与使用入门指南
前言
在现代应用开发中,Redis 以其卓越的性能和丰富的数据结构,已成为缓存、消息队列和数据存储等场景的首选。对于 C++ 开发者而言,如何高效、稳定地与 Redis 服务器进行交互是一个常见的需求。本文旨在提供一个详尽的入门指南,帮助 C++ 开发者快速上手 redis-plus-plus
——一个功能强大且易于使用的 C++ Redis 客户端库。
本文将首先简要介绍 Redis 客户端的基本概念及其核心通信协议 RESP,为您奠定理论基础。随后,我们将通过详细的步骤,手把手地指导您如何在 Linux 环境(以 Ubuntu 为例)下安装 redis-plus-plus
及其依赖 hiredis
。最后,通过一个经典的 “Hello World” 示例,演示如何编写、编译并运行您的第一个 C++ Redis 程序,带您真正迈出在 C++ 中驾驭 Redis 的第一步。
Redis 客户端:基本介绍与 RESP 协议解析
Redis 作为一款高性能的内存数据库,其强大的功能需要通过客户端与服务器进行交互来实现。了解 Redis 客户端及其通信协议对于高效使用 Redis 至关重要。本文将对 Redis 客户端进行基本介绍,并深入解析其核心通信协议——RESP。
Redis 客户端基本介绍
Redis 客户端是与 Redis 服务器进行通信的程序或库。它负责将用户的命令发送到 Redis 服务器,并接收和解析服务器返回的响应。客户端可以分为三大类:
- 命令行客户端 (CLI): 这是最基础的 Redis 客户端,例如
redis-cli
。它允许开发者直接在终端中输入 Redis 命令并查看结果,非常适合用于调试和管理任务。 - 图形用户界面 (GUI) 客户端: 为了更直观地管理 Redis 中的数据,社区开发了许多 GUI 客户端。这些工具通常提供树状的键值展示、数据增删改查的可视化操作界面,以及服务器状态监控等功能。常见的 GUI 客户端包括 Redis Desktop Manager (RDM)、Another Redis Desktop Manager 和 Tiny RDM 等。
- 编程语言客户端库: 在应用程序中与 Redis 交互时,开发者会使用特定编程语言的 Redis 客户端库。这些库封装了与 Redis 服务器的通信细节,提供了简洁的 API 供开发者调用。几乎所有主流的编程语言,如 Java (Jedis, Lettuce)、Python (redis-py)、Node.js (node-redis) 等,都有成熟的 Redis 客户端库。
认识 RESP (REdis Serialization Protocol)
Redis 客户端与服务器之间的通信遵循一个名为 RESP (REdis Serialization Protocol) 的协议。该协议在 Redis 1.2 中引入,并从 Redis 2.0 开始成为与 Redis 服务器通信的标准方式。RESP 的设计目标是实现简单、解析快速且具有人类可读性。
RESP 协议的特点:
- 实现简单: 协议规则清晰明了,易于在不同的客户端库中实现。
- 解析快速: 协议的格式设计使得解析器可以高效地处理数据,对性能影响小。
- 人类可读: RESP 传输的数据格式直观,便于开发者在调试过程中直接阅读和理解。
- 二进制安全: 采用前缀长度来传输数据块,确保了二进制数据的安全传输。
RESP 数据类型:
RESP 协议支持多种数据类型,通过第一个字节的不同来区分:
- 简单字符串 (Simple Strings): 以
+
开头,以\r\n
(CRLF) 结尾。例如+OK\r\n
。 - 错误 (Errors): 以
-
开头,以\r\n
结尾。例如-ERR unknown command 'foobar'\r\n
。 - 整数 (Integers): 以
:
开头,以\r\n
结尾。例如:1000\r\n
。 - 批量字符串 (Bulk Strings): 用于表示长度最大为 512MB 的单个二进制安全字符串。它以
$
开头,后跟字符串的字节数,然后是 CRLF,接着是实际的字符串数据,最后再以 CRLF 结尾。例如,表示字符串 “hello”:$5\r\nhello\r\n
。 - 数组 (Arrays): 客户端向服务器发送命令以及服务器返回元素集合时使用。它以
*
开头,后跟数组中元素的个数,然后是 CRLF,接着是数组中的各个元素(可以是任意 RESP 类型)。例如,发送命令SET mykey "hello"
会被编码为:*3\r\n$3\r\nSET\r\n$5\r\nmykey\r\n$5\r\nhello\r\n
请求-响应模型:
Redis 的通信基于请求-响应模型。客户端将命令以 RESP 数组的形式发送给服务器。服务器处理命令后,将结果以相应的 RESP 数据类型返回给客户端。这种交互模式是 Redis 通信的核心。
安装 redis-plus-plus
C++ 操作 Redis 的库有很多,此处我们选择 redis-plus-plus
。
Github 地址: https://github.com/sewenew/redis-plus-plus
redis-plus-plus
依赖于 C 语言的 Redis 客户端库 hiredis
,因此我们需要先安装它。
第一步:安装 hiredis
-
在 Ubuntu 上:
sudo apt update sudo apt install libhiredis-dev
-
在 CentOS 上:
sudo yum install hiredis-devel.x86_64
第二步:编译安装 redis-plus-plus
-
克隆
redis-plus-plus
仓库:git clone https://github.com/sewenew/redis-plus-plus.git
提示: 如果
git clone
出现下图所示的证书相关错误:
可以尝试通过以下命令更新系统的 CA 证书(以 Ubuntu 为例):
sudo apt-get update sudo apt-get install --reinstall ca-certificates
之后再次尝试
git clone
。 -
进入源码目录并使用 CMake 构建和编译:
redis-plus-plus
使用 CMake 作为构建工具。为了保持源码目录的整洁,我们推荐在build
目录下进行编译。cd redis-plus-plus
CMake 通过读取源码根目录下的
CMakeLists.txt
文件来生成 Makefile。
按照官方教程,依次执行以下命令:
mkdir build cd build cmake .. make
注意: 如果系统中没有安装 CMake,请先执行
sudo apt install cmake
(Ubuntu) 或sudo yum install cmake
(CentOS)进行安装。cmake ..
命令会根据上级目录的CMakeLists.txt
生成 Makefile。make
命令执行编译,编译成功后效果如下:
编译生成的文件都存放在
build
目录下,如下图红框所示:
-
安装到系统目录:
编译完成后,为了方便在项目中链接,我们将其安装到系统目录中(通常是/usr/local
)。sudo make install
至此,redis-plus-plus
库已成功安装到您的系统中。
编写 “Hello World”
接下来,我们编写一个简单的 C++ 程序来测试与 Redis 服务器的连接。
第一步:定位头文件和库文件
在编写代码和编译之前,我们需要知道 redis-plus-plus
的头文件和库文件的位置。
-
查找头文件:
ls /usr/local/include/sw/redis++
我们需要在代码中包含的就是redis++.h
这个头文件。 -
查找库文件:
ls /usr/local/lib/
编译时需要链接libredis++.a
或libredis++.so
。
第二步:编写代码 (hello.cc
)
#include <iostream>
// 引入 redis-plus-plus 头文件
#include <sw/redis++/redis++.h>int main() {try {// 创建 Redis 对象,构造函数中指定 Redis 服务器的地址和端口// "tcp://127.0.0.1:6379" 表示连接本地(127.0.0.1)的 6379 端口sw::redis::Redis redis("tcp://127.0.0.1:6379");// 调用 ping 方法,测试与服务器的连接// 如果连接成功,服务器会返回 "PONG"std::string result = redis.ping();std::cout << "Ping result: " << result << std::endl;} catch (const sw::redis::Error &e) {// 处理可能的连接异常std::cerr << "Redis error: " << e.what() << std::endl;}return 0;
}
说明: 6379
是 Redis 的默认端口。我们可以通过 netstat
命令确认 Redis 服务器正在监听此端口。
netstat -anp | grep 6379
第三步:编译程序
编译时,我们需要告诉编译器头文件的位置,并链接 redis++
、hiredis
的库文件以及线程库。
方法一:直接使用 g++ 命令
g++ hello.cc -o hello -I/usr/local/include -L/usr/local/lib -lredis++ -lhiredis -pthread
方法二:使用 Makefile (推荐)
为了简化编译流程,我们可以创建一个 Makefile
文件。首先需要找到 hiredis
的静态库路径。
find /usr/ -name libhiredis.a
在 Ubuntu 上,路径通常是 /usr/lib/x86_64-linux-gnu/libhiredis.a
。
创建 Makefile
文件:
hello:hello.ccg++ -std=c++17 -o $@ $^ /usr/local/lib/libredis++.a /usr/lib/x86_64-linux-gnu/libhiredis.a -pthread.PHONY:clean
clean:rm hello
将上述内容保存为 Makefile
后,只需在终端执行 make
命令即可完成编译。
第四步:运行程序
./hello
如果一切正常,您将看到如下输出,这表明 C++ 程序已成功连接到 Redis 服务器!
总结
通过本文的引导,您不仅了解了 Redis 客户端与服务器通信的底层协议 RESP,更重要的是,您已经掌握了在 C++ 项目中集成 Redis 的关键技能。我们从环境准备开始,详细讲解了 hiredis
和 redis-plus-plus
的安装过程,并最终通过一个简单的 ping
程序验证了环境的正确性和库的可用性。
现在,您已经拥有了一个可以工作的 C++ Redis 开发环境。以此为起点,您可以继续探索 redis-plus-plus
提供的丰富 API,将 Redis 的各种命令(如 SET, GET, HSET, LPUSH 等)无缝地集成到您的应用程序中,从而充分利用 Redis 带来的高性能和强大功能。