浅谈C++之Redis缓存
一、基本介绍
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;
}