一、基本介绍
Redis 是一个开源、基于内存、使用 C 语言编写的 key-value 数据库,并提供了多种语言的 API。它的数据结构十分丰富,基础数据类型包括:string(字符串)、list(列表,双向链表)、hash(散列,键值对集合)、set(集合,不重复)和 sorted set(有序集合)。主要可以用于数据库、缓存、分布式锁、消息队列等...
二、基本操作
安装hiredis
首先,你需要安装hiredis
库。可以通过包管理器或者从源代码编译安装。
连接到Redis服务器
创建一个redisContext
来连接到Redis服务器。
#include <hiredis/hiredis.h>
#include <iostream>int main() {// 连接到本地Redis服务器redisContext* c = redisConnect("127.0.0.1", 6379);if (c == NULL || c->err) {if (c) {std::cerr << "Error: " << c->errstr << std::endl;} else {std::cerr << "Can't allocate redis context" << std::endl;}exit(1);}// ... 进行Redis操作 ...redisFree(c);return 0;
}
缓存数据
使用SET
命令来缓存数据。
redisReply* reply = (redisReply*)redisCommand(c, "SET %s %s", "foo", "bar");
freeReplyObject(reply);
读取缓存数据
使用GET
命令来获取缓存的数据。
reply = (redisReply*)redisCommand(c, "GET foo");
if (reply->type == REDIS_REPLY_STRING) {std::cout << "FOO: " << reply->str << std::endl;
}
freeReplyObject(reply);
处理错误和断开连接
在操作完成后,检查错误并断开与Redis服务器的连接。
if (c->err) {// 处理错误std::cerr << "Error: " << c->errstr << std::endl;
}
redisFree(c);
高级用法
对于更高级的用法,比如使用管道(pipelining)来批量执行命令,可以使用redisCommandArgv
函数。
redisAppendCommandArgv(c, 3, "SET", "key", "value");
redisAppendCommandArgv(c, 2, "GET", "key");
// ... 添加更多命令 ...
redisGetReply(c, (void**)&reply, NULL);
if (reply->type == REDIS_REPLY_STRING) {std::cout << "Key: " << reply->str << std::endl;
}
freeReplyObject(reply);
三、简单示例
#include <iostream>
#include <hiredis/hiredis.h>int main() {// 创建连接到 Redis 服务器的连接redisContext *c = redisConnect("127.0.0.1", 6379);if (c != NULL && c->err) {std::cerr << "连接错误: " << c->errstr << std::endl;// 连接错误处理redisFree(c);return 1;}// 设置键值对redisReply *reply = (redisReply*)redisCommand(c, "SET %s %s", "key", "value");if (reply->type == REDIS_REPLY_ERROR) {std::cerr << "命令错误: " << reply->str << std::endl;// 错误处理freeReplyObject(reply);redisFree(c);return 1;}// 获取并打印键对应的值reply = (redisReply*)redisCommand(c, "GET %s", "key");if (reply->type == REDIS_REPLY_STRING) {std::cout << "获取到的值: " << reply->str << std::endl;}// 清理回复对象和连接freeReplyObject(reply);redisFree(c);return 0;
}