Redis客户端

news2024/12/26 1:15:38

文章目录

  • 一、scan命令
  • 二、数据库管理命令
  • 三、RESP协议
  • 四、string类型
  • 五、list类型
  • 六、set类型
  • 七、hash类型
  • 八、zset类型

一、scan命令

keys是一次性把整个redis中所有的key都获取道,这个操作比较危险,可能会一下子得到大量的key,阻塞redis服务器

通过渐进式遍历,即不是一个命令,把所有的key都拿到,而是每执行一次命令,只获取到其中的一部分,这样就可以做到:既能获取到所有的key,同时又不会卡死服务器,代表命令scan

在这里插入图片描述
如下图,cursor是光标,光标就指向了当前遍历的位置,光标设置为0,意味着这次遍历是从头开始获取,下面的"2",表示下次继续遍历,光标从哪里开始,后面的则是真正遍历到的key的内容

注意:不能把cursor理解成下标,它不是一个连续递增的整数,仅仅是一个字符串,客户端是不认识cursor的,redis服务器知道这个光标对应的元素位置

在这里插入图片描述
pattern则和keys对应的pattern用法一样,不再赘述

count,是给redis服务器一个"提示/建议",最终返回的key个数和count不一定是相同的,但是不会差很多

如下图,返回0,就表明遍历完了!

在这里插入图片描述

如下图,可以看出返回的光标位置,是随机变化的,并没有如同下标一样单调递增

在这里插入图片描述
渐进式遍历,在遍历过程中,不会在服务器这边存储任何的状态信息,此处的遍历是随时可以终止的,不会对服务器产生任何的副作用。例如:你去超市买东西,结账时,结到一半,你不想要部分东西了,就可以给收银员说不要了,收银员也就会叫工作人员来收走

渐进式遍历scan虽然解决了阻塞的问题,但如果在遍历期间键有所变化(增加、删除、修改),可能导致遍历时键的重复遍历或遗漏

渐进式命令还有一些其它命令,这里不再述说,读者可前往官网翻阅!!!

二、数据库管理命令

如同MySQL,redis中也是有database的,只不过不是自己创建的,而是现有的,用户既不能创建新的数据库,也不能删除已有的数据库

默认redis给用户提供了16个数据库0-15,这16个数据库中的数据是隔离的(相互之间不会有影响),默认使用 0 号数据库

选择数据库
在这里插入图片描述
在这里插入图片描述
清空数据库中的key,分为异步和同步两种
在这里插入图片描述
清空所有数据库中的key,也分为异步和同步两种
在这里插入图片描述
获取当前数据库中key的个数
在这里插入图片描述

三、RESP协议

为什么我们能编写出redis的自定义客户端,而王者荣耀等其它的不行?
因为redis没有用https等其它现有的应用层协议,同时,redis的自定义协议是公开的!!!

如下图,是RESP协议的缩写
在这里插入图片描述
resp协议的优点:
1、简单好实现;
2、快速进行解析;
3、肉眼可读。
在这里插入图片描述

resp协议虽然使用了TCP协议,但没有和TCP强耦合
在这里插入图片描述
在这里插入图片描述
客户端给服务器发送的redis命令,是以bulk string数组的形式发送的
在这里插入图片描述
不同的命令,返回结果不一样,有的命令,直接返回ok,有的命令,可能返回个整数,有的命令,可能返回个数组
在这里插入图片描述
如下图,针对不同的类型,redis服务器就将以不同的格式回复,即将下面的字符串,写入到tcp socket中即可

在这里插入图片描述
在这里插入图片描述
simple string 只能用来传输文本
在这里插入图片描述
bulk string可以传输二进制数据
在这里插入图片描述
redis客户端要按照上述格式,构造出字符串,往socket中写入;同时从socket中读取字符串,也要按照上述格式解析。不过这不需要我们自己来做,因为已经有大佬实现了这套协议的解析/构造,只要使用他们提供的库,就可以比较简单方便地完成和redis服务器通信的操作!

