Redis C++ 客户端使用指南-Set 篇
八月 15, 2025
次阅读
Redis++(C++)Set 类型常用接口详解
在 C++ 后端开发中,redis++ 提供了丰富的 Set 类型操作接口,支持集合的添加、查询、弹出、集合运算等功能。下面结合实际代码示例,详细介绍常用接口的函数原型和用法。
sadd、smembers
函数原型:
long long sadd(const StringView &key, const StringView &member);
template <typename Output>
void smembers(const StringView &key, Output output);
示例:
// 清空Redis数据库
redis.flushall();
// 向集合添加元素(自动去重)
redis.sadd("myset", "value1"); // 添加元素value1
redis.sadd("myset", "value2"); // 添加元素value2
redis.sadd("myset", "value3"); // 添加元素value3
// 获取集合所有成员
std::cout << "Set contents after sadd:" << std::endl;
std::set<std::string> values;
// 使用inserter将结果插入到set容器
redis.smembers("myset", std::inserter(values, values.end()));
for (const auto &value : values) {
std::cout << value << std::endl; // 输出集合内容
}
结果输出:
Set contents after sadd:
value1
value2
value3
sismember
函数原型:
bool sismember(const StringView &key, const StringView &member);
示例:
// 清空Redis数据库
redis.flushall();
// 向集合添加元素
redis.sadd("myset", "value1");
redis.sadd("myset", "value2");
// 检查元素是否存在于集合中
std::cout << "Is value1 a member of myset? "
<< (redis.sismember("myset", "value1") ? "Yes" : "No") << std::endl;
std::cout << "Is value3 a member of myset? "
<< (redis.sismember("myset", "value3") ? "Yes" : "No") << std::endl;
结果输出:
Is value1 a member of myset? Yes
Is value3 a member of myset? No
spop
函数原型:
OptionalString spop(const StringView &key);
示例:
// 清空Redis数据库
redis.flushall();
// 向集合添加多个元素
redis.sadd("myset", "value1");
redis.sadd("myset", "value2");
redis.sadd("myset", "value3");
// 查看集合原始内容
std::cout << "Set contents before spop:" << std::endl;
std::set<std::string> values;
redis.smembers("myset", std::inserter(values, values.end()));
for (const auto &value : values) {
std::cout << value << std::endl;
}
// 随机弹出一个元素(原子操作)
auto spop_value = redis.spop("myset");
std::cout << "SPop value: " << spop_value.value_or("nil") << std::endl;
// 查看弹出后的集合内容
std::cout << "Set contents after spop:" << std::endl;
values.clear();
redis.smembers("myset", std::inserter(values, values.end()));
for (const auto &value : values) {
std::cout << value << std::endl;
}
结果输出:
Set contents before spop:
value1
value2
value3
SPop value: value2
Set contents after spop:
value1
value3
scard
函数原型:
long long scard(const StringView &key);
示例:
// 清空Redis数据库
redis.flushall();
// 向集合添加元素
redis.sadd("myset", "value1");
redis.sadd("myset", "value2");
redis.sadd("myset", "value3");
// 获取集合元素数量(基数)
std::cout << "Set cardinality: " << redis.scard("myset") << std::endl;
// 获取不存在的集合基数
std::cout << "Non-existent set cardinality: " << redis.scard("non_exist_set") << std::endl;
结果输出:
Set cardinality: 3
Non-existent set cardinality: 0
sinter、sunion
函数原型:
template <typename Output>
void sinter(std::initializer_list<StringView> keys, Output output);
template <typename Output>
void sunion(std::initializer_list<StringView> keys, Output output);
示例:
// 清空Redis数据库
redis.flushall();
// 准备两个测试集合
redis.sadd("set1", "value1"); // set1: {value1, value2}
redis.sadd("set1", "value2");
redis.sadd("set2", "value2"); // set2: {value2, value3}
redis.sadd("set2", "value3");
// 计算两个集合的交集
std::cout << "Intersection of set1 and set2:" << std::endl;
std::set<std::string> intersection;
redis.sinter({"set1", "set2"}, std::inserter(intersection, intersection.end()));
for (const auto &value : intersection) {
std::cout << value << std::endl; // 输出: value2
}
// 计算两个集合的并集
std::cout << "Union of set1 and set2:" << std::endl;
std::set<std::string> unionsection;
redis.sunion({"set1", "set2"}, std::inserter(unionsection, unionsection.end()));
for (const auto &value : unionsection) {
std::cout << value << std::endl; // 输出: value1, value2, value3
}
结果输出:
Intersection of set1 and set2:
value2
Union of set1 and set2:
value1
value2
value3
sinterstore
函数原型:
long long sinterstore(const StringView &destination, std::initializer_list<StringView> keys);
示例:
// 清空Redis数据库
redis.flushall();
// 准备两个测试集合
redis.sadd("set1", "value1");
redis.sadd("set1", "value2");
redis.sadd("set2", "value2");
redis.sadd("set2", "value3");
// 计算交集并将结果存储到新集合
redis.sinterstore("result", {"set1", "set2"});
// 查看结果集合内容
std::cout << "Result set contents:" << std::endl;
std::set<std::string> result;
redis.smembers("result", std::inserter(result, result.end()));
for (const auto &value : result) {
std::cout << value << std::endl; // 输出: value2
}
结果输出:
Result set contents:
value2
通过这些接口,C++ 后端可以高效地操作 Redis 的 Set 类型数据结构,支持集合的基本操作和集合运算,适合多种业务场景。
查看评论