【Redis 初阶】客户端(C++ 使用样例列表)
一、编写 helloworld
需要先使用 redis-plus-plus 连接一下 Redis 服务器,再使用 ping 命令检测连通性。
1、Makefile
Redis 库最多可以支持到 C++17 版本。(如果是用 Centos,需要注意 gcc/g++ 的版本,看是否支持 C++17。不支持的话,选用 C++11 版本也是可以的)
hello:hello.ccg++ -std=c++17 -o $@ $^ /usr/local/lib64/libredis++.a /usr/local/lib/libhiredis.a -pthread.PHONY:clean
clean:rm hello
编译程序时,需要引入的库文件(由于不同系统中安装好的库所在位置会存在差异,因此要注意⽂件路径是否存在。可以用 find 命令来查找库所在的目录):
- Redis++ 自己的静态库
- hiredis 静态库
- 线程库
也可以选择使用动态库链接:
2、hello.cc
#include <iostream>
#include <vector>
#include <string>
#include <unordered_map>
#include <sw/redis++/redis++.h>using std::cout;
using std::endl;
using std::vector;
using std::string;
using std::unordered_map;int main()
{// 创建Redis对象时,需要在构造函数中指定redis服务器的地址和端口 sw::redis::Redis redis("tcp://127.0.0.1:6379");// 调用ping方法,让客户端给服务器发了一个PING,然后服务器就会返回一个PONG,就通过返回值获取到 string result = redis.ping();std::cout << result << std::endl;return 0;
}
- #include <> 在系统目录中搜索头文件
- #include "" 在项目目录中搜索头文件
这里需要包含 redis-plus-plus 的头文件:redis++.h
6379 是 Redis 服务器的默认端口:
3、运行程序
二、详细 API
参考 Github:
redis-plus-plus/src/sw/redis++/redis.h at master · sewenew/redis-plus-plus (github.com)
参考 Gitee:
src/sw/redis++/redis.h · peixinchen/redis-plus-plus - Gitee.com
三、使用通用命令
1、get & set
(1)get
此处的 Optional 可以表示:“非法值” / “无效值”(nil)
如果直接使用 std::string 来表示,则不方便来表现 nil(无效值);如果使用 std::string* 来标识,虽然可以用 nullptr 表示无效,但是返回指针又会涉及到内存问题。
boost 很早就引入了 optional 类型,在 C++14 版本中就正式是纳入标准库了。因为用户可能选用的是 C++11 版本,所以作者自己封装了一个 OptionalString。
使用 get 获取到 key 对应的 value:
也可以不选择 if 来做判断,而是选用 try-catch。但在实际上,C++ 中不太会经常使用 try-catch。原因如下:
- try-catch 会存在额外的运行时开销,对于性能追求极致的 C++ 来说不太合适。
- try-catch 相比于其他语言(Java、Python)来说有点弱。
上面的 value1 ~ value4 都是 optional 类型,sw::redis::OptionalString 不支持 << 运算符的重载。这里也没有必要给 optional 搞一个 << 的重载,只需要把 optional 里面包含的元素取出来即可(optional 可以当作只包含一个元素的容器)。
(2)set
这里用到了 StringView 这样的类型(是在 sw::redis 命名空间里的).
- std::string 是可修改的,既能读,也能写。
- StringView 是只读的(不能修改),针对只读操作,做很多的优化工作,效率比 std::string 更高。(在 C++17 标准库中也提供了一个 std::string_view)
StringView 中的各种操作和 string 类似,只不过是包含了一些只读方法。
(3)运行程序
A. Makefile
B. generic.cc
C. 运行结果
2、exists & del
(1)exists
(2)del
进行单元测试时,清除数据操作是放在开始,还是结束呢?
放在开始更好一些。因为如果放在结束的位置,一旦执行的程序中间出现异常,就可能导致清理代码没有执行到。另一方面,放在开始的位置,当执行完一个操作之后,此时 Redis 里仍然是有数据的,也方便我们手工来检查数据的内容。
3、keys
通常,一个迭代器主要是表示一个 “位置”。
STL 中的 5 种迭代器类型:
- 输入迭代器('*',"++" 对它来说不会产生影响,主要操作是 '='(把另一个迭代器赋值给这个插入迭代器),例如:it:插入迭代器;it2:普通迭代器。此时 it=it2 相当于是获取到 it2 指向的元素,然后把元素按照 it 当前插入迭代器的位置和动作来执行插入操作,比如 it 是一个 back_insert_iterator,就是把 it2 指向的元素插入到 it 指向的容器末尾,相当于调用了一次 push_back)
- 输出迭代器(上面的插入迭代器(“位置” + “动作”)本质上也是一种输出迭代器,标准库中主要有三个:font_insert_iterator(区间开头,往前面插入)、back_insert_iterator(区间末尾,往后面插入)、insert_iterator(区间任意位置,往该位置之前插入),一般不会直接构造出这几个对象(构造函数写起来比较麻烦),一般会使用一些辅助函数来进行构造)
- 前向迭代器
- 双向迭代器
- 随机访问迭代器(最大的优势:以 O(1) 快速定位到指定位置,主要也是由于内存支持随机访问)
这里直接使用容器作为参数,keys 内部直接操作容器进行插入不就行了吗,为什么还要通过迭代器绕一个大圈子呢?
解耦合。代码要追求高内聚、低耦合。
keys 这个操作看不到容器,容器也看不到 keys 操作。此时,它们双方都使用迭代器这样一个中间媒介来去进行交互。此时,keys 的迭代器可以指向 vector,也可以指向其它的容器。换句话说,给你一个 vector 容器,它可以搭配 keys 使用,也可以搭配其他函数使用。也就是说,任何一个容器可以和任意函数搭配使用。
4、expire & ttl
- Linux:sleep 是以 s 做单位的
- Windows:Sleep 是以 ms 做单位的
系统函数是和系统相关的,同样的功能在不同的系统上可能是完全不同的函数。更好的选择是使用标准库的函数,C++ 提供了 thread -> sleep_for。
5、type
四、string
1、get & set
(1)相关代码
(2)运行程序
A. Makefile
B. 运行程序
a. test1
b. test2
c. test3
2、mget & mset
(1)mget
(2)mset
3、getrange & setrange
4、incr & decr
(1)incr
(2)decr
(3)运行程序
- incr 和 decr 得到的都是 long long 类型。
- get 得到的是 OptionalString 类型(需要手动转换成数字)
五、list
1、lpush & rpush & lrange
(1)lpush & lrange
redis-plus-plus 这个库的接口风格设计非常统一。当一个函数参数需要传递多个值的时候,往往都是支持初始化列表或者是一对迭代器的方式,来进行实现的。当一个函数的返回值需要表示多个数据的时候,也往往会借助插入迭代器,来实现往一个容器中添加元素的效果。当某些场景涉及到无效值时,往往会搭配 std::optional 来进行使用。
lpush 是头插,所以每次新的元素都是插入到 list 开头,越后来的元素就越是排在前面。
(2)rpush & lrange
2、lpop & rpop
3、blpop
optional 里面包裹着一个 pair,pair 里面是 string。
blpop 要返回的内容是两个部分:
- 这个元素从属于哪个 list(blpop 可以同时监听 list)。
- 当前被删除的元素。
blpop 可以设定超时时间。如果在指定时间内,还没有其它客户端往指定的 list 中插入元素,此时 blpop 就直接返回了,此时返回的就是一个无效值。
对于 std::optional 类型来说,可以直接使用 -> 来访问 optional 内部包含的元素的成员变量。
4、llen
六、set
1、sadd & smembers
back_inserter 是把末尾位置和 push_back 两个操作绑定到一起了,但是 set 里没有 push_back,但是 set 有 insert 方法,和 insert 对应的是 insert_iterator。
2、sismember
3、scard
4、spop
5、sinter
6、sinterstore
七、hash
1、hset & hget
(1)hset
hset 也能够一次性插入多个 field-value。
(2)hget
(3)运行程序
2、hexists
3、hdel & hlen
4、hkeys & hvals
(1)hkeys
(2)hvals
(3)运行程序
5、hmset & hmget
(1)hmset
(2)hmget
(3)运行程序
八、zset
1、zadd & zrange
(1)zadd
(2)zrange
zrange 支持两种主要的风格:
- 只查询 member,不带 score
- 查询 member 同时带 score
关键就是看插入迭代器指向的容器的类型。指向的容器只是包含一个 string,就是只查询 member。指向的容器包含的是一个 pair,里面有 string 和 double,就是查询 member 同时带有 score。
(3)运行程序
2、zcard
3、zrem
4、zscore
5、zrank
相关文章:

