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 带来的高性能和强大功能。

相关推荐
没有bug.的程序员5 小时前
Redis vs Memcached vs MongoDB:深入对比与选型指南
java·redis·mongodb·memcached
半桔5 小时前
【Linux手册】管道通信:从内核底层原理到使用方法
java·linux·服务器·网络·c++
BeyondCode程序员5 小时前
苹果内购 V1 与 V2 支付流程对比(附示例java代码)
java·后端
叫我阿柒啊5 小时前
从全栈工程师视角解析Java与前端技术在电商场景中的应用
java· 消息队列· spring boot· 微服务· vue3· 安全· 前端框架
华仔啊5 小时前
Redis 不只是缓存!Java 打工人必知的 10 个真实工作场景,第 5 个太香了
java·后端
|CXHAO|5 小时前
使用tomcat本地部署draw.io
java·tomcat·draw.io
序属秋秋秋5 小时前
《C++进阶之STL》【set/map 使用介绍】
开发语言·c++·笔记·leetcode·stl·set·map
祈祷苍天赐我java之术5 小时前
Maven 从入门到精通
java·maven
没有bug.的程序员5 小时前
Redis 内存管理机制:深度解析与性能优化实践
java·数据库·redis·性能优化·内存管理机制