首页 > 数据库 >Redis——redispluspls库list及set类型相关接口使用

Redis——redispluspls库list及set类型相关接口使用

时间:2024-09-21 14:20:56浏览次数:3  
标签:std set cout list redis redispluspls result key auto

文章目录

list 类型相关接口

lpush和lrange

void lrange_lpush(sw::redis::Redis& redis){
    std::cout<<"lpush 和 lrange"<<std::endl;
    redis.flushall();

    //插入单个元素
    redis.lpush("key","111");

    //插入一组元素,基于初始化列表
    redis.lpush("key",{"222","333","444"});

    //插入一组元素,基于迭代器
    vector<string> values = {"555","666","777"};
    redis.lpush("key",values.begin(),values.end());

    //lrange获取列表中元素
    vector<string> result;
    auto it  = std::back_inserter(result);
    redis.lrange("key",0,-1,it);

    for(const auto& elem:result){
        std::cout<<elem<<std::endl;
    }
}

在这里插入图片描述

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

rpush

 std::cout<<"lpush 和 lrange"<<std::endl;
    redis.flushall();

    //插入单个元素
    redis.lpush("key","111");

    //插入一组元素,基于初始化列表
    redis.lpush("key",{"222","333","444"});

    //插入一组元素,基于迭代器
    vector<string> values = {"555","666","777"};
    redis.lpush("key",values.begin(),values.end());

    //lrange获取列表中元素
    vector<string> result;
    auto it  = std::back_inserter(result);
    redis.lrange("key",0,-1,it);

    for(const auto& elem:result){
        std::cout<<elem<<std::endl;
    }

在这里插入图片描述

lpop和rpop

void lpop_rpop(sw::redis::Redis& redis){
    std::cout<<"rpush 和 lrange"<<std::endl;
    redis.flushall();

    redis.rpush("key",{"1","2","3","4"});

    auto result = redis.lpop("key");
    //插入一组元素,基于迭代器
   if(result) std::cout<<"lpop:"<<result.value()<<std::endl;

   result = redis.rpop("key");
   if(result) std::cout<<"rpop:"<<result.value()<<std::endl;
}

在这里插入图片描述

blpop和brpop

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

在这里插入图片描述

什么是 OptionalStringPair, optional里面包裹了一个pair,pair里面是string

blpop要返回的内容是两个部分

  1. 这个元素属于哪个list(blpop可以同时监听多个list)
  2. 当前被删除的元素

blpop还可以设置超时时间,如果在指定时间内,还没有其他客户端往指定的list中插入元素,此时blpop就直接返回了,此时返回的就是一个无效值了

std::cout<<"blpop"<<std::endl;
    redis.flushall();

    auto result =  redis.blpop("key");
    if(result) {
        std::cout<<"key:"<<result.value().first<<std::endl;//result->first
        std::cout<<"elem:"<<result.value().second<<std::endl;//result->second
    }else{
        std::cout<<"result 无效"<<std::endl;
    }

在这里插入图片描述

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

在这里插入图片描述

auto result = redis.blpop({"key","key2","key3"});当然也可以一次监听多个key,只要其中有一个key有元素插入,就会停止阻塞

设置超时时间

  using namespace std::chrono_literals;
    std::cout<<"blpop"<<std::endl;
    redis.flushall();

    auto result =  redis.blpop("key",5s);
    if(result) {
        std::cout<<"key:"<<result.value().first<<std::endl;
        std::cout<<"elem:"<<result.value().second<<std::endl;
    }else{
        std::cout<<"result 无效"<<std::endl;
    }

在这里插入图片描述

llen

void llen(sw::redis::Redis& redis){
    std::cout<<"llen"<<std::endl;
    redis.flushall();

    redis.lpush("key",{"111","222","333","444"});
    long long len = redis.llen("key");
    std::cout<<len<<std::endl;
} 
int main()
{
    sw::redis::Redis redis("tcp://127.0.0.1:6379");
    llen(redis);
    return 0;
}

在这里插入图片描述

看到这里不难发现,redis-plus-plus这个库,接口设计的风格,是非常统一的

当一个函数,参数需要传递多个参数的时候,往往都是支持 初始化列表 或者是一对迭代器的方式来实现的

当一个函数 返回值需要多个数据的时候,也往往会借助插入迭代器,来实现往一个容器中添加元素的效果

当某些场景涉及到无效值的时候,往往会搭配 std::optional来进行使用

很多C++的代码,都是按照上方式来设计的

set 类型相关接口

sadd和smembers

 std::cout<<"sadd 和 smemers"<<std::endl;
    redis.flushall();

    //一次添加一个元素
    redis.sadd("key","111");
    
    //一次添加多个元素使用初始化列表
    redis.sadd("key",{"222","333","444"});

    //一次添加多个元素使用迭代器
    std::set<string> elems = {"555","666","777"};
    redis.sadd("key",elems.begin(),elems.end());

    //获取上述元素
    //vector<string> result;
    //auto it  = std::back_inserter(result);
     std::set<string> result;
    //由于set的元素的顺序是固定的,插入的位置无所谓,最终都是有序的,但是这里必须要 传入一个插入的位置
    auto it  = std::inserter(result,result.end());//begin,end,或者其他位置都可以
    redis.smembers("key",it);
    for(const auto&x:result){
        std::cout<<x<<std::endl;
    }

在这里插入图片描述

sismember

std::cout<<"sismember "<<std::endl;
    redis.flushall();

    redis.sadd("key",{"222","333","444"});
    bool ret =  redis.sismember("key","222");
    std::cout<<"222-ret:"<<ret<<std::endl;

    ret =  redis.sismember("key","111");
    std::cout<<"111-ret:"<<ret<<std::endl;

