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 类型数据结构,支持字段的增删查改和批量操作,适合存储对象属性、配置信息
查看评论