Redis——redispluspls库list及set范例相干接口利用

打印 上一主题 下一主题

主题 1080|帖子 1080|积分 3240

list 范例相干接口

lpush和lrange

  1. void lrange_lpush(sw::redis::Redis& redis){
  2.     std::cout<<"lpush 和 lrange"<<std::endl;
  3.     redis.flushall();
  4.     //插入单个元素
  5.     redis.lpush("key","111");
  6.     //插入一组元素,基于初始化列表
  7.     redis.lpush("key",{"222","333","444"});
  8.     //插入一组元素,基于迭代器
  9.     vector<string> values = {"555","666","777"};
  10.     redis.lpush("key",values.begin(),values.end());
  11.     //lrange获取列表中元素
  12.     vector<string> result;
  13.     auto it  = std::back_inserter(result);
  14.     redis.lrange("key",0,-1,it);
  15.     for(const auto& elem:result){
  16.         std::cout<<elem<<std::endl;
  17.     }
  18. }
复制代码

由于lpush是头插,所以后来的元素在前面
rpush

  1. std::cout<<"lpush 和 lrange"<<std::endl;
  2.     redis.flushall();
  3.     //插入单个元素
  4.     redis.lpush("key","111");
  5.     //插入一组元素,基于初始化列表
  6.     redis.lpush("key",{"222","333","444"});
  7.     //插入一组元素,基于迭代器
  8.     vector<string> values = {"555","666","777"};
  9.     redis.lpush("key",values.begin(),values.end());
  10.     //lrange获取列表中元素
  11.     vector<string> result;
  12.     auto it  = std::back_inserter(result);
  13.     redis.lrange("key",0,-1,it);
  14.     for(const auto& elem:result){
  15.         std::cout<<elem<<std::endl;
  16.     }
复制代码

lpop和rpop

  1. void lpop_rpop(sw::redis::Redis& redis){
  2.     std::cout<<"rpush 和 lrange"<<std::endl;
  3.     redis.flushall();
  4.     redis.rpush("key",{"1","2","3","4"});
  5.     auto result = redis.lpop("key");
  6.     //插入一组元素,基于迭代器
  7.    if(result) std::cout<<"lpop:"<<result.value()<<std::endl;
  8.    result = redis.rpop("key");
  9.    if(result) std::cout<<"rpop:"<<result.value()<<std::endl;
  10. }
复制代码

blpop和brpop

这里先了解一下blpop的返回值

   什么是 OptionalStringPair, optional里面包裹了一个pair,pair里面是string
  blpop要返回的内容是两个部分

  • 这个元素属于哪个list(blpop可以同时监听多个list)
  • 当前被删除的元素
blpop还可以设置超时时间,如果在指定时间内,还没有其他客户端往指定的list中插入元素,此时blpop就直接返回了,此时返回的就是一个无效值了
  1. std::cout<<"blpop"<<std::endl;
  2.     redis.flushall();
  3.     auto result =  redis.blpop("key");
  4.     if(result) {
  5.         std::cout<<"key:"<<result.value().first<<std::endl;//result->first
  6.         std::cout<<"elem:"<<result.value().second<<std::endl;//result->second
  7.     }else{
  8.         std::cout<<"result 无效"<<std::endl;
  9.     }
复制代码

这里由于没有元素在里面,blpop就被阻塞到这里了,别的开一个中端在redis-cli中插入key,就没有阻塞了

  auto result = redis.blpop({"key","key2","key3"});当然也可以一次监听多个key,只要其中有一个key有元素插入,就会制止阻塞
设置超时时间
  1.   using namespace std::chrono_literals;
  2.     std::cout<<"blpop"<<std::endl;
  3.     redis.flushall();
  4.     auto result =  redis.blpop("key",5s);
  5.     if(result) {
  6.         std::cout<<"key:"<<result.value().first<<std::endl;
  7.         std::cout<<"elem:"<<result.value().second<<std::endl;
  8.     }else{
  9.         std::cout<<"result 无效"<<std::endl;
  10.     }
复制代码

