【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之后,又一重大的框架诞生。标…...

【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...

页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...

《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...

企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...