C++与Redis高效交互:通过optional与迭代器玩转String/List/Set......,打造高性能存储方案!

文章目录

本篇摘要

本文详细介绍了C++通过redis-plus-plus操作Redis的完整流程,涵盖String、List、Set、Hash、Zset等数据类型的常用命令(如set/getmset/mgetsadd/spophset/hgetzadd/zrange等),结合std::optional、迭代器等C++特性解析参数传递、返回值处理及无效值管理,并提供完整测试代码,助力开发者快速掌握Redis C++客户端开发。

一.C++之Redis客户端 String基础操作

1.String的nx及xx选项

测试代码:

cpp 复制代码
void test_nx_xx(Redis &redis)
{

    redis.flushall();
    auto ok1 = redis.set("key1", "val1", std::chrono::seconds(0), sw::redis::UpdateType::NOT_EXIST);
    if (redis.get("key1").has_value())
        cout << ok1 << " :" << redis.get("key1").value() << endl;
    auto ok2 = redis.set("key1", "vals", std::chrono::seconds(0), sw::redis::UpdateType::EXIST);
    if (redis.get("key1").has_value())
        cout << ok2 << " :" << redis.get("key1").value() << endl;
}

效果:

注意:这里的关于秒数必须要填,其次就是更新类型。

2.String的expires与ttl选项

测试代码:

cpp 复制代码
void test_expire_ttl(Redis &redis)
{
    using namespace std::chrono_literals;
    redis.flushall();
    auto ok1 = redis.set("key1", "val1", std::chrono::seconds(9), sw::redis::UpdateType::NOT_EXIST);
    // redis.expire("key1",2ms);
    std::this_thread::sleep_for(2s);
    cout << "剩余时间: " << redis.ttl("key1") << endl;
}

测试效果:

注:多种写法。

3.String的mset与megt选项

测试代码:

cpp 复制代码
void test_mset_mmget(Redis &redis)
{
    redis.flushall();
    // redis.mset({{"key1", "val1"},{"key2","val2"}}); 编译无法识别
    // 或者也可以搞个容器,传进去:
    redis.mset({std::make_pair("key1", "val1"), std::make_pair("key2", "val2")});

    vector<sw::redis::OptionalString> v;
    auto bt = std::back_inserter(v);
    redis.mget({"key1", "key2", "key3"}, bt);
    printoptional(v);
}

测试效果:

注:这里给mget传进去的是optionalString数组,构建后插迭代器需要注意。

4.String的incr与decr选项

测试代码:

cpp 复制代码
void test_inct_decr(Redis &redis)
{

    redis.flushall();
    auto ok1 = redis.set("key1", "2");
    cout << redis.get("key1").value() << endl;
    redis.incr("key1");
    cout << redis.get("key1").value() << endl;
    redis.decr("key1");
    cout << redis.get("key1").value() << endl;
}

测试效果:

注:对应的value一定是要数字字符串。

5.String的getrange与setrange选项

测试代码:

cpp 复制代码
void test_getrange_setrange(Redis&redis){
    redis.flushall();

   redis.setrange("key1",2,"2222");
  cout<< redis.getrange("key1",1,10)<<endl;
}

测试效果:

注:如果不是覆盖式,则跳过此位置,不插入,get的时候获得的是无不是空位串。

测试总代码

点我速看

二.C++之Redis客户端 List基础操作

1.List的lpush rpush及lpop rpop lange选项

测试效果:

测试代码:

cpp 复制代码
void test_lrpush_lrpop(Redis&redis){

    redis.flushall();
    redis.lpush("key1",{"1","2","3"});//这里第二个参数也重载了迭代器区间。
    redis.rpush("key1",{"4","5","6"});//这里第二个参数也重载了迭代器区间。
//321456
    vector<string> v;
    auto bt=std::back_inserter(v);
    redis.lrange("key1",0,5,bt);
    print(v);
    redis.rpop("key1");
    redis.lpop("key1");
    //2145
    v.clear();//这里back_inserter,尾插指向的是当前v的后一个位置,故需要及时清除。
    bt=std::back_inserter(v);
    redis.lrange("key1",0,5,bt);
    print(v);
}
2.List的llen选项

