所有接口可以参考文档:[redis-plus-plus/redis.h]。
redis对象
redis的所有操作都基于一个redis对象。
#include <iostream>
#include <sw/redis++/redis++.h>
int main()
{
sw::redis::Redis redis("tcp://127.0.0.1:6379");
std::string result = redis.ping();
std::cout << result << std::endl;
return 0;
}
在main函数中,先创建一个Redis对象,其包含在命名空间sw::redis::内部。在创建对象时,要制定ip和端口号,格式如下:
tcp://IP地址:端口
其中redis的默认端口为6379。
redis可以使用ping来检测连通性,通过redis.ping(),会返回一个字符串。
随后对代码进行编译:
g++ -o test_redis test.cpp -std=c++17 -l hiredis -l redis++ -l pthread
redis++需要依赖三个库:hiredis、redis++、pthread。
通用接口
set & get
示例:
#include <iostream>
#include <sw/redis++/redis++.h>
int main()
{
sw::redis::Redis redis("tcp://127.0.0.1:6379");
redis.set("key1", "111");
redis.set("key2", "222");
auto ret1 = redis.get("key1");
std::cout << ret1.value() << std::endl;
auto ret2 = redis.get("key2");
std::cout << ret2.value() << std::endl;
auto ret3 = redis.get("key3");
std::cout << ret3.value() << std::endl;
return 0;
}
输出结果:
111
222
terminate called after throwing an instance of 'std::bad_optional_access'
what(): bad optional access
Aborted (core dumped)
此处由于没有插入key3,所以get时得到的值为nil,最后输出时抛出了异常。
如果要处理这个情况,那要用到OptionalString的另一个特性。OptionalString可以隐式转化为bool类型,如果元素有效则为true,元素无效则为false。
输出之前,只需要判断一下返回值是否为true即可:
int main()
{
sw::redis::Redis redis("tcp://127.0.0.1:6379");
redis.set("key1", "111");
redis.set("key2", "222");
auto ret1 = redis.get("key1");
if (ret1)
std::cout << ret1.value() << std::endl;
auto ret2 = redis.get("key2");
if (ret2)
std::cout << ret2.value() << std::endl;
auto ret3 = redis.get("key3");
if (ret3)
std::cout << ret3.value() << std::endl;
return 0;
}
exists
-
exists用于检测key是否存在,函数声明如下:long long exists(const StringView &key);
但是其为什么要以long long作为返回值?其实exists还有另一个函数重载:
template <typename T>
long long exists(std::initializer_list<T> il);
其接收一个初始化列表,也就是可以同时接收多个key,此时有多少个key存在,就返回多少。
#include <iostream>
#include <sw/redis++/redis++.h>
int main()
{
sw::redis::Redis redis("tcp://127.0.0.1:6379");
redis.set("key1", "111");
redis.set("key2", "222");
std::cout << redis.exists("key1") << std::endl;
std::cout << redis.exists({"key1", "key2", "key3"}) << std::endl;
return 0;
}
del
-
del用于删除key,函数声明如下:long long del(const StringView &key);
template <typename T>
long long del(std::initializer_list<T> il);
和exists一样,支持删除一个或多个key,删除多个时要通过初始化列表。
flushall
-
flushall用于清空整个redis,函数声明如下:void flushall(bool async = false);
该接口会清空redis内的所有数据,开发环境慎用,一般而言参数直接用默认的false即可。
keys
-
keys用于搜索符合条件的key,keys函数声明如下:template <typename Output>
void keys(const StringView &pattern, Output output);
keys用于搜索所有符合条件的key,此处第一个参数pattern是匹配模式,output是一个插入迭代器,用于获取符合条件的key,元素类型是字符串,std::string或者StringView。
int main()
{
sw::redis::Redis redis("tcp://127.0.0.1:6379");
redis.flushall();
redis.set("key1", "111");
redis.set("key2", "222");
redis.set("key3", "222");
redis.set("key4", "222");
std::vector<std::string> result;
auto it = std::back_inserter(result);
redis.keys("*", it);
for (auto& ret : result)
std::cout << ret << std::endl;
return 0;
}
此处的插入迭代器,是一种专门用于将元素插入到容器中的迭代器,主要有以下三种:
std::front_insert_iterator:在容器头部插入std::back_insert_iterator:在容器尾部插入std::insert_iteraotr:在容器任意位置插入
如果想要获取到容器对应的插入迭代器,可以使用标准库的接口:
std::front_inserter(容器);
std::back_inserter(容器);
std::inserter(容器);
这种插入迭代器,可以完成插入与容器的解耦合,redis返回的结果集,可以不用重载各种set、vector等容器,而是使用统一的插入迭代器完成。
ttl
-
ttl用于获取key的剩余超时时间,函数声明如下:long long ttl(const StringView &key);
expire
-
expire用于设置超时时间,函数声明如下:bool expire(const StringView &key, long long timeout);
bool expire(const StringView &key, const std::chrono::seconds &timeout);
expire设置超时时间时,有两种模式,第一个重载的timeout是long long类型,以秒为单位,也可以使用std::chrono::seconds来控制。
返回值与redis原生的ttl完全一致,如果key不存在返回-2,如果key存在但是没有超时时间返回-1。
#include <iostream>
#include <chrono>
#include <sw/redis++/redis++.h>
int main()
{
sw::redis::Redis redis("tcp://127.0.0.1:6379");
redis.flushall();
redis.set("key1", "111");
redis.set("key2", "222");
redis.set("key3", "222");
redis.expire("key1", 10);
redis.expire("key2", std::chrono::seconds(1));
std::cout << redis.ttl("key1") << std::endl;
std::cout << redis.ttl("key2") << std::endl;
std::cout << redis.ttl("key3") << std::endl;
std::cout << redis.ttl("key4") << std::endl;
return 0;
}
type
-
type用于获取key对于的value的类型,函数声明如下:std::string type(const StringView &key);
其返回值是标准的std::string。