C++ 中使用redis

本文介绍如何在C++环境中使用hiredis库连接并操作Redis数据库。包括安装配置步骤、示例代码及常见错误处理方法。

安装好redis后,进入deps目录,执行make intall

 

 

则会将hiredis.h等文件 copy到 /usr/local/include/hiredis/

 

会将 lib文件放入/usr/local/lib/ 中。

 

在C++中时候用hiredis.h时,只需要 

#include <hiredis/hiredis.h>  这样引入即可。

 

不多说了,上代码 testRedis.cpp ,出处 http://blog.youkuaiyun.com/kingqizhou/article/details/8104693:

#include <stdio.h>
#include <stdlib.h>
#include <hiredis/hiredis.h> 
#include <string>
#include <iostream>
#include <string.h>

void doTest(std::string ip,unsigned int  port)
{
		//redis默认监听端口为6387 可以再配置文件中修改
		redisContext* redis = redisConnect(ip.c_str(), port);

		if ( NULL == redis || redis->err)
		{       // redis为NULL与redis->err是两种不同的错误,若redis->err为true,可使用redis->errstr查看错误信息
				redisFree(redis);
				std::cout << "Connect to redisserver failed" << std::endl;
				return ;
		}	

		std::cout << "Connect to redisserver success" << std::endl;

		const char* command1 = "set stest1 value1";
		redisReply* reply = (redisReply*)redisCommand(redis, command1);    // 执行命令,结果强转成redisReply*类型
		if( NULL == reply)
		{
				printf("Execut command1 failure\n");
				redisFree(redis);     // 命令执行失败,释放内存
				return;
		}
		if( !(reply->type == REDIS_REPLY_STATUS && strcasecmp(reply->str,"OK")==0))
		{       // 判断命令执行的返回值
				printf("Failed to execute command[%s]\n",command1);
				freeReplyObject(reply);
				redisFree(redis);
				return;
		}	
		freeReplyObject(reply);
		printf("Succeed to execute command[%s]\n", command1);
		// 一切正常,则对返回值进行处理v


		const char* command2 = "strlen stest1";
		reply = (redisReply*)redisCommand(redis, command2);    // 执行命令,结果强转成redisReply*类型

		if ( reply->type != REDIS_REPLY_INTEGER) 
		{       // 判断命令执行的返回值
				printf("Failed to execute command[%s]\n",command2);
				freeReplyObject(reply);
				redisFree(redis);
				return;
		}	
		freeReplyObject(reply);
		std::cout << "result of Command strlen test1: " << reply->integer << std::endl;

		const char* command3 = "get stest1";  
		redisReply*	r = (redisReply*)redisCommand(redis, command3);  
		if ( r->type != REDIS_REPLY_STRING)  
		{  
				printf("Failed to execute command[%s]\n",command3);  
				freeReplyObject(r);  
				redisFree(redis);  
				return;  
		}  
		printf("The value of 'stest1' is %s\n", r->str);  
		freeReplyObject(r);  
		printf("Succeed to execute command[%s]\n", command3);  

		const char* command4 = "get stest2";  
		r = (redisReply*)redisCommand(redis, command4);  
		if ( r->type != REDIS_REPLY_NIL)  
		{  
				printf("Failed to execute command[%s]\n",command4);  
				freeReplyObject(r);  
				redisFree(redis);  
				return;  
		}  
		printf("The value of 'stest2' is %s\n", r->str);  
		freeReplyObject(r);  
		printf("Succeed to execute command[%s]\n", command4);     


		redisFree(redis);  
}

int main()
{
	std::string ip = "127.0.0.1";
	unsigned int prot = 6379;

	doTest(ip,prot);
}

 

 

编译 g++ -o testRedis testRedis.cpp

报错:

testRedis.cpp:(.text+0x1d): undefined reference to `redisConnect'

testRedis.cpp:(.text+0x3a): undefined reference to `redisFree'

testRedis.cpp:(.text+0xa0): undefined reference to `redisCommand'

testRedis.cpp:(.text+0xc0): undefined reference to `redisFree'

