C++ 连接 Redis:redis-plus-plus 安装与使用入门指南

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,因此我们需要先安装它。

image.png
第一步:安装 hiredis

在 CentOS 上:

sudo yum install hiredis-devel.x86_64 

在 Ubuntu 上:

sudoapt update sudoaptinstall libhiredis-dev 
image.png
第二步:编译安装 redis-plus-plus

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

sudomakeinstall
image.png

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

cd redis-plus-plus 
image.png

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

image.png

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

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

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

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


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

克隆 redis-plus-plus 仓库:

git clone https://github.com/sewenew/redis-plus-plus.git 
image.png
提示: 如果 git clone 出现下图所示的证书相关错误:


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

之后再次尝试 git clone

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

编写 “Hello World”

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

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

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

查找库文件:

ls /usr/local/lib/ 


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

查找头文件:

ls /usr/local/include/sw/redis++ 
image.png


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

第二步:编写代码 (hello.cc)
#include<iostream>// 引入 redis-plus-plus 头文件#include<sw/redis++/redis++.h>intmain(){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;}return0;}

说明:6379 是 Redis 的默认端口。我们可以通过 netstat 命令确认 Redis 服务器正在监听此端口。

netstat -anp |grep6379
image.png
第三步:编译程序

编译时,我们需要告诉编译器头文件的位置,并链接 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 
image.png


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

创建 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 命令即可完成编译。

第四步:运行程序
./hello 

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

image.png

总结

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

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

Read more

Neo4j 知识讲解与在线工具使用教程

图数据库领域的核心工具 ——Neo4j,同时详细拆解其在线预览控制台(https://console-preview.neo4j.io/)的使用方法,以及查询工具(https://console-preview.neo4j.io/tools/query)的模块功能。 一、Neo4j 核心知识铺垫 在使用工具前,我们需要先理解 Neo4j 的本质和核心概念,这是后续操作的基础。 1. 什么是 Neo4j? Neo4j 是世界上最流行的原生图数据库(Native Graph Database),专门用于存储、查询和分析 “实体之间的关联关系”。它与我们熟悉的 MySQL 等关系型数据库的核心差异的是: * 关系型数据库(MySQL):用 “表 + 行 + 外键” 间接表示关联,查询多表关联时需频繁 JOIN,效率低; * 图数据库(Neo4j)

By Ne0inhk
【无人机】无人机路径规划算法

【无人机】无人机路径规划算法

目录 一、引言:无人机与路径规划算法 二、路径规划算法基础 (一)定义与重要性 (二)规划目标与约束条件 三、常见路径规划算法详解 (一)A * 算法 (二)Dijkstra 算法 (三)RRT(快速扩展随机树)算法 (四)蚁群算法 四、算法应用实例与效果展示 (一)不同场景下的算法应用 (二)算法性能对比数据 五、算法的优化与发展趋势 (一)现有算法的优化策略 (二)结合新技术的发展方向 六、挑战与展望 (一)面临的技术挑战 (二)未来应用前景 七、结论 一、引言:无人机与路径规划算法 在科技飞速发展的今天,无人机作为一种极具创新性的技术产物,已深度融入我们生活的方方面面,

By Ne0inhk

简单理解:单片机怎么和FPGA通信

了解单片机与 FPGA 之间的通信方式,这是嵌入式系统中非常常见的硬件交互场景,核心是要根据传输速率、硬件资源、开发复杂度选择合适的通信协议。 一、主流通信方式及实现方案 单片机和 FPGA 通信主要分为并行通信和串行通信两大类,下面按从易到难、从低速到高速的顺序介绍: 1. 通用 IO 口(GPIO)自定义协议(最简单) 适合低速、短距离、数据量小的场景(如按键、状态交互),完全自定义通信规则,开发灵活。 * 硬件连接: * 单片机:1 个输出引脚(发送) + 1 个输入引脚(接收) * FPGA:1 个输入引脚(接收) + 1 个输出引脚(发送) * 需共地,建议加 10K 上拉电阻提高稳定性。 * 单片机端(C 语言,

By Ne0inhk