当前位置: 首页 > news >正文

初识Redis · C++客户端set和zset

目录

前言:

set

sadd sismember smembers

spop scard

sinter sinterstore

zset

zadd zrange zcard

zrem zrank zscore


前言:

前文我们已经介绍了string list hash在Redis-plus-plus的使用,本文我们开始介绍set和zset在redis-plus-plus的使用。

本文作为Redis初阶的一个收尾,介绍完对应的使用之后,我们就可以进入到Redis的底层原理了。


set

sadd sismember smembers

对于sadd来说,它就是set add的意思嘛,在命令行中,我们可以直接sadd key v1 v2 v3,在这里,我们可以单次插入,也可以是初始化列表,也可以是迭代器,它的讨论和前面的list几乎是一样的。对于sismember来说,就是判断value是否在key里面,命令行的用法是sismember key member,这里其实用法也是,不过我们需要用bool类型接受而已。对于smembers来说,就是用来得到所有的member的,按照之前的套路,我们需要用一个迭代器来带出对应的member:

void test_1(Redis &redis)
{redis.flushall();redis.sadd("key","1");redis.sadd("key",{"2", "3"});std::vector<std::string> vec{"4","5"};redis.sadd("key",vec.begin(), vec.end());bool ans = redis.sismember("key", "3");if(ans) std::cout << "is member" << std::endl;else std::cout << "not member" << std::endl;auto iter = std::inserter(vec, vec.end());redis.smembers("key", iter);for(auto e : vec)std::cout << e << " ";std::cout << std::endl;}

spop scard

我们仍然要注意一个点是,set的删除是随即删除的,所以我们删除的时候是没有办法指定的,对于scard,它就是一个用来计数的,代码如下:

void test_2(Redis &redis)
{redis.flushall();redis.sadd("key","1");redis.sadd("key",{"2", "3"});auto ans = redis.spop("key");if(ans) std::cout << ans.value() << std::endl;else std::cout << "set is empty" << std::endl;long long res = redis.scard("key");std::cout << res << std::endl;}

sinter sinterstore

在命令行中,使用sinter是直接返回交集的结果,在redis-plus-plus中,我们可以将结果存储到一个容器里面,sinterstore是可以将结果存储到另一个key中,不过是存储的位置不同罢了。

void test_3(Redis &redis)
{redis.flushall();redis.sadd("key", "1");redis.sadd("key", {"2", "3"});redis.sadd("key1", {"1", "2", "4"});std::vector<std::string> vec;auto iter = std::back_inserter(vec);redis.sinter({"key", "key1"}, iter);for(auto e : vec)std::cout << e << " ";std::cout << std::endl;}

void test_4(Redis &redis)
{redis.flushall();redis.sadd("key", "1");redis.sadd("key", {"2", "3"});redis.sadd("key1", {"1", "2", "4"});long long n = redis.sinterstore("key2", {"key", "key1"});std::cout << n << std::endl;std::vector<std::string> vec;auto iter = std::back_inserter(vec);redis.smembers("key2", iter);for(auto e : vec)std::cout << e << " ";std::cout << std::endl;
}

对于set的交集并集差集都是一样的,所以这里我们就使用交集来介绍了,其他的两个我们完全可以依次类推。


zset

对于zset来说,相对就要麻烦一点,因为它的查询,就会带着两种风格进行查询,一种是带着score的,一种是不带着score的,并且因为分数的存在,就还可以引入排名,虽然是分数的附属品,但是也为zset的难度增加了一点。

zadd zrange zcard

void test_1(Redis &redis)
{redis.flushall();redis.zadd("key", "zhangsan",10);redis.zadd("key", {std::make_pair("wangwu",30),std::make_pair("lisi",20)});std::vector<std::pair<std::string, double>> vec{std::make_pair("zhaoliu",40),std::make_pair("tianqi",50)};redis.zadd("key", vec.begin(), vec.end());std::vector<std::pair<std::string, double>> ans;auto res = std::back_inserter(ans);redis.zrange("key", 0, -1, res);for(auto e : ans)std::cout << e.first  << ":" << e.second<< std::endl;std::cout << redis.zcard("key") << std::endl;
}

不过大家把这段代码放在自己的机器上跑可能会出问题,因为对于zrange来说,旧版本的redis是可以直接不用参数,直接带分数返回的,但是新版本的需要带上第五个参数true。

zrem zrank zscore

对于zrem来说,就是删除元素,不过它和set不同的是它可以指定元素删除,对于zrank就是返回排名,对于zscore来说就是返回对应的分数:

void test_2(Redis &redis)
{redis.flushall();redis.zadd("key", "zhangsan",10);redis.zadd("key", {std::make_pair("wangwu",30),std::make_pair("lisi",20)});redis.zrem("key", "zhangsan");long long n = redis.zcard("key");std::cout << n << std::endl;auto ans = redis.zscore("key", "lisi");if(ans) std::cout << ans.value() << std::endl;else std::cout << "not exist" << std::endl;auto res = redis.zrank("key", "lisi");if(res) std::cout << res.value() << std::endl;else std::cout << "not exist" << std::endl;
}

当然了,zset的操作远不止于此,不过很多类似的操作我们已经通过string list等其他介绍过了,比如zadd的NX和XX,我们自己清楚就行,用到的时候实在忘了,咱们再看也不迟~~

那么,基本的命令部分,我们就算是正式完结啦!

gogogo , 进入到原理部分咯~


感谢阅读!

http://www.xdnf.cn/news/56521.html

相关文章:

  • 【阿里云大模型高级工程师ACP习题集】2.1 用大模型构建新人答疑机器人
  • 阿里云入门手册
  • Java 将对象转为 Map 的几种方法
  • MySQL安装
  • 栈和队列--数据结构初阶(2)(C/C++)
  • MATLAB 训练CNN模型 yolo v4
  • CSS预处理工具有哪些?分享主流产品
  • 【身份证扫描件识别表格】如何识别大量身份证扫描件将内容导出保存到Excel表格,一次性处理多张身份证图片导出Excel表格,基于WPF和腾讯云的实现方案
  • spring security +kotlin 实现oauth2.0 认证
  • 问题 | RAIM + LSTM 你怎么看???
  • 【图像轮廓特征查找】图像处理(OpenCV) -part8
  • Linux深度探索:进程管理与系统架构
  • 碰一碰发视频源码,碰一碰发视频OEM
  • MySQL快速入门篇---表的操作
  • 【图片转PDF工具】如何批量将文件夹里的图片以文件夹为单位批量合并PDF文档,基于WPF实现步骤及总结
  • 深入理解自监督学习(Self-Supervised Learning):理论与实践
  • Spring MVC
  • Web3核心技术解析:从区块链到C++实践
  • 【沉浸式求职学习day21】【常用类分享,完结!】
  • 【Hive入门】Hive概述:大数据时代的数据仓库桥梁
  • 基于亚马逊云科技 Amazon Bedrock Tool Use 实现 Generative UI
  • Java抽象类、接口和内部类介绍
  • 实例变量与静态变量的区别
  • 24、ASP.NET⻚⾯之间传递值的⼏种⽅式
  • idea2024.1双击快捷方式打不开
  • 室外摄像头异常自检指南+视频监控系统EasyCVR视频质量诊断黑科技
  • 【Linux】线程安全与线程同步
  • C#+Visual Studio 2022为AutoCAD 2022开发插件并显示在Ribbon选项卡
  • 【网络编程】从零开始彻底了解网络编程(三)
  • 榕壹云预约咨询系统:基于ThinkPHP+MySQL+UniApp打造的灵活预约小程序解决方案