测试效果:

测试代码:

cpp 复制代码
void test_llen(Redis&redis){
    redis.flushall();
    redis.lpush("key1",{"1","2","3"});//这里第二个参数也重载了迭代器区间。
    redis.rpush("key1",{"4","5","6"});//这里第二个参数也重载了迭代器区间。

   cout<<"总长度:"<< redis.llen("key1")<<endl;
      vector<string> v;
    auto bt=std::back_inserter(v);
    redis.lrange("key1",0,10,bt);
    print(v);
   
}
3.List的blpop brpop选项

测试效果:

开始阻塞:

进行头插:

进行尾插:

测试代码:

cpp 复制代码
void test_blpop_brpop(Redis&redis){
     redis.flushall();
   cout<<"开始阻塞获取"<<endl;
   auto ret= redis.blpop({"key2","key1"});
   cout<<"list: "<<ret.value().first<<" val: "<<ret->second;
      cout<<"开始阻塞获取"<<endl;
    ret= redis.brpop({"key3"});
   cout<<"list: "<<ret.value().first<<" val: "<<ret->second;
}

测试总代码

点我速看

三.C++之Redis客户端 Set基础操作

1.Set的sadd spop及smembers scard选项

测试效果:

测试代码:

cpp 复制代码
void test_sadd_smembers_scard_spop(Redis &redis)
{

    redis.flushall();

    redis.sadd("key1", {"1", "2", "3"}); // 这里也可以是迭代器区间
    std::unordered_set<string> us;
    auto i = std::inserter(us, us.end()); // 这里需要用它,不能是back_inserter,因为set对应的进行迭代器插入调用的是insert,不是push_back(防止报错)
    redis.smembers("key1", i);
    print(us);
    cout << "个数:" << redis.scard("key1") << endl;
 
        cout << "spop结果: " << redis.spop("key1").value() << endl;
    cout << "个数:" << redis.scard("key1") << endl;
}

注:见注释。

2.Set的集合操作

测试效果:


测试代码:

cpp 复制代码
void test_sinter_sunion_sdiff_store(Redis &redis)
{
    redis.flushall();

    redis.sadd("key1", {"1", "2", "3"}); // 这里也可以是迭代器区间
    redis.sadd("key2", {"1", "2", "4"}); // 这里也可以是迭代器区间

    std::unordered_set<string> us;
    auto i = std::inserter(us, us.end()); // 这里需要用它,不能是back_inserter,因为set对应的进行迭代器插入调用的是insert,不是push_back(防止报错)
    redis.sinter({"key1", "key2"}, i);
    cout << "交集: " << endl;
    print(us);
    us.clear();
    i = std::inserter(us, us.end()); // 指向末尾
    redis.sunion({"key1", "key2"}, i);
    cout << "并集: " << endl;
    print(us);

    us.clear();
    i = std::inserter(us, us.end()); // 指向末尾
    redis.sdiff({"key1", "key2"}, i);
    cout << "差集: " << endl;
    print(us);

    redis.sinterstore("des1", {"key1", "key2"});
    redis.sunionstore("des2", {"key1", "key2"});
    redis.sdiffstore("des2", {"key1", "key2"});
}

测试总代码

点我速看

四.C++之Redis客户端 Hash基础操作

1.Hash的hset hget hdel exists选项

测试效果:

测试代码:

cpp 复制代码
void test_hset_hget_hdel_exists(Redis &redis)
{

    redis.flushall();

    redis.hset("key1", {std::make_pair("1", "2"), std::make_pair("2", "3")}); // 也可以pair类型迭代器
    cout << "个数: " << redis.exists("key1") << endl;
    cout << redis.hget("key1", "1").value() << endl;
    redis.hdel("key1", "1");
    cout << "个数: " << redis.exists("key1") << endl;
}
2.Hash的hmset hmget hkeys hvals选项

测试效果:

测试代码:

