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 上:

    bash 复制代码
    sudo apt update
    sudo apt install libhiredis-dev
  • 在 CentOS 上:

    bash 复制代码
    sudo yum install hiredis-devel.x86_64
第二步:编译安装 redis-plus-plus
  1. 克隆 redis-plus-plus 仓库:

    bash 复制代码
    git clone https://github.com/sewenew/redis-plus-plus.git

    提示: 如果 git clone 出现下图所示的证书相关错误:

    可以尝试通过以下命令更新系统的 CA 证书(以 Ubuntu 为例):

    bash 复制代码
    sudo apt-get update
    sudo apt-get install --reinstall ca-certificates

    之后再次尝试 git clone

  2. 进入源码目录并使用 CMake 构建和编译:
    redis-plus-plus 使用 CMake 作为构建工具。为了保持源码目录的整洁,我们推荐在 build 目录下进行编译。

    bash 复制代码
    cd redis-plus-plus

    CMake 通过读取源码根目录下的 CMakeLists.txt 文件来生成 Makefile。

    按照官方教程,依次执行以下命令:

    bash 复制代码
    mkdir build
    cd build
    cmake ..
    make

    注意: 如果系统中没有安装 CMake,请先执行 sudo apt install cmake (Ubuntu) 或 sudo yum install cmake (CentOS)进行安装。

    cmake .. 命令会根据上级目录的 CMakeLists.txt 生成 Makefile。

    make 命令执行编译,编译成功后效果如下:

    编译生成的文件都存放在 build 目录下,如下图红框所示:

  3. 安装到系统目录:

    编译完成后,为了方便在项目中链接,我们将其安装到系统目录中(通常是 /usr/local)。

    bash 复制代码
    sudo make install

至此,redis-plus-plus 库已成功安装到您的系统中。

编写 "Hello World"

接下来,我们编写一个简单的 C++ 程序来测试与 Redis 服务器的连接。

第一步:定位头文件和库文件

在编写代码和编译之前,我们需要知道 redis-plus-plus 的头文件和库文件的位置。

  • 查找头文件:

    bash 复制代码
    ls /usr/local/include/sw/redis++

    我们需要在代码中包含的就是 redis++.h 这个头文件。

  • 查找库文件:

    bash 复制代码
    ls /usr/local/lib/

    编译时需要链接 libredis++.alibredis++.so

第二步:编写代码 (hello.cc)
cpp 复制代码
#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 服务器正在监听此端口。

bash 复制代码
netstat -anp | grep 6379
第三步:编译程序

编译时,我们需要告诉编译器头文件的位置,并链接 redis++hiredis 的库文件以及线程库。

方法一:直接使用 g++ 命令

bash 复制代码
g++ hello.cc -o hello -I/usr/local/include -L/usr/local/lib -lredis++ -lhiredis -pthread

方法二:使用 Makefile (推荐)

为了简化编译流程,我们可以创建一个 Makefile 文件。首先需要找到 hiredis 的静态库路径。

bash 复制代码
find /usr/ -name libhiredis.a

在 Ubuntu 上,路径通常是 /usr/lib/x86_64-linux-gnu/libhiredis.a

创建 Makefile 文件:

makefile 复制代码
hello:hello.cc
	g++ -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 命令即可完成编译。

第四步:运行程序
bash 复制代码
./hello

如果一切正常,您将看到如下输出,这表明 C++ 程序已成功连接到 Redis 服务器!


总结

通过本文的引导,您不仅了解了 Redis 客户端与服务器通信的底层协议 RESP,更重要的是,您已经掌握了在 C++ 项目中集成 Redis 的关键技能。我们从环境准备开始,详细讲解了 hiredisredis-plus-plus 的安装过程,并最终通过一个简单的 ping 程序验证了环境的正确性和库的可用性。

现在,您已经拥有了一个可以工作的 C++ Redis 开发环境。以此为起点,您可以继续探索 redis-plus-plus 提供的丰富 API,将 Redis 的各种命令(如 SET, GET, HSET, LPUSH 等)无缝地集成到您的应用程序中,从而充分利用 Redis 带来的高性能和强大功能。

相关推荐
程序员小假31 分钟前
我们来说一说 ThreadLocal 内存泄漏
java·后端
xq952740 分钟前
获取Facebook 散列利器 来了 十六进制到 Base64 转换器
java
我不是混子1 小时前
聊聊Spring事件机制
java·后端
苦逼大学生被编程薄纱1 小时前
C++ 容器学习系列|vector 核心知识全解析,铺垫下一期模拟实现
开发语言·c++·学习
DKPT1 小时前
JVM栈溢出时如何dump栈信息?
java·jvm·笔记·学习·spring
DKPT1 小时前
JVM堆大小如何设置?
java·开发语言·jvm·笔记·学习
铅笔侠_小龙虾1 小时前
JVM 目录
java·jvm
yunxi_051 小时前
让大模型会“说话”:基于 Spring WebSocket 的毫秒级流式 RAG 对话
java·后端
用户6120414922131 小时前
jsp+servlet做的医院挂号看诊管理系统
java·javascript·mysql
€8111 小时前
Java入门级教程21——Java 缓存技术、RMI远程方法调用、多线程分割大文件
java·开发语言·java缓存代理模式的实现·java rmi远程方法调用·多线程分割大文件