这里采用redis-plus-plus的库来操作redis,虽然库很多,但都大同小异!

安装redis-plus-plus的路径如下:
Github地址: https://github.com/sewenew/redis-plus-plus

因为redis-plus-plus依赖了hiredis,所以需要先下载hiredis
Centos安装:
yum install hiredis-devel.x86_64
Ubuntu安装:
apt install libhiredis-dev

下载redis-plus-plus源码
在这里插入图片描述
Centos编译安装:
Centos自带的cmake版本过低,需要先安装cmake3
yum install cmake3
然后安装以下步骤操作,最后一部需要sudo或切换至root执行:
在这里插入图片描述

Ubuntu编译安装:
在这里插入图片描述
连接redis服务器

如下图,通过find命令先找到redis++的头文件和库文件目录

在这里插入图片描述
在这里插入图片描述
这里用<>包含头文件,<>:在系统目录下搜索头文件,“”:在项目目录中搜索头文件

在这里插入图片描述
如下图, 用url来构建对象,指明传输层协议,服务器地址,以及端口号,值得注意的是,url并不专属于http!

在这里插入图片描述
进行ping操作,检查是否连通,成功返回字符串pong

在这里插入图片描述
由于这里引用了hiredis和redis库,所以需要在编译时指定库的路径,以及线程库

在这里插入图片描述
运行结果如下图所示

在这里插入图片描述

四、string类型

set和get命令

如下图可知,函数的参数和命令行输入差不多,StringView是字符串类型,只是不能被修改

在这里插入图片描述
OptionalString可以表示"非法值"或"无效值",redis中的非法值是用nil表示的,直接用std::string表示nil不是很方便,std:string*表示,又涉及到内存管理的问题,所以redis的作者封装了OptionalString这个类型!

在这里插入图片描述
如下图,获取key1和key2的value,是正常的,但获取不存在的key3的value,就发生了抛异常,所以这里可以用两种方式解决,一种是捕捉异常,另一种则是 if 语句判断一下是不是为空即可!

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
exists命令

如下图,参数是一个初始化列表,可用来判断多个key是否存在,返回值为存在的key的个数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
为什么把清理数据放在开头?

1、如果放在结束,一旦执行的程序中间出现了异常,就可能导致清理数据没有被执行;
2、放在开头,当执行完一个操作之后,redis里面仍然是有数据的,也方便程序员手工检查数据的内容!!!

del命令

如下图,删除key,也和exsits一样,支持删除多个

在这里插入图片描述
在这里插入图片描述
expire和ttl命令

如下图,expire给key设置过期时间,ttl获取key剩余的时间

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
keys命令

如下图,是查找所有的key,参数pattern是匹配规则,back_insert_iterator是插入迭代器,本质是输出迭代器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里为什么不直接使用容器作为参数,key内部直接操作容器,进行插入?

因为这里可以解耦合,当是其它容器时,而不需要去改变迭代器!!!

STL中的五种迭代器的类型

输入迭代器
输出迭代器:back_insert_iterator,区间的任意位置,在该位置之前插入;font_insert_iterator,区间的开头,往前面插入;back_insert_iterator,区间的末尾,往后面插入,对于这些插入迭代器,*,++都是啥也不干!!!核心操作:如it = it2,it是back_insert_iterator,就是把it2指向的元素插入到it指向的容器末尾,相当于调用push_back()
前向迭代器
双向迭代器
随机访问迭代器

mset和mget命令

在这里插入图片描述
在这里插入图片描述
如下图, 当获取不存在的key4的value时,就抛出异常了
在这里插入图片描述

在这里插入图片描述
setrange和getrange命令

如下图,这两个命令也与在命令行输入时,用法一致

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
incr和decr命令

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、list类型

lpush和lrange命令

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
lpop命令

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
blpop命令

