[Redis#12] 常用类型接口学习 | string | list

目录

0.准备

1.string

get | set

set_with_timeout_test.cpp

set_nx_xx_test.cpp

mset_test.cpp

mget_test.cpp

getrange_setrange_test.cpp

incr_decr_test.cpp

2.list

lpush_lrange_test.cpp

rpush_test.cpp

lpop_rpop_test.cpp

blpop_test.cpp

llen_test.cpp


0.准备

我们可以先定义了三个模板函数,用于打印不同类型的容器内容。每个函数都接受一个容器作为参数,并根据容器内元素的类型以不同的方式打印它们。

1.printContainer 函数

template<typename T>
inline void printContainer(const T& container) {for (const auto& elem : container) {std::cout << elem << std::endl;}
}
  • 该函数适用于任何包含可以直接输出到 std::cout 的元素的容器(如 int, double, std::string 等)。
  • 它遍历容器中的每个元素,并使用 std::cout 打印每个元素。

2.printContainerPair 函数

template<typename T>
inline void printContainerPair(const T& container) {for (auto& elem : container) {// 此处预期 elem 是一个 std::pairstd::cout << elem.first << ": " << elem.second << std::endl;}
}
  • 这个函数专为存储 std::pair 类型元素的容器设计,比如 std::mapstd::unordered_map 中的键值对。
  • 对于每个元素,它假设 elem 是一个 std::pair,并打印出 pairfirstsecond 成员。

3.printContainerOptional 函数

template<typename T>
inline void printContainerOptional(const T& container) {for (const auto& elem : container) {// 此处预期 elem 是一个 optional 类型的元素, 打印之前, 先判定一下, 看是否有效if (elem) {std::cout << elem.value() << std::endl;} else {std::cout << "元素无效" << std::endl;}}
}
  • 此函数针对包含 std::optional 类型元素的容器。
  • 在打印之前,它会检查每个 optional 元素是否有效(即是否包含值)。如果有效,则调用 value() 方法获取其值并打印;如果无效,则打印“元素无效”。

示例

#include <vector>
#include <map>
#include <optional>
#include <iostream>// 假设上面的函数已经定义好了int main() {std::vector<int> numbers = {1, 2, 3, 4, 5};std::map<std::string, int> nameAge = {{"Alice", 30}, {"Bob", 25}};std::vector<std::optional<int>> optionals = {10, {}, 20, {}};printContainer(numbers);printContainerPair(nameAge);printContainerOptional(optionals);return 0;
}

运行:


1.string

redis.get()返回的是一个optional类型

  • optional类型在C++14中,正式纳入标准库
  • 因为redis.get()会返回nil无效值,用std::string不方便表现nil,而std::string*虽然可以用nullptr表示无效,但是返回指针又设计内存管理问题
  • 所以综上,此处使用optional表示"非法值"/“无效值”
get | set
// test1.cpp
#include <iostream>
#include <sw/redis++/redis++.h>
#include "util.hpp"using namespace std;
using sw::redis::Redis;void test1(Redis& redis) {cout << "get 和 set" << endl;redis.flushall();redis.set("key", "111");//类命令auto value = redis.get("key");//接收命令 返回值if (value) {cout << "value: " << value.value() << endl;}redis.set("key", "222");value = redis.get("key");if (value) {cout << "value: " << value.value() << endl;}
}

运行:

⭕注意:

1.redis.flushall(); 在 test 开始

  • 作用:清空数据库,避免之前残留的数据干扰

2.get return 的 value 取值采取:value.value()

set_with_timeout_test.cpp

这个文件包含了 test2 函数,用于测试带有超时时间的 set 命令。

// set_with_timeout_test.cpp
#include <iostream>
#include <chrono>
#include <thread>
#include <sw/redis++/redis++.h>using namespace std;
using namespace std::chrono_literals;
using sw::redis::Redis;void test2(Redis& redis) {cout << "set 带有超时时间" << endl;redis.flushall();redis.set("key", "111", 10s);this_thread::sleep_for(3s);long long time = redis.ttl("key");cout << "time: " << time << endl;
}

set_nx_xx_test.cpp

这个文件包含了 test3 函数,用于测试 set 命令的 NXXX 选项。

// set_nx_xx_test.cpp
#include <iostream>
#include <sw/redis++/redis++.h>using namespace std;
using sw::redis::Redis;
using sw::redis::UpdateType;void test3(Redis& redis) {cout << "set NX 和 XX" << endl;redis.flushall();redis.set("key", "111");// set 的重载版本中, 没有单独提供 NX 和 XX 的版本, 必须搭配过期时间的版本来使用. redis.set("key", "222", 0s, UpdateType::EXIST);auto value = redis.get("key");if (value) {cout << "value: " << value.value() << endl;} else {cout << "key 不存在!" << endl;}
}

mset_test.cpp

这个文件包含了 test4 函数,用于测试 mset 命令。

注意:

  • 可以把多个键值对提前组织到容器 vector<pair<string, string>> 中. 以迭代器的形式告诉 mset
// mset_test.cpp
#include <iostream>
#include <vector>
#include <sw/redis++/redis++.h>using namespace std;
using sw::redis::Redis;void test4(Redis& redis) {cout << "mset" << endl;redis.flushall();// 第一种写法, 使用初始化列表描述多个键值对// redis.mset({ std::make_pair("key1", "111"), std::make_pair("key2", "222"), std::make_pair("key3", "333") });// 第二种写法, 可以把多个键值对提前组织到容器中. 以迭代器的形式告诉 msetvector<pair<string, string>> keys = {{"key1", "111"},{"key2", "222"},{"key3", "333"}};redis.mset(keys.begin(), keys.end());auto value = redis.get("key1");if (value) {cout << "value: " << value.value() << endl;}value = redis.get("key2");if (value) {cout << "value: " << value.value() << endl;}value = redis.get("key3");if (value) {cout << "value: " << value.value() << endl;}
}

mget_test.cpp

这个文件包含了 test5 函数,用于测试 mget 命令。

// mget_test.cpp
#include <iostream>
#include <vector>
#include <sw/redis++/redis++.h>
#include "util.hpp"using namespace std;
using sw::redis::Redis;
using sw::redis::OptionalString;void test5(Redis& redis) {cout << "mget" << endl;redis.flushall();vector<pair<string, string>> keys = {{"key1", "111"},{"key2", "222"},{"key3", "333"}};redis.mset(keys.begin(), keys.end());vector<OptionalString> result;auto it = back_inserter(result);redis.mget({"key1", "key2", "key3", "key4"}, it);printContainerOptional(result);
}
getrange_setrange_test.cpp

这个文件包含了 test6 函数,用于测试 getrange (return string) 和 setrange 命令。

// getrange_setrange_test.cpp
#include <iostream>
#include <string>
#include <sw/redis++/redis++.h>using namespace std;
using sw::redis::Redis;void test6(Redis& redis) {cout << "getrange 和 setrange" << endl;redis.flushall();redis.set("key", "abcdefghijk");string result = redis.getrange("key", 2, 5);cout << "result: " << result << endl;redis.setrange("key", 2, "xyz");auto value = redis.get("key");cout << "value: " << value.value() << endl;
}
incr_decr_test.cpp

这个文件包含了 test7 函数,用于测试 incrdecr 命令。

// incr_decr_test.cpp
#include <iostream>
#include <sw/redis++/redis++.h>using namespace std;
using sw::redis::Redis;void test7(Redis& redis) {cout << "incr 和 decr" << endl;redis.flushall();redis.set("key", "100");//对比关注 如下两种返回结果//返回结果1:long longlong long result = redis.incr("key");cout << "result: " << result << endl;//返回结果2:对象auto value = redis.get("key");cout << "value: " << value.value() << endl;result = redis.decr("key");cout << "result: " << result << endl;value = redis.get("key");cout << "value: " << value.value() << endl;
}

运行:


2.list

lpush_lrange_test.cpp

这个文件包含了 test1 函数,用于测试 lpushlrange 命令。

// lpush_lrange_test.cpp
#include <iostream>
#include <vector>
#include <string>
#include <sw/redis++/redis++.h>
#include "util.hpp"using namespace std;
using sw::redis::Redis;void test1(Redis& redis) {cout << "lpush 和 lrange" << 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> results;//容器auto it = back_inserter(results);//创建插入迭代器,用于将元素添加到容器的末尾redis.lrange("key", 0, -1, it);printContainer(results);
}

关于这个地方迭代器的使用,详细可以看前面两篇博文

  • [Redis#11] cpp-redis | 通用命令 | optional | 插入迭代器
  • STL 源码剖析 note(这个专栏 还在完善中 后续应该会发)

运行

rpush_test.cpp

这个文件包含了 test2 函数,用于测试 rpush 命令。

// rpush_test.cpp
#include <iostream>
#include <vector>
#include <string>
#include <sw/redis++/redis++.h>
#include "util.hpp"using namespace std;
using sw::redis::Redis;void test2(Redis& redis) {cout << "rpush" << endl;redis.flushall();// 插入单个元素redis.rpush("key", "111");// 插入多个元素, 基于初始化列表redis.rpush("key", {"222", "333", "444"});// 插入多个元素, 基于容器vector<string> values = {"555", "666", "777"};redis.rpush("key", values.begin(), values.end());// 使用 lrange 获取元素vector<string> results;auto it = back_inserter(results);redis.lrange("key", 0, -1, it);printContainer(results);
}

lpop_rpop_test.cpp

这个文件包含了 test3 函数,用于测试 lpoprpop 命令。

// lpop_rpop_test.cpp
#include <iostream>
#include <optional>
#include <sw/redis++/redis++.h>using namespace std;
using sw::redis::Redis;void test3(Redis& redis) {cout << "lpop 和 rpop" << endl;redis.flushall();// 构造一个 listredis.rpush("key", {"1", "2", "3", "4"});auto result = redis.lpop("key");if (result) {cout << "lpop: " << result.value() << endl;}result = redis.rpop("key");if (result) {cout << "rpop: " << result.value() << endl;}
}

如果删除成功了,就打印 .value()

blpop_test.cpp

这个文件包含了 test4 函数,用于测试 blpop 命令。

  • TIPS:对于std::optional类型来说,可以直接使用->访问optional内部包含的元素的成员
// blpop_test.cpp
#include <iostream>
#include <chrono>
#include <sw/redis++/redis++.h>using namespace std;
using namespace std::chrono_literals;
using sw::redis::Redis;void test4(Redis& redis) {using namespace std::chrono_literals;cout << "blpop" << endl;redis.flushall();auto result = redis.blpop({"key", "key2", "key3"}, 10s);if (result) {cout << "key:" << result->first << endl;cout << "elem:" << result->second << endl;} else {cout << "result 无效!" << endl;}
}
llen_test.cpp

这个文件包含了 test5 函数,用于测试 llen 命令。

return long long

// llen_test.cpp
#include <iostream>
#include <sw/redis++/redis++.h>using namespace std;
using sw::redis::Redis;void test5(Redis& redis) {cout << "llen" << endl;redis.flushall();redis.lpush("key", {"111", "222", "333", "444"});long long len = redis.llen("key");cout << "len: " << len << endl;
}


对于 接口的返回值,我们可以在 上一篇文章中提到的 文档中查找

为了加深印象 ,和有充裕的时间学习,博主就都测试了一下,下一篇文章 应该会把剩余的常见三种类型测试完,然后 接口调用体会的 汇总,之后要是 用到了,看下一篇文章的总结就好啦~

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

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

相关文章

A054-基于Spring Boot的青年公寓服务平台的设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600…

【经典】星空主题的注册界面HTML,CSS,JS

目录 界面展示 完整代码 说明&#xff1a; 这是一个简单的星空主题的注册界面&#xff0c;使用了 HTML 和 CSS 来实现一个背景为星空效果的注册页面。 界面展示 完整代码 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8&…

TiDB 优化器丨执行计划和 SQL 算子解读最佳实践

作者&#xff1a; TiDB社区小助手 原文来源&#xff1a; https://tidb.net/blog/5edb7933 导读 在数据库系统中&#xff0c;查询优化器是数据库管理系统的核心组成部分&#xff0c;负责将用户的 SQL 查询转化为高效的执行计划&#xff0c;因而会直接影响用户体感的性能与稳…

位运算在嵌入式系统开发中的应用

目录 一、数据存储与节省 “绝技” 1.1. 传感器数据存储挑战 1.2. 位运算解决方案 1.2.1. 数据整合 1.2.2. 数据提取 1.3. 收益分析 二、硬件控制 “精准操纵术” 2.1. 位运算操控硬件寄存器的实例 2.2. 位运算在硬件控制中的优势 2.3. 电机驱动芯片寄存器控制示例 …

设置redis

1.https://github.com/tporadowski/redis/releases下载对应版本 解压 启动redis临时服务 在 redis 文件夹下 cmd 输入redis-server.exe redis.windows.conf 临时服务启动 从新打开一个cmd 运行redis-cli 输入ping 启动成功 命令行输入shutdown关闭服务 创建永久服务 在…

排序学习整理(1)

1.排序的概念及运用 1.1概念 排序&#xff1a;所谓排序&#xff0c;就是使⼀串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作&#xff0c;以便更容易查找、组织或分析数据。 1.2运用 购物筛选排序 院校排名 1.3常见排序算法 2.实…

【Rust】unsafe rust入门

这篇文章简单介绍下unsafe rust的几个要点 1. 解引用裸指针 裸指针其实就是C或者说C的指针&#xff0c;与C的指针不同的是&#xff0c;Rust的裸指针还是要分为可变和不可变&#xff0c;*const T 和 *mut T&#xff1a; 基于引用创建裸指针 let mut num 5;let r1 &num …

# 01_Python基础到实战一飞冲天(三)--python面向对象(一)--简单类

01_Python基础到实战一飞冲天&#xff08;三&#xff09;–python面向对象&#xff08;一&#xff09;–简单类 一、面向对象-01-基本概念 1、面向对象(OOP) 面向对象编程 —— Object Oriented Programming 简写 OOP。 2、面向对象(OOP) 学习目标 了解 面向对象 基本概念…

Java 基础知识与核心概念

Java 作为一门广泛使用的编程语言&#xff0c;它的基础知识是每个开发者必须掌握的。无论是面向对象编程&#xff08;OOP&#xff09;还是集合框架的使用&#xff0c;理解这些核心概念能够帮助我们在日常开发中更加高效和准确地编写代码。本文将从设计模式、集合原理到常见类的…

【C++习题】24.二分查找算法_0~n-1中缺失的数字

文章目录 题目链接&#xff1a;题目描述&#xff1a;解法C 算法代码&#xff1a;图解 题目链接&#xff1a; 剑指 Offer 53 - II. 0&#xff5e;n-1中缺失的数字 题目描述&#xff1a; 解法 哈希表&#xff1a; 建立一个hash表看哪个数字出现次数为0 直接遍历找结果&#xff1…

(即插即用模块-Convolution部分) 一、(ICLR 2022) ODConv 全维动态卷积

文章目录 1、Omni-dimensional Dynamic Convolution2、代码实现 paper&#xff1a;OMNI-DIMENSIONAL DYNAMIC CONVOLUTION Code&#xff1a;https://github.com/OSVAI/ODConv 1、Omni-dimensional Dynamic Convolution 论文首先分析了现有动态卷积的局限性&#xff0c;论文指出…

深度学习Python基础(2)

二 数据处理 一般来说PyTorch中深度学习训练的流程是这样的&#xff1a; 1. 创建Dateset 2. Dataset传递给DataLoader 3. DataLoader迭代产生训练数据提供给模型 对应的一般都会有这三部分代码 # 创建Dateset(可以自定义) dataset face_dataset # Dataset部分自定义过的…

(超详细图文详情)Navicat 配置连接 Oracle

1、下载依赖文件 Oracle官网下载直链&#xff1a;https://www.oracle.com/database/technologies/instant-client/winx64-64-downloads.html 夸克网盘下载&#xff08;oracle19c版本&#xff09;&#xff1a;https://pan.quark.cn/s/5061e690debc 官网下载选择对应 Oracle 版…

jdk各个版本介绍

Java Development Kit&#xff08;JDK&#xff09;是Java平台的核心组件&#xff0c;它包含了Java编程语言、Java虚拟机&#xff08;JVM&#xff09;、Java类库以及用于编译、调试和运行Java应用程序的工具。 JDK 1.0-1.4&#xff08;经典时代&#xff09; • JDK 1.0&#xff…

二分法篇——于上下边界的扭转压缩间,窥见正解辉映之光(1)

前言 二分法&#xff0c;这一看似简单却又充满哲理的算法&#xff0c;犹如一道精巧的数学之门&#xff0c;带领我们在问题的迷雾中找到清晰的道路。它的名字虽简单&#xff0c;却深藏着智慧的光辉。在科学的浩瀚星空中&#xff0c;二分法如一颗璀璨的星辰&#xff0c;指引着我们…

基于 FFmpeg/Scrcpy 框架构建的一款高性能的安卓设备投屏管理工具-供大家学习研究参考

支持的投屏方式有:USB,WIFIADB,OTG,投屏之前需要开启开发者选项里面的USB调试。 主要功能有: 1.支持单个或多个设备投屏。 2.支持键鼠操控。 3.支持文字输入。 4.支持共享剪切板(可复制粘贴电脑端文字到手机端,也可导出手机剪切板到电脑端)。 5.支持视频图片上传,可单…

【论文笔记】A Token-level Contrastive Framework for Sign Language Translation

&#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;为万世开太平。 基本信息 标题: A Token-level Contrastiv…

ROS2教程 - 3 HelloWorld

更好的阅读体验&#xff1a;https://www.foooor.com 3 HelloWorld 下面从 HelloWorld 开始&#xff0c;讲解 ROS2 的开发。 ROS 开发主要使用 C 或 Python 实现&#xff0c;如果要实现的功能&#xff0c;对性能有要求&#xff0c;可以使用 C 实现&#xff0c;如果对性能没有…

洛谷 B3626 跳跃机器人 C语言 记忆化搜索

题目&#xff1a; https://www.luogu.com.cn/problem/B3626 题目描述 地上有一排格子&#xff0c;共 n 个位置。机器猫站在第一个格子上&#xff0c;需要取第 n 个格子里的东西。 机器猫当然不愿意自己跑过去&#xff0c;所以机器猫从口袋里掏出了一个机器人&#xff01;这…

【AI】Sklearn

长期更新&#xff0c;建议关注、收藏、点赞。 友情链接&#xff1a; AI中的数学_线代微积分概率论最优化 Python numpy_pandas_matplotlib_spicy 建议路线&#xff1a;机器学习->深度学习->强化学习 目录 预处理模型选择分类实例&#xff1a; 二分类比赛 网格搜索实例&…