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 传递方式
直接用 initializer_list:
redis.mset({std::make_pair("key1", "value1"), std::make_pair("key2", "value2")});用迭代器(适合已有容器):
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 的字符串类型,在使用的时候一定要注意异常处理,同时需要注意在合适的场合选择不同的重载方法来满足具体的需求。
查看评论