llen

  1. void llen(sw::redis::Redis& redis){
  2.     std::cout<<"llen"<<std::endl;
  3.     redis.flushall();
  4.     redis.lpush("key",{"111","222","333","444"});
  5.     long long len = redis.llen("key");
  6.     std::cout<<len<<std::endl;
  7. }
  8. int main()
  9. {
  10.     sw::redis::Redis redis("tcp://127.0.0.1:6379");
  11.     llen(redis);
  12.     return 0;
  13. }
复制代码

   看到这里不难发现,redis-plus-plus这个库,接口设计的风格,好坏常统一的
  当一个函数,参数需要通报多个参数的时候,往往都是支持 初始化列表 大概是一对迭代器的方式来实现的
  当一个函数 返回值需要多个数据的时候,也往往会借助插入迭代器,来实现往一个容器中添加元素的效果
  当某些场景涉及到无效值的时候,往往会搭配 std:ptional来举行利用
  很多C++的代码,都是按照上方式来设计的
  set 范例相干接口

sadd和smembers

  1. std::cout<<"sadd 和 smemers"<<std::endl;
  2.     redis.flushall();
  3.     //一次添加一个元素
  4.     redis.sadd("key","111");
  5.    
  6.     //一次添加多个元素使用初始化列表
  7.     redis.sadd("key",{"222","333","444"});
  8.     //一次添加多个元素使用迭代器
  9.     std::set<string> elems = {"555","666","777"};
  10.     redis.sadd("key",elems.begin(),elems.end());
  11.     //获取上述元素
  12.     //vector<string> result;
  13.     //auto it  = std::back_inserter(result);
  14.      std::set<string> result;
  15.     //由于set的元素的顺序是固定的,插入的位置无所谓,最终都是有序的,但是这里必须要 传入一个插入的位置
  16.     auto it  = std::inserter(result,result.end());//begin,end,或者其他位置都可以
  17.     redis.smembers("key",it);
  18.     for(const auto&x:result){
  19.         std::cout<<x<<std::endl;
  20.     }
复制代码

sismember

  1. std::cout<<"sismember "<<std::endl;
  2.     redis.flushall();
  3.     redis.sadd("key",{"222","333","444"});
  4.     bool ret =  redis.sismember("key","222");
  5.     std::cout<<"222-ret:"<<ret<<std::endl;
  6.     ret =  redis.sismember("key","111");
  7.     std::cout<<"111-ret:"<<ret<<std::endl;
复制代码

scard

  1.   std::cout<<"scard "<<std::endl;
  2.     redis.flushall();
  3.     redis.sadd("key",{"222","333","444"});
  4.    
  5.     long long result = redis.scard("key");
  6.     std::cout<<"result:"<<result<<std::endl;
复制代码

spop

  1. std::cout<<"spop "<<std::endl;
  2.     redis.flushall();
  3.     redis.sadd("key",{"111","222","333","444"});
  4.    
  5.     auto result = redis.spop("key");
  6.     if(result) std::cout<<result.value()<<std::endl;
  7.     else std::cout<<"result 无效"<<std::endl;
复制代码

sinster

  1. std::cout<<"sinter "<<std::endl;
  2.     redis.flushall();
  3.     redis.sadd("key1",{"222","333","444"});
  4.     redis.sadd("key2",{"111","222","333"});
  5.     std::set<string> result;
  6.     auto it = std::inserter(result,result.end());
  7.     redis.sinter({"key1","key2"},it);
  8.     for(const auto&elem:result){
  9.         std::cout<<elem<<std::endl;
  10.     }
复制代码

sinterstore

  1. std::cout<<"sinterstore "<<std::endl;
  2.     redis.flushall();
  3.     redis.sadd("key1",{"222","333","444"});
  4.     redis.sadd("key2",{"111","222","333"});
  5.     long long len = redis.sinterstore("key3",{"key1","key2"});
  6.     std::cout<<"len: "<<len<<std::endl;
  7.    
  8.     std::set<string> result;
  9.     auto it  = std::inserter(result,result.end());
  10.     redis.smembers("key3",it);
  11.     for(const auto&x:result){
  12.         std::cout<<x<<std::endl;
  13.     }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

勿忘初心做自己

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表