Redis C++ 客户端使用指南-基础指令篇

Redis C++ 客户端使用指南-基础指令篇

八月 14, 2025 次阅读

C++ 客户端连接

C++ 客户端连接 Redis 的基本步骤如下:

  1. 引入 Redis C++ 客户端库头文件
  2. 创建 Redis 客户端对象
  3. 连接到 Redis 服务器

当然,最重要的是需要安装 Redis C++ 客户端库,如 hiredis 或 redis-plus-plus。若还未安装,请跳转:redis-plus-plus

里面的安装步骤非常详细,按照说明进行即可。

在我们成功安装并配置好 Redis C++ 客户端后,就可以开始编写代码连接 Redis 服务器了,我们先实现一个非常简单的连接服务器代码,通过 ping 指令来判断连接是否成功。

#include <sw/redis++/redis++.h>
#include <iostream>

int main() {
    try {
        // 创建Redis连接,使用TCP协议连接本地6379端口
        sw::redis::Redis redis("tcp://127.0.0.1:6379");

        // 发送PING命令测试连接
        auto result = redis.ping();  // 返回OptionalString类型

        if (result) {
            // 成功连接会返回"PONG"
            std::cout << "连接成功: " << *result << std::endl;
        } else {
            std::cerr << "连接失败" << std::endl;
        }
    } catch (const std::exception &e) {
        // 捕获连接异常
        std::cerr << "Redis连接异常: " << e.what() << std::endl;
    }

    return 0;
}

编译时是需要告诉编译器静态库路径的,我们通过 cmake 添加相应的链接库:

cmake_minimum_required(VERSION 3.10)
project(RedisDemo)

set(CMAKE_CXX_STANDARD 17)

# 添加可执行文件
add_executable(redis_demo main.cpp)

# 链接必要的库
target_link_libraries(redis_demo 
    /usr/local/lib/libredis++.a  # redis-plus-plus静态库
    pthread                     # 线程库
    hiredis                     # hiredis基础库
)

hiredis 默认就在 /usr/lib 目录下,因此在 CMakeLists.txt 中只需要链接 hiredis 库即可,无需指定路径。但是 redis-plus-plus 默认是在 /usr/local/lib 目录下,因为我并没有将其安装到系统默认的库路径中,因此需要在 CMakeLists.txt 中指定其路径。若你在配置静态库默认路径的时候已经将 usr/local/lib 添加到系统库路径中,则无需手动指定。

可以看到,运行结果如下:

连接成功: PONG

基础指令

SET

set 用于设置指定 key 的字符串值。
对应的 C++ 接口为:

void Redis::set(const StringView &key, const StringView &val);

示例代码如下:

redis.set("key1", "value1");
redis.set("key2", "value2");
redis.set("key3", "value3");

配合 get 方法可以获取对应 key 的值:

if (auto val1 = redis.get("key1")) {
    std::cout << "value1: " << val1.value() << std::endl;
}

输出结果:

value1: value1
value2: value2
value3: value3
key4 does not exist

EXISTS、DEL

exists 用于判断一个或多个 key 是否存在,返回存在的 key 的数量。
del 用于删除指定的 key。

对应的 C++ 接口为:

long long Redis::exists(const std::initializer_list<StringView> &keys);
long long Redis::del(const StringView &key);

示例代码如下:

// 设置测试键
redis.set("key1", "value1");
redis.set("key2", "value2");
redis.set("key3", "value3");

// 检查多个键是否存在(返回存在的键数量)
long long exist_count = redis.exists({"key1", "key2", "key3", "key4"});
std::cout << "存在的键数量: " << exist_count << std::endl;

// 删除key1
redis.del("key1");

// 再次检查
exist_count = redis.exists({"key1", "key2", "key3", "key4"});
std::cout << "删除后存在的键数量: " << exist_count << std::endl;

输出结果:

存在的键数量: 3
删除后存在的键数量: 2

KEYS

keys 用于查找所有符合给定模式的 key。
对应的 C++ 接口为:

template <typename Output>
void Redis::keys(const StringView &pattern, Output output);

通常配合 std::back_inserter 使用,将结果插入到容器中。

示例代码如下:

std::vector<std::string> keys;
redis.keys("key*", std::back_inserter(keys));
std::cout << "All keys: ";
for (const auto &key : keys) {
    std::cout << key << " ";
}
std::cout << std::endl;

输出结果:

All keys: key3 key2 key1 

EXPIRE、TTL

expire 用于为指定 key 设置过期时间(秒),ttl 用于获取 key 的剩余过期时间(秒)。

对应的 C++ 接口为:

template <typename Rep, typename Period>
void Redis::expire(const StringView &key, const std::chrono::duration<Rep, Period> &timeout);
long long Redis::ttl(const StringView &key);

示例代码如下:

using namespace std::chrono_literals;
redis.expire("key1", 10s);
redis.expire("key2", 20s);
redis.expire("key3", 30s);
std::cout << "TTL of key1: " << redis.ttl("key1") << std::endl;
std::cout << "TTL of key2: " << redis.ttl("key2") << std::endl;
std::cout << "TTL of key3: " << redis.ttl("key3") << std::endl;
std::this_thread::sleep_for(5s);
std::cout << "TTL of key1 after 5 seconds: " << redis.ttl("key1") << std::endl;
std::cout << "TTL of key2 after 5 seconds: " << redis.ttl("key2") << std::endl;
std::cout << "TTL of key3 after 5 seconds: " << redis.ttl("key3") << std::endl;

输出结果:

TTL of key1: 10
TTL of key2: 20
TTL of key3: 30
TTL of key1 after 5 seconds: 5
TTL of key2 after 5 seconds: 15
TTL of key3 after 5 seconds: 25

TYPE

type 用于返回 key 所储存的值的类型。
对应的 C++ 接口为:

std::string Redis::type(const StringView &key);

示例代码如下:

redis.set("key1", "value1");
redis.lpush("key2", "value2");
std::vector<std::pair<std::string, double>> members = {
    {"value3", 1.0},
    {"value4", 2.0}
};
redis.zadd("key3", members.begin(), members.end());
redis.sadd("key4", {"value5", "value6"});
std::cout << "Type of key1: " << redis.type("key1") << std::endl;
std::cout << "Type of key2: " << redis.type("key2") << std::endl;
std::cout << "Type of key3: " << redis.type("key3") << std::endl;
std::cout << "Type of key4: " << redis.type("key4") << std::endl;

输出结果:

Type of key1: string
Type of key2: list
Type of key3: zset
Type of key4: set