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

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

八月 16, 2025 次阅读

Redis++(C++)ZSet(有序集合)类型常用接口详解

在 C++ 后端开发中,redis++ 提供了丰富的 ZSet(有序集合)类型操作接口,支持元素的添加、查询、删除、分数和排名获取等功能。下面结合实际代码示例,详细介绍常用接口的函数原型和用法。


zadd、zrange

函数原型:

long long zadd(const StringView &key, const StringView &member, double score);
long long zadd(const StringView &key, std::initializer_list<std::pair<StringView, double>> m);
template <typename Input>
long long zadd(const StringView &key, Input first, Input last);

template <typename Output>
void zrange(const StringView &key, long long start, long long stop, Output output);

示例:


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

// 方法1: 添加单个元素(成员value1,分数1.0)
redis.zadd("myzset", "value1", 1.0);

// 方法2: 使用initializer_list批量添加元素
redis.zadd("myzset", {
    std::make_pair("value2", 2.0), 
    std::make_pair("value3", 3.0)
});

// 方法3: 使用容器和迭代器批量添加元素
std::vector<std::pair<std::string, double>> values = {
    {"value4", 4.0},
    {"value5", 5.0}
};
redis.zadd("myzset", values.begin(), values.end());

// 查询有序集合全部元素(带分数)
std::cout << "ZSET contents after zadd:" << std::endl;
std::vector<std::pair<std::string, double>> results;
redis.zrange("myzset", 0, -1, std::back_inserter(results));
for (const auto &res : results) {
    std::cout << res.first << ": " << res.second << std::endl;
}

// 只查询成员名(不带分数)
std::vector<std::string> members;
redis.zrange("myzset", 0, -1, std::back_inserter(members));
for (const auto &member : members) {
    std::cout << member << std::endl;
}

结果输出:

ZSET contents after zadd:
value1: 1
value2: 2
value3: 3
value4: 4
value5: 5
value1
value2
value3
value4
value5

zcard

函数原型:

long long zcard(const StringView &key);

示例:


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

// 添加测试元素
redis.zadd("myzset", "value1", 1.0);
redis.zadd("myzset", {
    std::make_pair("value2", 2.0), 
    std::make_pair("value3", 3.0)
});

// 获取有序集合元素数量
auto zcard = redis.zcard("myzset");
std::cout << "ZSET cardinality: " << zcard << std::endl;

// 获取不存在的有序集合元素数量
auto non_exist_zcard = redis.zcard("non_exist_zset");
std::cout << "Non-existent ZSET cardinality: " << non_exist_zcard << std::endl;

结果输出:

ZSET cardinality: 3
Non-existent ZSET cardinality: 0

zrem

函数原型:

long long zrem(const StringView &key, const StringView &member);

示例:


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

// 添加测试元素
redis.zadd("myzset", "value1", 1.0);
redis.zadd("myzset", {
    std::make_pair("value2", 2.0), 
    std::make_pair("value3", 3.0)
});

// 删除指定元素value2
redis.zrem("myzset", "value2");

// 查看删除后的集合内容
std::cout << "ZSET contents after zrem:" << std::endl;
std::vector<std::pair<std::string, double>> results;
redis.zrange("myzset", 0, -1, std::back_inserter(results));
for (const auto &res : results) {
    std::cout << res.first << ": " << res.second << std::endl;
}

结果输出:

ZSET contents after zrem:
value1: 1
value3: 3

zscore

函数原型:

OptionalDouble zscore(const StringView &key, const StringView &member);

示例:


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

// 添加测试元素
redis.zadd("myzset", "value1", 1.0);
redis.zadd("myzset", {
    std::make_pair("value2", 2.0), 
    std::make_pair("value3", 3.0)
});

// 获取元素分数(返回OptionalDouble)
auto score = redis.zscore("myzset", "value2");
if (score) {
    std::cout << "Score of value2: " << score.value() << std::endl;
} else {
    std::cout << "value2 not found in ZSET" << std::endl;
}

// 获取不存在的元素分数
auto non_exist_score = redis.zscore("myzset", "value4");
if (!non_exist_score) {
    std::cout << "value4 not found in ZSET" << std::endl;
}

结果输出:

Score of value2: 2
value4 not found in ZSET

zrank

函数原型:

OptionalLongLong zrank(const StringView &key, const StringView &member);

示例:


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

// 添加测试元素
redis.zadd("myzset", "value1", 1.0);
redis.zadd("myzset", {
    std::make_pair("value2", 2.0), 
    std::make_pair("value3", 3.0)
});

// 获取元素排名(从0开始)
auto rank = redis.zrank("myzset", "value2");
if (rank) {
    std::cout << "Rank of value2: " << rank.value() << std::endl;
} else {
    std::cout << "value2 not found in ZSET" << std::endl;
}

// 获取不存在的元素排名
auto non_exist_rank = redis.zrank("myzset", "value4");
if (!non_exist_rank) {
    std::cout << "value4 not found in ZSET" << std::endl;
}

结果输出:

Rank of value2: 1
value4 not found in ZSET

通过这些接口,C++ 后端可以高效地操作 Redis 的 ZSet(有序集合)类型数据结构,支持元素的增删查、分数和排名获取等多种业务场