【Redis 初阶】客户端(C++ 使用样例列表)

news2024/9/20 14:53:12

一、编写 helloworld

需要先使用 redis-plus-plus 连接一下 Redis 服务器,再使用 ping 命令检测连通性。


1、Makefile

Redis 库最多可以支持到 C++17 版本。(如果是用 Centos,需要注意 gcc/g++ 的版本,看是否支持 C++17。不支持的话,选用 C++11 版本也是可以的)

hello:hello.cc
	g++ -std=c++17 -o $@ $^ /usr/local/lib64/libredis++.a /usr/local/lib/libhiredis.a -pthread

.PHONY:clean
clean:
	rm hello

编译程序时,需要引入的库文件(由于不同系统中安装好的库所在位置会存在差异,因此要注意⽂件路径是否存在。可以用 find 命令来查找库所在的目录):

  1. Redis++ 自己的静态库
  2. hiredis 静态库
  3. 线程库

也可以选择使用动态库链接:


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 种迭代器类型:

  1. 输入迭代器('*',"++" 对它来说不会产生影响,主要操作是 '='(把另一个迭代器赋值给这个插入迭代器),例如:it:插入迭代器;it2:普通迭代器。此时 it=it2 相当于是获取到 it2 指向的元素,然后把元素按照 it 当前插入迭代器的位置和动作来执行插入操作,比如 it 是一个 back_insert_iterator,就是把 it2 指向的元素插入到 it 指向的容器末尾,相当于调用了一次 push_back)
  2. 输出迭代器(上面的插入迭代器(“位置” + “动作”)本质上也是一种输出迭代器,标准库中主要有三个:font_insert_iterator(区间开头,往前面插入)、back_insert_iterator(区间末尾,往后面插入)、insert_iterator(区间任意位置,往该位置之前插入),一般不会直接构造出这几个对象(构造函数写起来比较麻烦),一般会使用一些辅助函数来进行构造)
  3. 前向迭代器
  4. 双向迭代器
  5. 随机访问迭代器(最大的优势:以 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 要返回的内容是两个部分:

  1. 这个元素从属于哪个 list(blpop 可以同时监听 list)。
  2. 当前被删除的元素。

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 支持两种主要的风格:

  1. 只查询 member,不带 score
  2. 查询 member 同时带 score

关键就是看插入迭代器指向的容器的类型。指向的容器只是包含一个 string,就是只查询 member。指向的容器包含的是一个 pair,里面有 string 和 double,就是查询 member 同时带有 score。


(3)运行程序


2、zcard


3、zrem


4、zscore


5、zrank

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

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

相关文章

【第五节】python异常处理

目录 一、python中的异常用法 1.1 try-except 1.2 异常处理流程&#xff1a; 1.3 try-finally 1.4 使用except是否指定异常 二、异常的参数 三、自定义异常 四、常见的异常列举 一、python中的异常用法 异常是指程序运行过程中出现的非正常状态。在Python编程中&#x…

线程的创建Linux下

进程的创建&#xff1a;第一个参数通常传递一个pthread_t 的地址&#xff0c;第二个参数为线程的属性&#xff0c;第三个参数为函数指针&#xff0c;是子线程要做的事情。arg是函数指针所对应函数的参数。 sleep主要是为了等待子线程退出&#xff0c;因为当主线程退出时&#x…

WebSocket connection to ‘ws://x.x.x.x:8080/ws‘ failed:报错

vue.config.js中进行修改 添加 devServer: { Proxy: {ws:false }}

Flink-StarRocks详解:第二部分(第52天)

文章目录 前言2. 表设计2.1 StarRocks表设计2.1.1 列式存储2.1.2 索引2.1.3 加速处理2.1.3.1 预先聚合2.1.3.2 分区分桶2.1.3.3 物化视图2.1.3.4 列级索引 2.2 数据模型2.2.1 明细模型2.2.1.1 适用场景2.2.1.2 创建表2.2.1.3 使用说明 2.2.2 聚合模型2.2.2.1 适用场景2.2.2.2 原…

[C++] vector对比list deque的引出

文章目录 list与vector的对比双端队列dequedeque的特性deque的底层实现原理内存结构块表&#xff08;Block Array&#xff09;块&#xff08;Block&#xff09; 插入与删除两端插入两端删除 随机访问如何计算位置 迭代器设计 总结 list与vector的对比 vector与list都是STL中非…

实战AR增强现实【OpenCV+Ogre】

作为一份小小的礼物&#xff0c;我想向你展示借助 Ogre 和 OpenCV 自己制作增强现实变得多么容易。你应该知道&#xff0c;除了图形之外&#xff0c;我的另一个兴趣是计算机视觉。 演示将不依赖于 ARCore 或 ARKit 等专有解决方案 - 所有这些都将使用开源代码完成&#xff0c;…

【ROS2】 默认的DDS通信中间件替换为Eclipse Cyclone_DDS (DDS配置方法)

ROS2替换中间件为Cyclone_DDS 1.一些介绍&#xff1a;&#xff09;2.不同DDS的RMW实现3.默认的FastDDS替换为Cyclone DDSi.安装依赖ii.编译 cyclone-dds 4.配置网络 1.一些介绍&#xff1a;&#xff09; 上一篇我们探讨了ros1和ros2编写launch的区别 【ROS2】launch启动文件编…

相机外参矩阵

在上一篇文章中&#xff0c;我们学习了如何将相机矩阵分解为内参矩阵和外参矩阵的乘积。在接下来的两篇文章中&#xff0c;我们将更详细地探讨外参矩阵和内参矩阵。首先&#xff0c;我们将探讨查看外参矩阵的各种方式&#xff0c;并在最后进行交互式演示。 SDT工具推荐&#xf…

程序员必知必懂运维技术概念

引言 随着互联网和云计算的迅速发展&#xff0c;传统的单体架构逐渐被微服务架构所取代。这一变化带来了许多新的挑战&#xff0c;如环境一致性、应用的可移植性、服务的扩展性、服务间通信的管理以及安全性等。为了解决这些问题&#xff0c;业界开发了许多工具和技术&#xf…

SPSSAU | Adaboost模型原理及案例实操

AdaBoost&#xff08;Adaptive Boosting&#xff09;算法的核心思想是将多个弱分类器组合成一个强分类器。其算法步骤如下&#xff1a; 第一&#xff1a;初始化权重&#xff0c;为每个训练样本分配相等的初始权重&#xff1b; 第二&#xff1a;训练弱分类器&#xff0c;根据当…

如何做OLED屏幕安装方案

制定OLED屏幕安装方案时&#xff0c;需要综合考虑多个方面&#xff0c;包括安装环境、屏幕尺寸、支架选择、电源与信号连接、调试与测试等。以下是一个详细的OLED屏幕安装方案&#xff1a; 一、前期准备 确定安装位置&#xff1a; 根据使用需求和环境条件&#xff0c;选择一个…

基于FPGA的以太网设计(4)----详解PHY的使用(以YT8531为例)

目录 1、前言 2、如何了解PHY芯片? 2.1、总览 2.2、管脚 2.3、编码 2.4、自协商 2.5、环回模式 2.6、睡眠模式 2.7、复位 2.8、PHY地址 3、PHY芯片的寄存器配置 3.1、Basic Control Register (0x00) 3.2、Basic StatusRegister (0x01) 3.3、PHY Specific Status…

重生了,这一世 我一定要学会服务器 只因………

你好,我是Qiuner. 为帮助别人少走弯路和记录自己编程学习过程而写博客 这是我的 github https://github.com/Qiuner ⭐️ ​ gitee https://gitee.com/Qiuner &#x1f339; 如果本篇文章帮到了你 不妨点个赞吧~ 我会很高兴的 &#x1f604; (^ ~ ^) 想看更多 那就点个关注吧 我…

IT运维管理与ITSM:理论与实践

IT运维管理和IT服务管理&#xff08;ITSM&#xff09;在现代企业信息化过程中占据着举足轻重的地位。它们不仅是确保IT系统稳定运行和业务连续性的关键&#xff0c;还是推动企业数字化转型、提升竞争力的重要力量。本文将结合《IT运维管理和ITSM》文档的内容&#xff0c;深入探…

【C++/STL】:哈希的应用 -- 位图布隆过滤器

目录 &#x1f680;&#x1f680;前言一&#xff0c;位图1. 位图的概念2. STL库中的位图3. 位图的设计4. 位图的模拟实现5. 位图的优缺点6. 位图相关考察题⽬ 二&#xff0c;布隆过滤器1. 布隆过滤器的概念2. 布隆过滤器的实现3. 布隆过滤器删除问题4. 布隆过滤器的优缺点 点击…

江森自控引入电子签,“碳”索智能建筑数字未来

近年来&#xff0c;伴随着科技的不断进步和市场领域的持续延伸&#xff0c;智能建筑已然成为建筑业科技升级的必经之路。 作为智能建筑领域的全球领导者&#xff0c;江森自控始终走在数字化变革前列&#xff0c;并在业内率先引入了电子合同&#xff0c;通过全流程线上进行的签…

【办公类-53-03】2024年第一学期校历制作(“月/日(星期)”版、排班表、跳过节日和周三)

背景需求&#xff1a; 前期代码制作出2024年第一学期校历&#xff0c;按照5天一周的方法&#xff0c;提取实际工作日。制作成“周计划教案”使用的长日期、短日期 -【办公类-53--01】2024年第一学期校历制作&#xff08;星火讯飞提取实际工作日&#xff0c;5天一行&#xff0…

Spring-Retry 框架实战经典重试场景

Spring-Retry框架是Spring自带的功能&#xff0c;具备间隔重试、包含异常、排除异常、控制重试频率等特点&#xff0c;是项目开发中很实用的一种框架。 1、引入依赖 坑点&#xff1a;需要引入AOP&#xff0c;否则会抛异常。 xml <!-- Spring-Retry --> <dependency&…

【AI大模型】通义千问:开启语言模型新篇章与Function Call技术的应用探索

文章目录 前言一、大语言模型1.大模型介绍2.大模型的发展历程3.大模型的分类a.按内容分类b.按应用分类 二、通义千问1.通义千问模型介绍a.通义千问模型介绍b.应用场景c.模型概览 2.对话a.对话的两种方式通义千问API的使用 b.单轮对话Vue页面代码&#xff1a;Django接口代码 c.多…