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

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

八月 15, 2025 次阅读

redis++ 中 String 类型相关接口详解

redis++(sw::redis::Redis)为 Redis 字符串类型提供了丰富的 C++ 接口,下面将详细介绍常用接口的函数原型及用法。


set、get

函数原型:

void set(const StringView &key, const StringView &val);
template <typename Rep, typename Period>
void set(const StringView &key, const StringView &val, const std::chrono::duration<Rep, Period> &timeout);
OptionalString get(const StringView &key);

示例:

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

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

// 获取键值,使用OptionalString接收返回值
// OptionalString需要调用value()方法获取实际值
if (auto val1 = redis.get("key1")) {
    std::cout << "value1: " << val1.value() << std::endl;
}
if (auto val2 = redis.get("key2")) {
    std::cout << "value2: " << val2.value() << std::endl;
}
if (auto val3 = redis.get("key3")) {
    std::cout << "value3: " << val3.value() << std::endl;
}

// 获取不存在的键
if (auto val4 = redis.get("key4")) {
    std::cout << "value4: " << val4.value() << std::endl;
} else {
    std::cout << "key4 does not exist" << std::endl;
}

结果:

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

set(带过期时间)/ get(过期后)

函数原型:

template <typename Rep, typename Period>
void set(const StringView &key, const StringView &val, const std::chrono::duration<Rep, Period> &timeout);
OptionalString get(const StringView &key);

示例:

// 使用chrono时间字面量
using namespace std::chrono_literals;

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

// 设置带过期时间的键值对(5秒、10秒、15秒后过期)
redis.set("key1", "value1", 5s);
redis.set("key2", "value2", 10s);
redis.set("key3", "value3", 15s);

std::cout << "Sleeping for 7 seconds..." << std::endl;
// 线程休眠7秒
std::this_thread::sleep_for(7s);

// 检查键是否已过期
if (auto val1 = redis.get("key1")) {
    std::cout << "value1: " << val1.value() << std::endl;
} else {
    std::cout << "key1 has expired" << std::endl;  // 5秒后已过期
}

if (auto val2 = redis.get("key2")) {
    std::cout << "value2: " << val2.value() << std::endl;  // 10秒未过期
}

if (auto val3 = redis.get("key3")) {
    std::cout << "value3: " << val3.value() << std::endl;  // 15秒未过期
}

结果:

Sleeping for 7 seconds...
key1 has expired
value2: value2
value3: value3

mset、mget

函数原型:

void mset(std::initializer_list<std::pair<StringView, StringView>> kvs);
template <typename Input>
void mset(Input first, Input last);

template <typename Output>
void mget(std::initializer_list<StringView> keys, Output output);

mset 的两种 key-value 传递方式

  1. 直接用 initializer_list:

    redis.mset({std::make_pair("key1", "value1"), std::make_pair("key2", "value2")});
  2. 用迭代器(适合已有容器):

    std::vector<std::pair<std::string, std::string>> values = {
        {"key3", "value3"},
        {"key4", "value4"}
    };
    redis.mset(values.begin(), values.end());

mget 获取 key 的细节

  • mget 结果用 std::vector<sw::redis::OptionalString> 存储,表示每个 key 的值(不存在时为 null)。
  • 需用插入迭代器(如 std::back_inserter)将结果插入容器。
  • 取值时可用 value_or("nil"),不存在时返回 “nil”。

示例:

std::vector<sw::redis::OptionalString> res;
redis.mget({"key1", "key2", "key3", "key4", "key5"}, std::back_inserter(res));
std::cout << "MGET results:" << std::endl;
for (const auto &value : res) {
    std::cout << value.value_or("nil") << std::endl;
}

结果:

MGET results:
value1
value2
value3
value4
nil

getrange、setrange

函数原型:

std::string getrange(const StringView &key, long long start, long long end);
long long setrange(const StringView &key, long long offset, const StringView &val);

示例:

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

// 设置初始值
redis.set("key1", "Hello, World!");
std::cout << "Original value of key1: " << redis.get("key1").value() << std::endl;

// 获取子字符串(索引从0开始,包含结束位置)
auto range = redis.getrange("key1", 7, 11);  // 获取"World"
std::cout << "Range from key1 (7 to 11): " << range << std::endl;

// 修改子字符串(从指定偏移量开始替换)
redis.setrange("key1", 7, "Redis");  // 将"World"替换为"Redis"
std::cout << "Updated value of key1: " << redis.get("key1").value() << std::endl;

结果:

Original value of key1: Hello, World!
Range from key1 (7 to 11): World
Updated value of key1: Hello, Redis!

incr、decr

函数原型:

long long incr(const StringView &key);
long long decr(const StringView &key);

示例:

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

// 设置初始计数器值
redis.set("counter", "10");
std::cout << "Initial value of counter: " << redis.get("counter").value() << std::endl;

// 原子递增操作(值+1)
redis.incr("counter");
std::cout << "Value after incr: " << redis.get("counter").value() << std::endl;

// 原子递减操作(值-1)
redis.decr("counter");
std::cout << "Value after decr: " << redis.get("counter").value() << std::endl;

// 注意:如果键不存在,incr/decr会将其初始化为0再操作
redis.del("new_counter");  // 确保键不存在
redis.incr("new_counter"); // 从0开始递增到1
std::cout << "New counter value: " << redis.get("new_counter").value() << std::endl;

结果:

Initial value of counter: 10
Value after incr: 11
Value after decr: 10
New counter value: 1

通过这些接口,C++ 后端可以高效、类型安全地操作 Redis 的字符串类型,在使用的时候一定要注意异常处理,同时需要注意在合适的场合选择不同的重载方法来满足具体的需求。