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

server/2024/9/22 9:43:02/

文章目录

    • list 类型相关接口
      • lpush和lrange
      • rpush
      • lpop和rpop
      • blpop和brpop
      • llen
    • set 类型相关接口
      • sadd和smembers
      • sismember
      • scard
      • spop
      • sinster
      • sinterstore

list__1">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->firststd::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;}

在这里插入图片描述


http://www.ppmy.cn/server/120223.html

相关文章

javascript数据结构

在 JavaScript 中&#xff0c;数据结构的选择和实现对于编写高效、可维护的代码至关重要。JavaScript 提供了一系列内置的数据结构&#xff0c;同时也支持自定义复杂的数据结构。以下是 JavaScript 中常用的一些数据结构及其基本介绍&#xff1a; 内置数据结构 1. 数组&#…

redis单点、主从、哨兵、集群的不同

redis哨兵模式有几个&#xff1a; 单点主从哨兵集群 区别 主从模式&#xff1a;读写分离。 哨兵模式&#xff1a;哨兵模式是在主从模式的基础上添加了故障检测和自动故障转移的功能。还是读写分离。 哨兵节点负责监控主节点和从节点的状态&#xff0c;并在主节点宕机时选举新…

Linux--守护进程与会话

进程组 概念 进程组就是一个或多个进程的集合。 一个进程组可以包含多个进程。 下面我们通过一句简单的命令行来展示&#xff1a; 为什么会有进程组&#xff1f; 批量操作&#xff1a;进程组允许将多个进程组织在一起&#xff0c;形成一个逻辑上的整体。当需要对多个进程…

计算机网络 8.*结构化布线

第八章 结构化布线 第一节 结构化布线基础 一、认识结构化布线 1.定义&#xff1a;在建筑物或楼宇内安装的传输线路&#xff0c;是一个用于语音、数据、影像和其他信息技术的标准结构化布线系统。 2.任务&#xff1a;使语音和数据通信设备、交换设备和其他信息管理系统彼此相…

使用SoapUI、Postman工具调用Webservice方法

SoapUI工具更适合调用Webservice使用。 1.使用SoapUI工具调用Webservice 创建“New SOAP Project” 自行定义一个项目名称&#xff0c;输入wsdl地址&#xff1a; 在左侧列表找到方法名&#xff0c;双击“Request 1”, 在请求数据中&#xff0c;添加对应的参数&#xff0c;然…

Kafka-Go学习

文章目录 1. **安装 kafka-go**2. **基本概念**3. **kafka-go 基本用法**3.1 创建 Producer&#xff08;生产者&#xff09;3.2 创建 Consumer&#xff08;消费者&#xff09;3.3 生产者和消费者配置详解生产者配置 (kafka.WriterConfig)消费者配置 (kafka.ReaderConfig) 4. **…

golang学习笔记2-语法要求,注释与代码风格

声明&#xff1a;本人已有C&#xff0c;C,Python基础&#xff0c;只写本人认为的重点&#xff0c;方便自己回顾。 一、语法要求 1.每个go文件必须有package声明且只能有一个 2.定义过的变量&#xff08;全局变量除外&#xff09;或使用import导入的包在之后必须使用 3.和C/C一样…

2024数学建模研赛华为杯选题建议详细思路代码文章A题B题C题D题E题F题研究生数模竞赛

选题难度初步分析: 华为题B建议相关专业的同学完成 A题建议物理、力学、机械等相关专业等同学完成 其他题目C<E<F、D C难点:提升预测精度 脱颖而出 E难点:对视频数据处理 对交通基本定理的了解 F难点:构建机理建模公式 D难点:对大数据进行处理 基于地理信息软件进行分析 …