[Redis#13] cpp-redis接口 | set | hash |zset

目录

Set

1. Sadd 和 Smembers

2. Sismember

3. Scard

4. Spop

5. Sinter

6. Sinter store

Hash

1. Hset 和 Hget

2. Hexists

3. Hdel

4. Hkeys 和 Hvals

5. Hmget 和 Hmset

Zset

1. Zadd 和 Zrange

2. Zcard

3. Zrem

4. Zscore


cpp-redis 的学习 主要关注于 传入和传出,中间就是对于 redis 对象的接口调用了

1. 接口的相似性

  • sw/redis++ 的接口设计与 Redis 原生命令非常相似,这使得熟悉 Redis 命令的开发者可以快速上手。

2. 参数传递方式

  • 当需要传入多个参数时,有两种方法:
    • 使用容器(如 std::vectorstd::set)保存参数,并传递容器的迭代器。
    • 直接使用初始化列表 {} 传递参数。

3. 键值对传递

  • 如果需要传递键值对,可以使用 std::pair 来表示,例如 std::pair<std::string, std::string>

4. 常用 C++ 类型

  • OptionalString:用于接收可能为 nil 的返回值,可以判断是否为空。
  • StringView:用于传递只读字符串,但通常直接使用 std::string 即可。
  • long long:用于接收整数类型的返回值。
  • double:用于 ZSET 中的分数(score)类型。

5. 输出多个变量

  • 如果函数需要输出多个变量,应该 传递一个插入迭代器(如 std::inserterstd::back_inserter),这样可以将结果直接插入到容器中。

示例

这里给出一个简单的示例来说明如何使用 sw/redis++ 和上述提到的数据类型:

#include <iostream>
#include <vector>
#include <string>
#include <set>
#include <sw/redis++/redis++.h>using namespace std;
using sw::redis::Redis;int main() {Redis redis("tcp://127.0.0.1:6379");// 使用初始化列表添加元素redis.sadd("myset", {"apple", "banana", "cherry"});// 使用容器添加元素set<string> fruits = {"date", "elderberry"};redis.sadd("myset", fruits.begin(), fruits.end());//输出// 获取集合中的所有成员vector<string> result;auto inserter = back_inserter(result);redis.smembers("myset", inserter);//通过插入迭代器// 打印for (const auto& item : result) {cout << item << endl;}return 0;
}

Set

1. Sadd 和 Smembers

此示例展示了如何向集合中添加元素以及如何获取集合中的所有成员。注意,保存 smembers 结果时,使用 std::set 可能更合适,因为集合中的元素是无序且唯一的。

void TestSaddAndSmembers(Redis& redis) {// 清空数据库redis.flushall();// 一次添加一个元素redis.sadd("key", "111");// 使用初始化列表一次性添加多个元素redis.sadd("key", {"222", "333", "444"});// 使用迭代器从集合容器中添加多个元素std::set<std::string> elems = {"555", "666", "777"};redis.sadd("key", elems.begin(), elems.end());// 获取并打印集合中的所有元素std::set<std::string> result;auto it = std::inserter(result, result.end());redis.smembers("key", it);PrintContainer(result);
}
2. Sismember

这个例子检查给定的元素是否存在于指定的集合中,并输出结果。

void TestSismember(Redis& redis) {// 清空数据库redis.flushall();// 添加一些元素到集合redis.sadd("key", {"111", "222", "333", "444"});// 检查元素 '555' 是否存在bool result = redis.sismember("key", "555");std::cout << "result: " << result << std::endl;
}
3. Scard

该示例计算集合中元素的数量,并输出结果。

void TestScard(Redis &redis) {// 清空数据库redis.flushall();// 向集合中添加元素redis.sadd("key", {"111", "222", "333"});// 计算集合大小long long result = redis.scard("key");std::cout << "result: " << result << std::endl;
}
4. Spop

这里演示了如何随机移除集合中的一个元素,并打印被移除的元素或相应的错误信息。

void TestSpop(Redis& redis) {// 清空数据库redis.flushall();// 向集合中添加元素redis.sadd("key", {"111", "222", "333", "444"});// 随机移除一个元素auto result = redis.spop("key");if (result) {std::cout << "result: " << result.value() << std::endl;} else {std::cout << "result 无效!" << std::endl;}
}

5. Sinter

此示例说明了如何找到两个集合的交集

void TestSinter(Redis &redis) {// 清空数据库redis.flushall();// 向两个不同的集合中添加元素redis.sadd("key1", {"111", "222", "333"});redis.sadd("key2", {"111", "222", "444"});// 计算两个集合的交集std::set<std::string> result;auto it = std::inserter(result, result.end());redis.sinter({"key1", "key2"}, it);// 打印交集结果PrintContainer(result);
}

6. Sinter store

本示例展示如何计算两个集合的交集并将结果存储在一个新的集合中,同时打印新集合的大小和内容。

void TestSinterstore(Redis &redis) {// 清空数据库redis.flushall();// 向两个不同的集合中添加元素redis.sadd("key1", {"111", "222", "333"});redis.sadd("key2", {"111", "222", "444"});// 计算两个集合的交集并存储在新的集合 key3 中long long len = redis.sinterstore("key3", {"key1", "key2"});std::cout << "len: " << len << std::endl;// 获取到上述元素// 此处用来保存 smembers 的结果, 使用 set 可能更合适. vector<string> result;// auto it = std::back_inserter(result);// 由于此处 set 里的元素顺序是固定的. 指定一个 result.end() 或者 result.begin() 或者其他位置的迭代器, 都无所谓~~auto it = std::inserter(result, result.end());redis.smembers("key3", it);PrintContainer(result);
}


vscode 查找替换 快捷键:

Hash

1. Hset 和 Hget

这个示例演示了如何向哈希中添加字段-值对,并从中获取特定字段的值。

void TestHsetAndHget(Redis &redis) {// 清空数据库redis.flushall();// 设置单个字段-值对redis.hset("key", "f1", "111");// 使用 std::pair 设置另一个字段-值对redis.hset("key", std::make_pair("f2", "222"));// 批量设置多个字段-值对redis.hset("key", {std::make_pair("f3", "333"), std::make_pair("f4", "444")});// 使用容器批量设置std::vector<std::pair<std::string, std::string>> fields = {std::make_pair("f5", "555"),std::make_pair("f6", "666")};redis.hset("key", fields.begin(), fields.end());// 获取并打印字段 f3 的值auto result = redis.hget("key", "f3");if (result) {std::cout << "result: " << result.value() << std::endl;} else {std::cout << "result 无效!" << std::endl;}
}

2. Hexists

此示例检查指定字段是否存在于给定的哈希中,并输出结果。

void TestHexists(Redis &redis) {// 清空数据库redis.flushall();// 设置一些字段-值对redis.hset("key", "f1", "111");redis.hset("key", "f2", "222");redis.hset("key", "f3", "333");// 检查字段 f4 是否存在bool result = redis.hexists("key", "f4");std::cout << "result: " << result << std::endl;
}

3. Hdel

这个例子展示如何删除哈希中的一个或多个字段,并输出受影响的字段数量。

void TestHdel(Redis &redis) {// 清空数据库redis.flushall();// 设置一些字段-值对redis.hset("key", "f1", "111");redis.hset("key", "f2", "222");redis.hset("key", "f3", "333");// 删除字段 f1 并输出受影响的数量long long result = redis.hdel("key", "f1");std::cout << "result: " << result << std::endl;// 删除字段 f2 和 f3 并输出受影响的数量result = redis.hdel("key", {"f2", "f3"});std::cout << "result: " << result << std::endl;// 输出当前哈希中的字段数量long long len = redis.hlen("key");std::cout << "len: " << len << std::endl;
}
4. Hkeys 和 Hvals

该示例获取哈希中的所有 field 和对应的 value,并分别打印出来。

void TestHkeysAndHvals(Redis &redis) {// 清空数据库redis.flushall();// 设置一些字段-值对redis.hset("key", "f1", "111");redis.hset("key", "f2", "222");redis.hset("key", "f3", "333");// 获取并打印所有键名std::vector<std::string> fields;auto itFields = std::back_inserter(fields);redis.hkeys("key", itFields);PrintContainer(fields);// 获取并打印所有值std::vector<std::string> values;auto itValues = std::back_inserter(values);redis.hvals("key", itValues);PrintContainer(values);
}

5. Hmget 和 Hmset

此示例说明了如何一次性设置多个字段-值对 (vector<pair>),并从哈希中获取多个字段的值。

void TestHmgetAndHmset(Redis &redis) {// 清空数据库redis.flushall();// 批量设置多个字段-值对redis.hmset("key", {std::make_pair("f1", "111"),std::make_pair("f2", "222"),std::make_pair("f3", "333")});// 再次批量设置更多字段-值对std::vector<std::pair<std::string, std::string>> pairs = {std::make_pair("f4", "444"),std::make_pair("f5", "555"),std::make_pair("f6", "666")};redis.hmset("key", pairs.begin(), pairs.end());// 获取并打印指定字段的值std::vector<std::string> values;auto it = std::back_inserter(values);redis.hmget("key", {"f1", "f2", "f3"}, it);PrintContainer(values);
}


Zset

1. Zadd 和 Zrange

这个示例演示了如何向有序集合中添加成员,并通过 zrange 命令以两种不同的方式获取成员:只查询成员或同时查询成员和分数。

void TestZaddAndZrange(Redis &redis) {// 清空数据库redis.flushall();// 添加单个成员及其分数redis.zadd("key", "吕布", 99);// 批量添加多个成员及其分数redis.zadd("key", {std::make_pair("赵云", 98), std::make_pair("典韦", 97)});// 使用容器批量添加成员及其分数std::vector<std::pair<std::string, double>> members = {std::make_pair("关羽", 95),std::make_pair("张飞", 93)};redis.zadd("key", members.begin(), members.end());// 获取并打印所有成员(不带分数)std::vector<std::string> memberResults;auto it = std::back_inserter(memberResults);redis.zrange("key", 0, -1, it);PrintContainer(memberResults);// 获取并打印所有成员及其分数std::vector<std::pair<std::string, double>> membersWithScore;auto it2 = std::back_inserter(membersWithScore);redis.zrange("key", 0, -1, it2);PrintContainerPair(membersWithScore);
}

  • zrange支持两种主要的风格:
    • 只查询member, 不带score
    • 查询member同时带score
  • 关键就是看插入迭代器指向的容器的类型
    • 指向的容器只是包含一个string, 就是只查询member
    • 指向的容器包含的是一pair, 里面有stringdouble, 就是查询member同时带有score
2. Zcard

此示例计算有序集合中的成员数量,并输出结果。

void TestZcard(Redis &redis) {// 清空数据库redis.flushall();// 添加一些成员及其分数redis.zadd("key", "zhangsan", 90);redis.zadd("key", "lisi", 91);redis.zadd("key", "wangwu", 92);redis.zadd("key", "zhaoliu", 93);// 计算集合大小long long result = redis.zcard("key");std::cout << "result: " << result << std::endl;
}
3. Zrem

这个例子展示如何从有序集合中删除一个成员,并输出删除后的集合大小。

void TestZrem(Redis &redis) {// 清空数据库redis.flushall();// 添加一些成员及其分数redis.zadd("key", "zhangsan", 90);redis.zadd("key", "lisi", 91);redis.zadd("key", "wangwu", 92);redis.zadd("key", "zhaoliu", 93);// 删除成员 zhangsanredis.zrem("key", "zhangsan");// 计算删除后的集合大小long long result = redis.zcard("key");std::cout << "result: " << result << std::endl;
}
4. Zscore

该示例获取指定成员的分数,并输出结果。

void TestZscore(Redis &redis) {// 清空数据库redis.flushall();// 添加一些成员及其分数redis.zadd("key", "zhangsan", 90);redis.zadd("key", "lisi", 91);redis.zadd("key", "wangwu", 92);redis.zadd("key", "zhaoliu", 93);// 获取并打印成员 zhangsan 的分数auto score = redis.zscore("key", "zhangsan");if (score) {std::cout << "score: " << score.value() << std::endl;} else {std::cout << "score 无效" << std::endl;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/483332.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GEOBench-VLM:专为地理空间任务设计的视觉-语言模型基准测试数据集

2024-11-29 ,由穆罕默德本扎耶德人工智能大学等机构创建了GEOBench-VLM数据集&#xff0c;目的评估视觉-语言模型&#xff08;VLM&#xff09;在地理空间任务中的表现。该数据集的推出填补了现有基准测试在地理空间应用中的空白&#xff0c;提供了超过10,000个经过人工验证的指…

设计模式 更新ing

设计模式 1、六大原则1.1 单一设计原则 SRP1.2 开闭原则1.3 里氏替换原则1.4 迪米特法则1.5 接口隔离原则1.6 依赖倒置原则 2、工厂模式 1、六大原则 1.1 单一设计原则 SRP 一个类应该只有一个变化的原因 比如一个视频软件&#xff0c;区分不同的用户级别 包括访客&#xff0…

nlp培训重点

1. SGD梯度下降公式 当梯度大于0时&#xff0c;变小&#xff0c;往左边找梯度接近0的值。 当梯度小于0时&#xff0c;减去一个负数会变大&#xff0c;往右边找梯度接近0的值&#xff0c;此时梯度从负数到0上升 2.Adam优化器实现原理 #coding:utf8import torch import torch.n…

电脑关机的趣味小游戏——system函数、strcmp函数、goto语句的使用

文章目录 前言一. system函数1.1 system函数清理屏幕1.2 system函数暂停运行1.3 system函数电脑关机、重启 二、strcmp函数三、goto语句四、电脑关机小游戏4.1. 程序要求4.2. 游戏代码 总结 前言 今天我们写一点稍微有趣的代码&#xff0c;比如写一个小程序使电脑关机&#xf…

基础入门-Web应用OSS存储负载均衡CDN加速反向代理WAF防护部署影响

知识点&#xff1a; 1、基础入门-Web应用-防护产品-WAF保护 2、基础入门-Web应用-加速服务-CDN节点 3、基础入门-Web应用-文件托管-OSS存储 4、基础入门-Web应用-通讯服务-反向代理 5、基础入门-Web应用-运维安全-负载均衡 一、演示案例-Web-拓展架构-WAF保护-拦截攻击 原理&a…

Milvus×OPPO:如何构建更懂你的大模型助手

01. 背景 AI业务快速增长下传统关系型数据库无法满足需求。 2024年恰逢OPPO品牌20周年&#xff0c;OPPO也宣布正式进入AI手机的时代。超千万用户开始通过例如通话摘要、新小布助手、小布照相馆等搭载在OPPO手机上的应用体验AI能力。 与传统的应用不同的是&#xff0c;在AI驱动的…

002-日志增强版

日志增强版 一、需求二、引入依赖三、配置日志处理切面四、配置RequestWrapper五、效果展示 一、需求 需要打印请求参数和返回参数 二、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop<…

Spire.PDF for .NET【页面设置】演示:旋放大 PDF 边距而不改变页面大小

PDF 页边距是正文内容和页面边缘之间的空白。与 Word 不同&#xff0c;PDF 文档中的页边距不易修改&#xff0c;因为 Adobe 不提供任何功能供用户自由操作页边距。但是&#xff0c;您可以更改页面缩放比例&#xff08;放大/压缩内容&#xff09;或裁剪页面以获得合适的页边距。…

服务器数据恢复—EVA存储硬盘磁头和盘片损坏离线的数据恢复案例

服务器存储数据恢复环境&故障&#xff1a; 一台HP EVA存储中有23块硬盘&#xff0c;挂接到一台windows server操作系统的服务器。 EVA存储上有三个硬盘指示灯亮黄灯&#xff0c;此刻存储还能正常使用。管理员在更换硬盘的过程中&#xff0c;又出现一块硬盘对应的指示灯亮黄…

探索仓颉编程语言:官网上线,在线体验与版本下载全面启航

文章目录 每日一句正能量前言什么是仓颉编程语言仓颉编程语言的来历如何使用仓颉编程语言在线版本版本下载后记 每日一句正能量 当你被孤独感驱使着去寻找远离孤独的方法时&#xff0c;会处于一种非常可怕的状态。因为无法和自己相处的人也很难和别人相处&#xff0c;无法和别人…

idea 自动导包,并且禁止自动导 *(java.io.*)

自动导包配置 进入 idea 设置&#xff0c;可以按下图所示寻找位置&#xff0c;也可以直接输入 auto import 快速定位到配置。 Add unambiguous imports on the fly&#xff1a;自动帮我们优化导入的包Optimize imports on the fly&#xff1a;自动去掉一些没有用到的包 禁止导…

【时时三省】(C语言基础)结构体的自引用

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 结构体的自引用 在结构中包含一个类型为该结构体本身的成员是否可以呢&#xff1f; 在struct B里面包含了一个结构体struct A叫sa 结构体类型里面是可以包含另一个结构体类型变量作为它的成…

GoReplay开源工具使用教程

目录 一、GoReplay环境搭建 1、Mac、Linux安装GoReplay环境 二、GoReplay录制与重播 1、搭建练习接口 2、录制命令 3、重播命令 三、GoReplay单个命令 1、常用命令 2、其他命令 3、命令示例 4、性能测试 5、正则表达式 四、gorepaly组合命令 1、组合命令实例 2、…

宏海科技募资额有所缩减,最大销售和采购都重度依赖美的集团

《港湾商业观察》施子夫 11月29日&#xff0c;北交所上市审核委员会将召开2024年第24次上市委审议会议&#xff0c;届时将审议武汉宏海科技股份有限公司&#xff08;以下简称&#xff0c;宏海科技&#xff09;的首发上会事项。 在上会之前&#xff0c;宏海科技共收到北交所下…

驱动篇的开端

准备 在做之后的动作前&#xff0c;因为win7及其以上的版本默认是不支持DbgPrint&#xff08;大家暂时理解为内核版的printf&#xff09;的打印&#xff0c;所以&#xff0c;为了方便我们的调试&#xff0c;我们先要修改一下注册表 创建一个reg文件然后运行 Windows Registr…

渗透测试--Windows凭证收集

在渗透测试过程中&#xff0c;我们终究会遇到攻陷了某台加域Windows主机的情况。而这种情况下&#xff0c;我们很需要搜集当前主机的凭证信息。为进一步利用这些相互信任的凭证来进行横向打下基础。 在凭证收集中&#xff0c;我们主要有以下场景&#xff1a; 1.lsass.exe的DMP文…

PH热榜 | 2024-12-03

1. Vela OS 标语&#xff1a;利用人工智能&#xff0c;创业投资精准度提升十倍。 介绍&#xff1a;Vela操作系统是一个原生AI操作系统&#xff0c;它能让创业投资者的预测准确率比传统风投公司高出十倍。借助一群AI智能体&#xff0c;投资者可以发现蓬勃发展的市场、公司和人…

微信小程序 运行出错 弹出提示框(获取token失败,请重试 或者 请求失败)

原因是&#xff1a;需要登陆微信公众平台在开发管理 中设置 相应的 服务器域名 中的 request合法域名 // index.jsPage({data: {products:[],cardLayout: grid, // 默认卡片布局为网格模式isGrid: true, // 默认为网格布局page: 0, // 当前页码size: 10, // 每页大小hasMore…

Google Cloud 混合云部署连接方式最佳实践案例讲解

混合云部署连接方式 GCP 的混合云部署连接方式提供了多种选择&#xff0c;企业可以根据自身需求选择合适的解决方案。实施最佳实践&#xff0c;将有助于提高混合云架构的性能、安全性和可用性。通过合理的规划和管理&#xff0c;企业可以充分利用混合云的优势&#xff0c;实现…

nfs服务器搭建

目录 1&#xff0c;nfs服务端 1&#xff09;安装 2&#xff09;修改nfs配置文件 3&#xff09;创建共享目录 4&#xff09;启动服务nfs配置文件 2&#xff0c;客户端 3&#xff0c;测试 1&#xff09;客户端 2&#xff09;服务端查看 4&#xff0c;systemd实现客户…