testRedis.cpp:(.text+0x104): undefined reference to `freeReplyObject'

testRedis.cpp:(.text+0x10f): undefined reference to `redisFree'

testRedis.cpp:(.text+0x11c): undefined reference to `freeReplyObject'

 

于是 使用了 g++ -lhiredis -o testRedis testRedis.cpp。

编译通过。

 

运行./testRedis 

 

报错

./testRedis: error while loading shared libraries: libhiredis.so.0.10: cannot open shared object file: No such file or directory

 

显然是没有找到 libhiredis.so.0.10 这文件,但是我们可以看到  libhiredis.so.0.10 是在/usr/local/lib/ 中的。

 

解决方法 参考 http://blog.chinaunix.net/uid-26212859-id-3256667.html

 

<think>好的,我现在需要帮助用户了解如何在C++使用Redis客户端库。用户之前询问了Ubuntu安装Redis的教程,现在转向了C++集成。根据提供的引用内容,用户引用了多个C++客户端库的信息,比如cpp_redisredis-plus-plus和hiredis,还有rclientpp的接口定义。用户可能需要一个全面的教程,涵盖库的选择、安装、基本使用以及示例代码。 首先,我应该整理用户提供的引用内容。引用[1]提到了cpp_redis的GitHub仓库和C++11/14/17特性,引用[2]讨论了rclientpp的使用,引用[3]分析了cpp_redis的代码结构,引用[4]和[5]涉及redis-plus-plus的安装和使用示例。用户的需求是教程,所以需要覆盖主流的库,比较它们的优缺点,然后给出安装步骤和基本用法示例。 我需要确定用户的环境是Ubuntu,因为之前的教程是关于Ubuntu安装Redis的。因此,安装步骤应该基于Ubuntu系统。接下来,要考虑如何组织内容,可能分为库的选择、安装、基本操作和高级功能。引用中的信息显示,redis-plus-plus和hiredis是常用的,而cpp_redis可能由于维护状态的问题需要谨慎推荐。此外,用户提到的rclientpp可能是一个特定实现的客户端,但引用中没有足够的信息,可能需要简要提及或建议其他更流行的库。 在教程部分,需要确保代码示例正确,并且步骤清晰。例如,安装hiredis可能需要通过apt-get,而redis-plus-plus需要从源码编译,并且依赖hiredis。同时,用户可能需要了解如何编译程序,比如使用g++命令链接库文件。 另外,用户可能遇到常见问题,比如编译错误、链接库缺失等,应该在注意事项部分提到。引用中的信息提到安装后的路径,如头文件和库文件的位置,这需要准确反映在教程中,避免用户找不到文件。 最后,相关问题需要与C++Redis相关,比如连接池管理、性能优化、异步操作等,这有助于用户进一步学习。需要确保问题覆盖用户可能感兴趣的进阶主题。 总结步骤:介绍主流库,比较优缺点,提供安装指南,给出基本使用示例,注意事项,以及相关问题。需要参考用户提供的引用内容,尤其是安装路径和代码结构部分,确保信息准确。</think>### C++ 使用 Redis 客户端库完整教程 以下是针对 C++ 开发者集成 Redis 的详细指南,涵盖**主流客户端库选择**、**核心API用法**和**实战示例**,基于你提供的引用内容优化整理: --- ### 一、主流 C++ Redis 客户端库对比 | 库名称 | 特点 | 适用场景 | |----------------|---------------------------------------------------------------------|-----------------------| | **hiredis** | Redis 官方维护的轻量级同步客户端,C语言接口简单直接 | 快速开发、低延迟需求 | | **redis-plus-plus** | 基于 hiredis 封装的现代 C++17 异步/同步客户端,支持连接池和STL容器 | 高性能服务、复杂业务逻辑 | | **cpp_redis** | 支持异步操作的 C++11 客户端(注意:GitHub 仓库已归档,维护状态不确定) | 学习研究、小型项目 | --- ### 二、环境准备(Ubuntu 系统) 1. **安装 Redis 服务端**(若未安装): ```bash sudo apt install redis-server ``` 2. **安装编译工具链**: ```bash sudo apt install build-essential cmake libhiredis-dev ``` --- ### 三、客户端库安装与配置 #### **1. hiredis(官方基础库)** - **安装**: ```bash sudo apt install libhiredis-dev # 直接通过APT安装[^4] ``` - **验证头文件路径**: ```bash ls /usr/include/hiredis/ # 检查是否存在hiredis.h[^4] ``` #### **2. redis-plus-plus(推荐)** - **源码编译安装**: ```bash git clone https://github.com/sewenew/redis-plus-plus.git cd redis-plus-plus mkdir build && cd build cmake .. -DREDIS_PLUS_PLUS_BUILD_TEST=OFF make && sudo make install # 头文件安装到/usr/local/include,库文件到/usr/local/lib[^4] ``` --- ### 四、基础 API 使用示例 #### **场景1:同步连接与数据操作(redis-plus-plus)** ```cpp #include <sw/redis++/redis++.h> using namespace sw::redis; int main() { // 创建连接池(线程安全) ConnectionOptions opts; opts.host = "127.0.0.1"; opts.port = 6379; auto redis = Redis(opts); // 字符串操作 redis.set("key", "Hello Redis"); // 设置键值 auto value = redis.get("key"); // 获取值 if (value) { std::cout << *value << std::endl; // 输出: Hello Redis } // 哈希表操作 redis.hset("user:1000", {{"name", "Alice"}, {"age", "30"}}); std::unordered_map<std::string, std::string> user_data; redis.hgetall("user:1000", std::inserter(user_data, user_data.begin())); return 0; } ``` #### **场景2:异步操作(hiredis 基础用法)** ```cpp #include <hiredis/hiredis.h> int main() { redisContext *conn = redisConnect("127.0.0.1", 6379); if (conn->err) { printf("Connection error: %s\n", conn->errstr); return 1; } // 执行命令并获取回复 redisReply *reply = (redisReply*)redisCommand(conn, "SET counter 100"); freeReplyObject(reply); reply = (redisReply*)redisCommand(conn, "GET counter"); printf("Counter value: %s\n", reply->str); // 输出: 100 freeReplyObject(reply); redisFree(conn); return 0; } ``` --- ### 五、高级功能与最佳实践 1. **连接池管理**: ```cpp ConnectionPoolOptions pool_opts; pool_opts.size = 5; // 连接池大小 auto redis = Redis(opts, pool_opts); // 复用连接提升性能[^5] ``` 2. **事务支持**: ```cpp auto tx = redis.transaction(); tx.set("key1", "value1"); tx.incr("counter"); tx.exec(); // 原子化执行所有命令[^5] ``` 3. **发布订阅模式**: ```cpp auto sub = redis.subscriber(); sub.on_message([](std::string channel, std::string msg) { std::cout << "Received: " << msg << " from " << channel << std::endl; }); sub.subscribe("news"); sub.consume(); // 启动监听循环 ``` --- ### 六、编译命令与链接参数 ```bash # 使用 redis-plus-plus 编译示例 g++ -std=c++17 your_code.cpp -o app -lredis++ -lhiredis -pthread ``` --- ### 注意事项 1. **头文件路径问题**:若编译报错,检查 `-I/usr/local/include` 和 `-L/usr/local/lib` 是否需显式添加[^4] 2. **线程安全**:多线程环境下建议使用连接池,避免共享单个连接 3. **错误处理**:对 Redis 命令的返回结果需校验空指针(如 `redis.get()` 返回 `OptionalString`) --- ### 相关问题 1. 如何实现 Redis 分布式锁的 C++ 封装? 2. Redis 集群模式下 C++ 客户端如何配置多节点访问? 3. 如何通过 C++ 客户端监控 Redis 的性能指标? 4. 在异步编程模型中如何避免 Redis 回调地狱? 如需进一步了解某个库的底层实现(如 `tacopie` 的 I/O 多路复用机制[^3]),可提供专项解析。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值