QT 使用hiRedis获取指定库第一层以:分隔符所有key,并返回key名称和key下面有多少个key
时间: 2024-04-05 10:35:15 浏览: 82
如果您想使用 HiRedis 库来获取指定 Redis 数据库下所有的 key,并返回每个 key 的名称和它下面有多少个 key,可以使用以下代码实现:
```c++
#include <iostream>
#include <string>
#include <vector>
#include <hiredis/hiredis.h>
// 定义 Redis 服务器相关信息
const std::string REDIS_HOST = "localhost";
const int REDIS_PORT = 6379;
const int REDIS_DB = 0;
int main() {
// 连接 Redis 服务器
redisContext* redis = redisConnect(REDIS_HOST.c_str(), REDIS_PORT);
if (redis == NULL || redis->err) {
std::cout << "Failed to connect to Redis: " << redis->errstr << std::endl;
return 1;
}
// 选择指定 Redis 数据库
redisReply* reply = (redisReply*) redisCommand(redis, "SELECT %d", REDIS_DB);
if (reply == NULL || reply->type == REDIS_REPLY_ERROR) {
std::cout << "Failed to select Redis database: " << reply->str << std::endl;
return 1;
}
freeReplyObject(reply);
// 获取指定库第一层以冒号分隔符所有 key
reply = (redisReply*) redisCommand(redis, "KEYS *:*");
if (reply == NULL || reply->type == REDIS_REPLY_ERROR) {
std::cout << "Failed to get Redis keys: " << reply->str << std::endl;
return 1;
}
// 遍历每个 key,并返回 key 名称和它下面有多少个 key
std::vector<std::pair<std::string, int>> keys;
for (int i = 0; i < reply->elements; i++) {
std::string key = reply->element[i]->str;
int num_subkeys = 0;
// 获取 key 下面有多少个 key
redisReply* subkeys_reply = (redisReply*) redisCommand(redis, "KEYS %s:*", key.c_str());
if (subkeys_reply != NULL && subkeys_reply->type != REDIS_REPLY_ERROR) {
num_subkeys = subkeys_reply->elements;
}
freeReplyObject(subkeys_reply);
keys.push_back(std::make_pair(key, num_subkeys));
}
freeReplyObject(reply);
// 输出每个 key 的名称和它下面有多少个 key
for (const auto& key_info : keys) {
std::cout << "Key: " << key_info.first << ", Num subkeys: " << key_info.second << std::endl;
}
// 断开 Redis 连接
redisFree(redis);
return 0;
}
```
这段代码首先连接到 Redis 服务器,然后选择指定的 Redis 数据库。接着,使用 `KEYS` 命令获取指定库第一层以冒号分隔符所有 key,并遍历每个 key。对于每个 key,使用 `KEYS` 命令获取它下面有多少个 key,并将这个信息保存到一个 `std::vector` 中。最后,输出每个 key 的名称和它下面有多少个 key。
阅读全文