在这里插入图片描述

scard

  std::cout<<"scard "<<std::endl;
    redis.flushall();

    redis.sadd("key",{"222","333","444"});
    
    long long result = redis.scard("key");
    std::cout<<"result:"<<result<<std::endl;

在这里插入图片描述

spop

 std::cout<<"spop "<<std::endl;
    redis.flushall();

    redis.sadd("key",{"111","222","333","444"});
    
    auto result = redis.spop("key");
    if(result) std::cout<<result.value()<<std::endl;
    else std::cout<<"result 无效"<<std::endl;

在这里插入图片描述

sinster

 std::cout<<"sinter "<<std::endl;
    redis.flushall();

    redis.sadd("key1",{"222","333","444"});
    redis.sadd("key2",{"111","222","333"});

    std::set<string> result;
    auto it = std::inserter(result,result.end()); 
    redis.sinter({"key1","key2"},it);
    for(const auto&elem:result){
        std::cout<<elem<<std::endl;
    }

在这里插入图片描述

sinterstore

 std::cout<<"sinterstore "<<std::endl;
    redis.flushall();

    redis.sadd("key1",{"222","333","444"});
    redis.sadd("key2",{"111","222","333"});
    long long len = redis.sinterstore("key3",{"key1","key2"});
    std::cout<<"len: "<<len<<std::endl;
    
    std::set<string> result;
    auto it  = std::inserter(result,result.end());
    redis.smembers("key3",it);

    for(const auto&x:result){
        std::cout<<x<<std::endl;
    }

在这里插入图片描述

标签:std,set,cout,list,redis,redispluspls,result,key,auto
From: https://blog.csdn.net/m0_70289867/article/details/142416481

相关文章

  • Java中set接口的学习
    Set接口目录Set接口HashSetTreeSetLinkedHashSetEnumSetCopyOnWriteArraySetHashSetJava中的HashSet是集合框架中非常重要的一个类,它实现了Set接口,提供了存储不重复元素的功能。特点无序性:HashSet不保证元素的顺序,即元素的存储顺序与插入顺序无关。遍历HashSet的结果是无序......
  • WPF ListBox ListBox.ItemTemplate DataTemplate Custom UserControl
    <ListBox.ItemTemplate><DataTemplate><local:ImageTbkUCImgUrl="{BindingDataContext.ImgUrl,RelativeSource={RelativeSourceMode=FindAncestor,AncestorType=ListBoxItem}}"U......
  • 数据结构: 顺序表(Seqlist篇) 手把手带你了解数据结构~
    文章目录前言一、顺序表的概念1.顺序表是什么?2.顺序表和数组的区别二、顺序表的实现1.顺序表的结构(1).静态顺序表(2).动态顺序表2.顺序表的初始化3.顺序表的销毁4.顺序表尾插5.顺序表头插6.顺序表尾删7.顺序表头删8.顺序表获取元素下标9.顺序表任意位置插入......
  • LLM DATASET
    大模型的能力来源https://arxiv.org/pdf/2402.18041  大模型合规来源https://arxiv.org/html/2402.12193v2    大模型的罪恶检测来源https://www.kaggle.com/datasets/odins0n/ucf-crime-dataset/data  codemathhttps://github.com/mlabonne/llm-data......
  • Unity编辑器扩展秘籍-实现一个可拖放的List
    usingSystem;usingSystem.Collections.Generic;usingUnityEditor;usingUnityEngine;usingObject=UnityEngine.Object;namespaceyaojz{publicclassDroppableListView{privateList<DroppableItem>_datas=newList<DroppableIt......
  • JavaScript 中的 SET(初学者教程)
    你好,您是否正在寻找一种存储唯一值、允许插入值、查找值总数和删除值的数据结构?套装是最佳选择。许多编程语言都包含内置的set数据结构,javascript也不例外。让我们更深入地了解集合的工作原理。设置是什么???set是一种数据结构,可让您存储任何类型的唯一值,无论是原始值还是对......
  • 从 PyPI 安装 Superset
    本文主要记录本人从PyPI安装Superset的过程和遇到的问题。从PyPI安装Superset,首先应先创建虚拟环境。可以参考我的另外两篇博文,学习Python和虚拟环境的管理:Python版本管理Python虚拟环境管理Superset目前不支持Python3.12。具体错误信息和原因见我的另外......
  • Java怎么把多个对象的list的数据合并
    在Java中,将多个对象的列表数据合并成一个新的列表可以通过多种方式实现。假设有一个List的列表,每个列表都包含相同类型的对象,可以使用StreamAPI或传统的循环来实现这一目标。示例代码假设我们有一个User类:publicclassUser{privateStringname;privateinta......
  • asp.net webapi 控制器中获取appsettings.json 中的数组对象
    appsettings.json文件内容: {"Logging":{"LogLevel":{"Default":"Information","Microsoft.AspNetCore":"Warning"}},"MyConfigKey":"MyConfigValue"......
  • 2024-09-20 如何去除vue前端框架upload组件中的缓存 ==》v-if+setTimeout
    在很多前端框架中的upload组件,比如arco-design的a-upload组件,在遍历渲染过程中会发现上传完成后,切换到另一个a-upload组件,它的图片会显示上一个a-upload组件的缓存 正常上传,然后点击红色,红色对应的图片应该被清空,实际上却并没有,如下解决方案:给a-upload组件加一个条件判断v-if......