Redis C++ 客户端使用指南-Hash 篇

Redis C++ 客户端使用指南-Hash 篇

八月 16, 2025 次阅读

Redis++(C++)Hash 类型常用接口详解

在 C++ 后端开发中,redis++ 提供了丰富的 Hash 类型操作接口,支持字段的添加、查询、删除、批量操作等功能。下面结合实际代码示例,详细介绍常用接口的函数原型和用法。


hset、hget

函数原型:

long long hset(const StringView &key, const StringView &field, const StringView &val);
long long hset(const StringView &key, std::initializer_list<StringView> field_vals);
OptionalString hget(const StringView &key, const StringView &field);

示例:


// 清空Redis数据库
redis.flushall();

// 设置单个字段值
redis.hset("myhash", "field1", "value1");

// 使用初始化列表设置多个字段值
redis.hset("myhash", {"field2", "value2", "field3", "value3"});

// 获取字段值,使用value_or提供默认值
std::cout << "Field1: " << redis.hget("myhash", "field1").value_or("nil") << std::endl;
std::cout << "Field2: " << redis.hget("myhash", "field2").value_or("nil") << std::endl;
std::cout << "Field3: " << redis.hget("myhash", "field3").value_or("nil") << std::endl;

结果输出:

Field1: value1
Field2: value2
Field3: value3

hexists

函数原型:

bool hexists(const StringView &key, const StringView &field);

示例:


// 清空Redis数据库
redis.flushall();

// 设置多个字段值
redis.hset("myhash", "field1", "value1");
redis.hset("myhash", {"field2", "value2", "field3", "value3"});

// 检查字段是否存在
std::cout << "Field1 exists: " << (redis.hexists("myhash", "field1") ? "Yes" : "No") << std::endl;
std::cout << "Field2 exists: " << (redis.hexists("myhash", "field2") ? "Yes" : "No") << std::endl;
std::cout << "Field4 exists: " << (redis.hexists("myhash", "field4") ? "Yes" : "No") << std::endl;

结果输出:

Field1 exists: Yes
Field2 exists: Yes
Field4 exists: No

hdel

函数原型:

long long hdel(const StringView &key, const StringView &field);
long long hdel(const StringView &key, std::initializer_list<StringView> fields);

示例:


// 清空Redis数据库
redis.flushall();

// 设置多个字段值
redis.hset("myhash", "field1", "value1");
redis.hset("myhash", {"field2", "value2", "field3", "value3"});

// 删除单个字段
long long deleted = redis.hdel("myhash", "field1");
std::cout << "Deleted field1: " << deleted << std::endl;

// 删除多个字段(不存在的字段会被忽略)
deleted = redis.hdel("myhash", {"field2", "field4"});
std::cout << "Deleted field2 and field4: " << deleted << std::endl;

// 验证字段是否被删除
std::cout << "Field1 exists: " << (redis.hexists("myhash", "field1") ? "Yes" : "No") << std::endl;
std::cout << "Field2 exists: " << (redis.hexists("myhash", "field2") ? "Yes" : "No") << std::endl;
std::cout << "Field4 exists: " << (redis.hexists("myhash", "field4") ? "Yes" : "No") << std::endl;

结果输出:

Deleted field1: 1
Deleted field2 and field4: 1
Field1 exists: No
Field2 exists: No
Field4 exists: No

hlen

函数原型:

long long hlen(const StringView &key);

示例:


// 清空Redis数据库
redis.flushall();

// 设置多个字段值
redis.hset("myhash", "field1", "value1");
redis.hset("myhash", {"field2", "value2", "field3", "value3"});

// 获取Hash中的字段数量
long long len = redis.hlen("myhash");
std::cout << "Length of myhash: " << len << std::endl;

结果输出:

Length of myhash: 3

hkeys、hvals

函数原型:

template <typename Output>
void hkeys(const StringView &key, Output output);
template <typename Output>
void hvals(const StringView &key, Output output);

示例:


// 清空Redis数据库
redis.flushall();

// 设置多个字段值
redis.hset("myhash", "field1", "value1");
redis.hset("myhash", {"field2", "value2", "field3", "value3"});

// 获取所有字段名
std::vector<std::string> keys;
redis.hkeys("myhash", std::back_inserter(keys));
std::cout << "Keys in myhash: ";
for (const auto &key : keys) {
    std::cout << key << " ";
}
std::cout << std::endl;

// 获取所有字段值
std::vector<std::string> values;
redis.hvals("myhash", std::back_inserter(values));
std::cout << "Values in myhash: ";
for (const auto &value : values) {
    std::cout << value << " ";
}
std::cout << std::endl;

结果输出:

Keys in myhash: field1 field2 field3 
Values in myhash: value1 value2 value3 

hmset、hmget

函数原型:

void hmset(const StringView &key, std::initializer_list<StringView> field_vals);
template <typename Input>
void hmset(const StringView &key, Input first, Input last);

template <typename Output>
void hmget(const StringView &key, std::initializer_list<StringView> fields, Output output);

示例:


// 清空Redis数据库
redis.flushall();

// 方法1: 使用初始化列表批量设置字段值
redis.hmset("myhash", {"field1", "value1", "field2", "value2"});

// 方法2: 使用pair对象批量设置字段值
redis.hmset("myhash", {std::make_pair("field3", "value3"),
                       std::make_pair("field4", "value4")});

// 方法3: 使用vector批量设置字段值
std::vector<std::pair<std::string, std::string>> fields = {
    {"field5", "value5"},
    {"field6", "value6"}
};
redis.hmset("myhash", fields.begin(), fields.end());

// 批量获取多个字段值
std::vector<std::string> res;
redis.hmget("myhash", {"field1", "field2", "field3", "field4", "field5", "field6"}, 
           std::back_inserter(res));
for (const auto &value : res) {
    std::cout << "Value: " << value << std::endl;
}

结果输出:

Value: value1
Value: value2
Value: value3
Value: value4
Value: value5
Value: value6

通过这些接口,C++ 后端可以高效地操作 Redis 的 Hash 类型数据结构,支持字段的增删查改和批量操作,适合存储对象属性、配置信息