cpp 复制代码
void test_hmset_hmget_hkeys_hvals(Redis&redis){
redis.flushall();

    redis.hmset("key1", {std::make_pair("1", "2"), std::make_pair("2", "3")}); // 也可以pair类型迭代器
    vector<std::string> vp;
    auto bt=std::back_inserter(vp);
    redis.hmget("key1",{"1","2"},bt);
    cout<<" hmget : "<<endl;
    print(vp);
    vp.clear();
    bt=std::back_inserter(vp);
    redis.hkeys("key1",bt);
    cout<<" hmkeys : "<<endl;

    print(vp);
    vp.clear();
    bt=std::back_inserter(vp);
    redis.hvals("key1",bt);
    cout<<" hmget : "<<endl;

    print(vp);
}

测试总代码

点我速看

五.C++之Redis客户端 Zset基础操作

1.Zset的zadd zrange zcard zrem选项

测试效果:

测试代码:

cpp 复制代码
void test_zadd_zrange_zcard_zrem(Redis &redis)
{

    redis.flushall();
    redis.zadd("key1", {std::make_pair("zhangsan", 99), std::make_pair("lisi", 91), std::make_pair("tianqi", 0)});
    // 这里需要带score就传递迭代器的时候传递pair对应的,否则就直接传递String类型
    vector<std::pair<string, double>> vp;
    auto bt = std::back_inserter(vp);
    redis.zrange("key1", 0, -1, bt);
    cout << "zrange:";

    printpair(vp);
    cout << "zcard: " << redis.zcard("key1") << endl;
    redis.zrem("key1", "lisi");
    cout << "zcard: " << redis.zcard("key1") << endl;
}

2.Zset的zrank zscore zinter zunion选项

测试效果:


测试代码:

cpp 复制代码
void test_zrank_zscore_zinter_zunion(Redis &redis)
{

    redis.flushall();
    redis.zadd("key1", {std::make_pair("zhangsan", 99), std::make_pair("lisi", 91), std::make_pair("tianqi", 101)});
    redis.zadd("key2", {std::make_pair("zhangsan", 99), std::make_pair("lisi", 91), std::make_pair("zhaosi", 0)});

  cout<<"rank: "<< redis.zrank("key1","tianqi").value()<<endl;
  cout<<"score: "<< redis.zscore("key1","tianqi").value()<<endl;
  vector<string> v({"key1","key2"});
   redis.zinterstore("des1",v.begin(),v.end());
   redis.zunionstore("des2",v.begin(),v.end());

}

测试总代码

点我速看

六.基于C++Redis客户端简单使用的小结:

  1. 参数传递:当函数参数需传递多个值时,常支持初始化列表或一对迭代器的方式。
  2. 返回值处理:若函数返回值要表示多个数据,一般借助插入迭代器向容器添加元素(如不同类型的迭代器)。
  3. 无效值处理 :在涉及无效值的场景中,常搭配std::optional使用。
  4. 广泛适用性:很多C++代码都采用上述设计方式(实现多模版化+解耦合)。

七.本篇小结

本文详解C++用redis-plus-plus操作Redis的各类命令,涵盖String/List/Set等数据类型,结合optional与迭代器处理参数及返回值,附完整代码。

相关推荐
卿雪1 小时前
Redis 数据过期删除和内存淘汰策略
数据库·redis·缓存
+++.2 小时前
c++雪花屏(vsCode+cmake+mingw+ninja)
开发语言·c++·vscode
爬山算法2 小时前
Redis(170)如何使用Redis实现分布式限流?
数据库·redis·分布式
小年糕是糕手2 小时前
【C++】内存管理(下)
java·c语言·开发语言·数据结构·c++·算法
一叶之秋14122 小时前
深入剖析vector的底层实现原理
c++
艾莉丝努力练剑2 小时前
【Linux基础开发工具 (六)】Linux中的第一个系统程序——进度条Linux:详解回车、换行与缓冲区
java·linux·运维·服务器·c++·centos
8Qi82 小时前
Redis之Lua脚本与分布式锁改造
java·redis·分布式·lua
ZouZou老师2 小时前
C++设计模式之单例模式:以小区快递柜为例
c++·单例模式·设计模式
JavaBoy_XJ2 小时前
Redis在 Spring Boot 项目中的完整配置指南
数据库·spring boot·redis·redis配置