在这里插入图片描述
如下图,开始时没有数据,当有数据插入时,就会立即返回,如果时间超过100s也会返回

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
llen命令

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

六、set类型

sadd命令

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
sismember命令

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
scard命令

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
spop命令

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
sinter命令

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

七、hash类型

hset和hget命令

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
hexists命令

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
hdel和hlen命令

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
hkeys和hvals命令

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
hmset和hmget命令
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

八、zset类型

zadd和zrange命令

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
zcard命令

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
zrem命令

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
zscore命令

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
zrank命令

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

009_第一代软件开发(一)

第一代软件开发(一) 文章目录 第一代软件开发(一)项目介绍借鉴前辈UI传统QWidget OR QML建立远程仓库&#xff0c;并拉取至本地 关键字&#xff1a; Qt、 Qml、 git、 版本控制、 关键字5 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项目结合了 QML&#x…

设计模式再探——原型模式

目录 一、背景介绍二、思路&方案三、过程1.原型模式简介2.原型模式的类图3.原型模式代码4.原型模式深度剖析5.原型模式与spring 四、总结五、升华 一、背景介绍 最近在做业务实现的时候&#xff0c;为了通过提升机器来降低开发人员的难度和要求&#xff0c;于是在架构设计…

RabbitMQ - 消息堆积问题的最佳解决方案?惰性队列

目录 一、惰性队列 1.1、消息堆积问题 1.2、消息堆积问题的解决方法 从消费者的角度&#xff1a; 从队列的角度&#xff1a; 1.3、引入惰性队列 1.3.1、什么是惰性队列 1.3.2、惰性队列的使用 1.3.3、效果演示 一、惰性队列 1.1、消息堆积问题 当生产者发送消息的速度…

leetcodeTop100(21) 相交链表

给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 题目数据 保证 整个链式结构中不存在环。 注意&#xff0c;函数返回结果后&#xff0c;链表必须 保持其原始结构 。 双链表…

1:DDD入门

产品代码都给你看了&#xff0c;可别再说不会DDD&#xff08;一&#xff09;&#xff1a;DDD入门 # 这是一个讲解DDD落地的文章系列&#xff0c;作者是《实现领域驱动设计》的译者滕云。本文章系列以一个真实的并已成功上线的软件项目——码如云&#xff08;https://www.mryqr…

【车载开发系列】UDS中Bootloader实现原理

【车载开发系列】UDS中Bootloader实现原理 【车载开发系列】UDS中Bootloader实现原理 【车载开发系列】UDS中Bootloader实现原理一. Bootloader存放位置二. BootLoader的安全机制1&#xff09;安全访问2&#xff09;刷新预条件3&#xff09;完整性校验4&#xff09;一致性检查5…

NextJS 引入 Ant-Design 样式闪烁问题

按照这里给的样例&#xff0c;抽出关键代码即可 步骤&#xff1a; 安装包&#xff1a; npm i ant-design/static-style-extract引入这俩文件 genAntdCss.tsx: 会帮我们生成 ./public/antd.min.css // src/scripts/genAntdCss.tsximport { extractStyle } from "ant-d…

从锁的类别角度讲,MySQL都有哪些锁

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌&#xff0c;CSDN博客专家&#xff0c;阿里云社区专家博主&#xff0c;2023年6月CSDN上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师…

2024北京老博会,CBIAIE中国北京国际老年产业博览会

2024第11届中国&#xff08;北京&#xff09;国际老年产业博览会&#xff0c;将于4月10-12日盛大举行 2024第11届中国&#xff08;北京&#xff09;国际老年产业博览会&#xff08;CBIAIE北京老博会&#xff09; The 2024 eleventh China (Beijing) International Aged Indust…

【动手学深度学习-Pytorch版】长短期记忆网络LSTM