【Redis 初阶】客户端(C++ 使用样例列表)
一、编写 helloworld 需要先使用 redis-plus-plus 连接一下 Redis 服务器,再使用 ping 命令检测连通性。 1、Makefile Redis 库最多可以支持到 C17 版本。(如果是用 Centos,需要注意 gcc/g 的版本,看是否支持 C17。不支持的话&a…...

【STM32】STM32单片机入门
个人主页~ 这是一个新的系列,stm32单片机系列,资料都是从网上找的,主要参考江协科技还有正点原子以及csdn博客等资料,以一个一点没有接触过单片机但有一点编程基础的小白视角开始stm32单片机的学习,希望能对也没有学过…...

学生信息管理系统(Python+PySimpleGUI+MySQL)
吐槽一下 经过一段时间学习pymysql的经历,我深刻的体会到了pymysql的不靠谱之处; 就是在使用int型传参,我写的sql语句中格式化%d了之后,我在要传入的数据传递的每一步的去强制转换了,但是他还是会报错,说我…...

Java8.0标准之重要特性及用法实例(十九)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列…...
Linux系统中,`buffer`和`cache` 区别
在Linux系统中,buffer和cache都是操作系统用来提高磁盘I/O性能的机制,它们通过将数据暂存于内存中来减少对磁盘的直接访问。尽管它们的目的相似,但它们在实现和用途上有所不同。 Buffer 定义:buffer主要用于存储即将被写入磁盘的…...
python创建进度条的两个手搓方法
# 使用\b 回删进行手搓 import sys,time for i in range(1, 101):# 这里的10代表你的进度: 一个汉字2字节print(你的进度:,str(i)\b*(i10),flushTrue,end)time.sleep(0.5) # 利用\r手搓 import sys,time for i in range(1, 101):# \r光标回到开头print("\r", end&qu…...

JAVA—面向对象编程基础
面向对象是java编程的套路。更符合人类思维习惯,编程更直观。面向对象有三大特征:封装,继承,多态。 目录 1.理解面向对象 2.对象在计算机中的执行原理 3.类和对象的一些注意事项 4.类与对象的一些语法知识 (1&am…...

【计算机视觉学习之CV2图像操作实战:车道识别1】
车道识别 步骤 区域感兴趣高斯模糊图片灰度化边缘提取膨胀腐蚀中值滤波霍夫圆环检测直线绘制车道 import cv2 import numpy as npdef create_roi_mask(frame):height, width frame.shape[:2]# 三角形的顶点top_vertex [int(width / 2 30), int(height * 0.5 30)]bottom_l…...
动态之美:Laravel动态路由参数的实现艺术
动态之美:Laravel动态路由参数的实现艺术 在Web开发中,路由是应用程序的神经系统,它负责将请求映射到相应的处理逻辑。Laravel框架提供了一种强大而灵活的路由系统,允许开发者定义动态路由参数,从而创建更具动态性和可…...
Python练手小项目
计算器 创建一个简单的计算器,能够进行加、减、乘、除四种基本运算。 # 定义加法函数 def add(x, y):return x y# 定义减法函数 def subtract(x, y):return x - y# 定义乘法函数 def multiply(x, y):return x * y# 定义除法函数 def divide(x, y):if y 0:return…...

苹果手机通讯录恢复教程?3招速成指南
随着科技的不断进步,手机丢失、系统崩溃等意外情况也时有发生,一旦这些情况发生,我们宝贵的通讯录资料很可能会付诸东流。对此,本文为广大苹果手机用户提供一份简洁明了的通讯录恢复教程,让你轻松掌握苹果手机通讯录恢…...
python爬虫入门(五)之Re解析
一、什么是Re解析 “Re解析”是指使用正则表达式(regular expression,简称regex)进行文本解析或匹配的过程。 解析网页内容的三种方式: 1、bs4解析(最简单) 2、re解析(解析速度最快…...

可靠的图纸加密软件,七款图纸加密软件推荐
大家好啊,我是小固,今天跟大家聊聊图纸加密软件。 作为一名设计师,我深知保护自己的知识产权有多重要。曾经就因为图纸泄露,差点血本无归,那个教训可真是惨痛啊!所以我今天就给大家推荐几款靠谱的图纸加密软件,希望能帮到你们。 固信软件https://www.gooxion.com/ 首先要隆重…...

【每日一题】【最短路】【BFS】小红走矩阵 “葡萄城杯”牛客周赛 Round 53 F题 C++
“葡萄城杯”牛客周赛 Round 53 F题 小红走矩阵 题目背景 “葡萄城杯”牛客周赛 Round 53 题目描述 n m n\times m nm的矩阵由障碍和空地组成,初始时小红位于起点 ( 1 , 1 ) (1,1) (1,1),她想要前往终点 ( n , m ) (n,m) (n,m)。小红每一步可以往上…...

无线磁吸充电宝哪个牌子值得入手?什么牌子磁吸充电宝性价比高?
在当下科技日新月异的时期,无线磁吸充电宝成为了众多电子设备用户的得力助手。然而,面对市场上众多品牌和型号的无线磁吸充电宝,消费者常常陷入选择的困境:到底哪个牌子值得入手?什么牌子的磁吸充电宝性价比高…...
互联网摸鱼日报(2024-08-01)
互联网摸鱼日报(2024-08-01) 36氪新闻 氪星晚报 | Uber与比亚迪合作,将在平台上增加10万辆电动汽车;维维股份将收购大窑汽水?公司回应:消息不实;我国科学家取得全固态锂电池研究新突破 《死侍与金刚狼》,…...

Alpla003经典的价量背离的因子在可转债列表里的因子分析(附python代码)
原创文章第605篇,专注“AI量化投资、世界运行的规律、个人成长与财富自由"。 遗传算法给出的因子五花八门,可解释性不高。 强化学习原理不同,但结果类似。 大模型之前咱们尝试过,Quantlab3.9代码:内置大模型LL…...
进阶理解——typeof 、instanceof
typeof 、instance of 先聊聊JavaScript基本类型数据类型5种含值数据类型2种不含值类型 6种类型的*对象* typeofinstanceof总结进一步扩展一下具体讨论一下typeof局限性扩展判断方法 很多时候,回头望,理解会更深刻,也希望能帮助一些初学的同学…...

不同类型的生物反应器在支架成熟过程中具有哪些特点和应用?
3D Bioprinting of Human Tissues: Biofabrication, Bioinks, and Bioreactors是发表于《International Journal of Molecular Sciences》的一篇综述,详细介绍了3D生物打印人体组织的相关技术进展,包括数据处理、生物打印技术、生物墨水配方、生物反应器…...

8. Spring Ai之入门到精通(超级详细)
简介 2024年5月30号Spring AI 的 1.0.0 里程碑 1 版本发布。表明版本已正在巩固,并且大部分主要错误和问题已经解决,API基本已确定,不会发生很大的变化。 在与大模型集成方面,继LangChain4j之后,又一重大的框架诞生。标…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...

无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...

家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...