Redis C++ 客户端使用指南-基础指令篇
C++ 客户端连接
C++ 客户端连接 Redis 的基本步骤如下:
- 引入 Redis C++ 客户端库头文件
- 创建 Redis 客户端对象
- 连接到 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