LSTM参数说明以及网络架构图 PS&#xff1a;时间仓促&#xff0c;有空补充内容~ LSTM从零开始实现 """ 遗忘门&#xff1a;相当于一个橡皮擦&#xff0c;决定保留昨天的哪些信息 输入门&#xff1a;相当于一个铅笔&#xff0c;再次根据昨天的记忆和今天的输…

【数据结构】list.h 详细使用教程 -- 附带例子代码

目录 一、概述二、详细使用步骤✨2.1 定义结构体包含 struct list_head 成员✨2.2 初始化链表头结点&#xff1a;INIT_LIST_HEAD✨2.3 添加结点&#xff1a;list_add、list_add_tail✨2.4 遍历链表&#xff1a;list_for_each、list_for_each_safe、list_for_each_entry✨2.5 获…

java double类型 向上取整,向下取整,四舍五入

向上取整&#xff1a;Math.ceil(double a) 向下取整&#xff1a;Math.floor(double a) 四舍五入取整&#xff1a;Math.round(double a) 直接取整数&#xff1a;intValue() public static void main(String[] args) {Double number 5.3;Double number1 5.8;//向上取整Doubl…

UE5 虚幻引擎 如何使用构造脚本(Construction Script)? 构造脚本的奥秘!

目录 1 构造脚本&#xff08;Construction Script&#xff09;1.1 介绍1.2 案例1&#xff1a;利用样条组件程序化生成树木1.2 案例2&#xff1a;利用样条组件和样条网格体组件程序化生成道路 1 构造脚本&#xff08;Construction Script&#xff09; 1.1 介绍 问题&#xff1a…

leetcode top100(20) 搜索二维矩阵 II

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。每列的元素从上到下升序排列。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,2…

腾讯mini项目-【指标监控服务重构】2023-08-24

今日已办 Jeager 功能 监控分布式工作流程并排除故障识别性能瓶颈追踪根本原因分析服务依赖关系 部署 部署 Deployment — Jaeger documentation (jaegertracing.io) 支持 clickhouse jaegertracing/jaeger-clickhouse: Jaeger ClickHouse storage plugin implementation …

Java8实战-总结34

Java8实战-总结34 重构、测试和调试使用 Lambda 重构面向对象的设计模式观察者模式责任链模式 重构、测试和调试 使用 Lambda 重构面向对象的设计模式 观察者模式 观察者模式是一种比较常见的方案&#xff0c;某些事件发生时&#xff08;比如状态转变&#xff09;&#xff0…

Java之转换流的详细解析

2. 转换流 2.1 字符编码和字符集 字符编码 计算机中储存的信息都是用二进制数表示的&#xff0c;而我们在屏幕上看到的数字、英文、标点符号、汉字等字符是二进制数转换之后的结果。按照某种规则&#xff0c;将字符存储到计算机中&#xff0c;称为编码 。反之&#xff0c;将…

docker容器安装MongoDB数据库

一&#xff1a;MongoDB数据库 1.1 简介 MongoDB是一个开源、高性能、无模式的文档型数据库&#xff0c;当初的设计就是用于简化开发和方便扩展&#xff0c;是NoSQL数据库产品中的一种。是最 像关系型数据库&#xff08;MySQL&#xff09;的非关系型数据库。 它支持的数据结构…

封装一个高级查询组件

封装一个高级查询组件 背景一&#xff0c;前端相关代码二&#xff0c;后端相关代码三&#xff0c;呈现效果总结 背景 业务有个按照自定义选择组合查询条件&#xff0c;保存下来每次查询的时候使用的需求。查了一下项目里的代码没有现成的组件可以用&#xff0c;于是封装了一个 …

腾讯mini项目-【指标监控服务重构】2023-08-29

今日已办 Collector 指标聚合 由于没有找到 Prometheus 官方提供的可以聚合指定时间区间内的聚合函数&#xff0c;所以自己对接Prometheus的api来聚合指定容器的cpu_avg、cpu_99th、mem_avg 实现成功后对接小组成员测试完提供的时间序列和相关容器&#xff0c;将数据记录在表格…