Redis通用命令

目录

Redis客户端

​编辑Redis核心命令 

Redis通用命令

keys

exists 

del

expire

ttl

type

总结 


Redis客户端

Redis也是一个基于客户端-服务器结构的程序,为什么说也呢?因为MySQL也是一个基于客户端服务器的结构。

Redis客户端可以和服务器在同一台主机上,也可以在不同主机上,目前我们一般只有一台机器,此时客户端和服务器就是在同一个机器上的。'

客户端服务器模式是客户端通过网络给服务器发送一条请求,服务器收到请求后通过网络响应给客户端,一个服务器是可以接受多个客户端的请求的。

Redis的客户端的形态

1.自带的命令行客户端: redis-cli

我们可以直接使用redis-cli命令,如果要连接其他主机端口号可以这样写,redis-cli -h [IP] -p [port]

2.图形化界面的客户端

如同画图板一样的桌面程序客户端或者是如同页面一样web程序的客户端。

图形化程序依赖windows系统,但是未来我们办公的windows系统连接到服务器可能会有诸多限制,所以windows上的图形化界面客户端能不能连接上服务器的redis是个未知数。

3.基于redis的api自行开发客户端

通过手动命令的方式使用redis是非常低频的操作,主要是使用redis的API来进行操作,非常类似于mysql的C语言API和JDBC,redis也是同理,通过代码的方式操作redis,后续会学习的使用C++编写redis代码。

Redis的快

快和慢是相对的,猎豹比人肯定跑的快,但是如果猎豹和飞机高铁的速度一比,就非常的慢了。

这里redis的快,是相对于mysql这样的关系型数据库的,如果和直接操作内存相比就显得慢了,比如说我们要在服务器上存储一个视频的id和点赞数的数量,我们是直接用redis存储还是在内存上创建一个哈希表存储呢?当然是哈希表,使用哈希表是直接操作内存的,而redis是先通过网络在操作内存的,当然就比直接操作内存来的要慢。

但是有了redis之后,就可以把数据单独存储,如果应用服务器重启,不会影响到数据的内容,当redis扩展成分布式系统,使用redis是更佳的。

是否使用redis要根据实际的情况来确定,不能无脑使用,一定要想清楚它的来龙去脉,想想引入一个技术之后能够解决什么问题,但是又引入了什么问题。

Redis通用命令

redis的命令是非常多的,我们想把redis的命令全都背下来,显然是不靠谱的,我们只需要掌握最常用的命令即可,那就需要多操作多练习,其次要学会使用redis的文档。

redis的官网连接Redis - The Real-time Data Platform

当我们点击进去之后就会进入这个界面。

我们要查一些命令可以吧鼠标放在资源这个单词上,就会出现一个列表,然后点击命令单词即可。

然后就会进入下图的界面,要搜索什么命令直接输入即可。

比如我要查找ping命令,直接在搜索框输入。 

此时就可以看到该命令的用法了。

Redis核心命令 

下面我们来学习redis最核心的两个命令。如果你学Redis不会这两个命令,可以说白学了。

redis是按照键值对的方式存储数据的,要么是把键值对存进去,要么是根据键去取值。

set命令

set是把key和value存进去,这里的key和value必须是字符串,你写数字可以吗,也可以,但是会把数字转成字符串。

要想输入命令必须要进入到redis的客户端程序才能输入redis命令,你别直接在linux命令行输入,需要使用redis-cli进入客户端。

我们来使用一下set命令存储一下数据,这里我们敲下set后会温馨的给我们提示怎么用,还是很智能的。

我们存储如下图所示的3个键值对,这里说是字符串,但是我们是不需要添加引号的,加上也是可以的,单引号和双引号都可以。我们输入命令之后如果显示OK,就说明存储成功了。

redis也是可以命令补全的,当我们敲下s之后按下table键,会自动补全,再按一次会补全成另外一个命令,我们可以看到这里补全的是大写的字母,redis是大小写不区分的,你写大写字母小写字母都可以。 

get命令

get是根据key来取value。

下面我们使用get命令查询一下我们上面插入的键值对。

我们可以看到,key1和key2都是存在的,但是如果我们查询一个不存在的值key9, 就会返回nil,这里的nil和NULL是一个意思,表示不存在。

Redis通用命令

Redis支持很多种数据结构,但它们都是键值对结构,key固定就是字符串,value实际上会有多种类型,最常见的五种类型是字符串、哈希表、列表、集合、有序集合,那么此时我们操作不同的数据结构就会有不同的命令,我们后面介绍命令都是通过数据结构的维度介绍的,除了数据结构这些命令外,还有一些命令是这些数据结构都能用的上的,这些命令叫做通用命令。

通用命令就是能够搭配任意一个数据结构来使用的。

keys

用来查询当前服务器上匹配的 key。

通过一些特殊符号(通配符)来描述key的模样,匹配上述模样的key就能被查询出来。

如果我们存储的key很多,或者时间久了我们就会忘记,因此就需要通过keys命令来查询,下面我们看看keys如何使用。

语法:

keys pattern

pattern意思是包含一个特殊符号的字符串,有的地方翻译成"样式"或者"模式",它主要是去描述另外的字符串长啥样,什么样的字符串符合要求。

那么pattern怎么写呢?具体能包含哪些符号呢?我们可以看看官方文档咋说的,下图就是官方文档给出的支持哪些通配符。

我们先插入一些键值对,方便我们下面进行实操。

?匹配任意一个字符

上述例子中是h?llo 匹配hello,hallo,hxllo,这里的?就匹配了e,a,x这3个字符。

其它字符相同,?对应位置就会被匹配到。

*匹配0个或多个任意字符

上述例子中是h*llo 匹配了hllo这里是*匹配0个字符,还匹配了heeeello,这里就是*匹配多个任意字符,这里即使不是4个e而是不同的4个字符也都可以被*匹配到。

其它字符相同,0个或者多个字符都被匹配了出来。 

[ae]只能匹配ae别的不行,相当于给出固定选项了

上述例子中是h[ae]llo匹配hello和hallo,但是最后一个hillo,i不是a也不是e,因此就无法匹配。

其它字符相同,对应字符是[abe]的就全被匹配出来了。

[^e]表示排除e,只有e匹配不了,其它的都能匹配,相当于排除错误答案

上述例子中是h[^e]llo匹配了hallo,hbllo,a和b都不是e因此可以匹配,但是hello就匹配不了。

其它字符相同,包含a和e的都被排除,因此就只剩下hbllo被匹配了出来。

[a-b]是直接给出一个范围,表示a-b范围内的字符都可以匹配,包含两侧边界

上述例子中是h[a-b]llo匹配hallo和hbllo,a和b都在a-b的范围内当然可以匹配,如果是hxllo就无法匹配了,x并不在a-b之间。

其它字符相同,匹对应位置字符在a-e之间的,被匹配了出来,当然我们没有对应位置是c和d的key

 

上面的这些匹配规则我们不需要去背,只需要有个印象就行,到时候用的时候去官网查一下就知道了。

注意事项

keys命令的时间复杂度是O(N)的,这也不难理解,需要遍历所有的键值对,所以在工作上,一般都会禁止keys命令,尤其是keys *,keys光写个*啥意思,意思就是把redis中所有的key都查询出来,这样的操作在工作中使用非常危险,因为工作中key可能会非常多,而redis是单线程的服务器,去解释执行命令只有一个线程,如果key非常多,那么会导致执行keys *时间非常长,导致redis服务器被阻塞,无法给其他客户端提供服务。

但是我们日常学习使用的是有可以随意使用keys *。

可以看到我们目前我们创建的所有的key都显示出来了。

exists 

用来判定key是否存在。

语法:

exists key[key...]

返回值:key存在的个数

exists是可以判定多个key的, 如果我们判定三个key,其中2个存在1个不存在,返回值就是2,如果只判定一个key,存在就返回1,不存在就返回0。

时间复杂度:O(1)

redis组织这些key是通过哈希表来组织的,因此时间复杂度就是O(1)的。

这里说一下,redis支持很多数据结构,意思是value可以是一些复杂的数据结构,但是redis本身这些键值对是通过哈希表的方式来组织的,redis具体的某个值,又可以是一些数据结构。

下面我们来使用一下exists。

我们先看一下当前redis上存在哪些键值对,使用keys *命令即可。

查询一个key是否存在 

用exists查询一下hello是否存在,返回结果是1,说明要查找的key是存在的。

查询多个key是否存在 

exists查询多个key是否存在,这两个都存在,因此返回值是2。

 

除了上述的写法,我们还可以一次只判断一个key在不在, 判断两次,但是这样效率是不如一次查询多个的,因为redis是基于客户端服务器的,这样就会多产生一次网络请求,效率当然会降低,因此如果我们需要查询多个key,直接使用exists查询多个就行,不要一个个查询。

redis很多命令都是支持一次就能操作多个key的。

下面我们查询了hallo hello music,但music不存在,因此返回的个数就是2

del

del其实就是delete删除指定的key,可以一次删除一个或者多个。

语法:

del key [key ...]

时间复杂度:O(1)

返回值:删除掉的key的个数 

删除一个存在的key

del删除一个hello,返回了1,表示删除成功。

删除一个不存在的key 

要删除的key不存在,比如下面的music,既然不存在,就返回0,表示删除了0个,为啥删除0个呢?以为它不存在我怎么删除。

删除多个key 

由于上面我们把hello删除了,因此这里再删除hallo和hello的时候就只返回1,表示删除了一个,也就是删除成功了hallo。

expire

expire是给指定的key设置过期时间,当key存活时间超过指定的值,就会被自动删除。

很多场景都会涉及到时间限制,最典型的就是手机验证码,验证码一般都是5分钟内有效,如果超过5分钟将会失效,此时我们可以通过expire设置,这里expire的单位是秒,因此我们创建key之后,可以通过expire设置300秒过期时间,此时这个key在5分钟后就会消失。

语法:

expire key seconds

这里秒虽然对于我们人来说是很短暂的,但对于计算机秒是个非常长的时间, 因此能不能设置更小的单位呢?

redis提供了 pexpire,设置毫秒级的过期时间。

时间复杂度:O(1)

返回值:1表示成功,0表示失败。

下面我们设置过期时间为啥不成功呢?这里expire设置的过期时间,必须是针对已经存在的key,上面我们已经把hello删除了,因此设置就失败了。

我们先设置一个key hello,然后再给它指定过期时间9秒,这里我们get前几次都可以获取到,然后过了一会再get就是nil了,我们并没有手动删除key,但是时间过了就会自动删除掉。

和过期时间搭配的还有一个命令ttl,ttl用来查询过期时间,这两个命令是搭配着使用的。 

ttl

ttl是time to live存活的时间,可以用来查询一个key的过期时间还剩多少,当然还有一个pttl,这里的pttl就不介绍了,ttl和expire搭配,pexpire和pttl搭配使用。

语法:

ttl key

时间复杂度:O(1)

返回值:剩余过期时间。-1表示没有关联过期时间,-2表示key不存在。 

我们先设置一个key是music,然后设置9秒过期时间,然后使用ttl查看music剩余多少时间,可以看到是逐渐减小的,最后-2就表示过期时间到了,music被删除了,使用get查看果然是nil,哪里出现两次2是因为我按太快了,单身20年的手速。

经典面试题 

一个redis中可能存在很多的key,这些key中可能一部分有过期时间一部分没有过期时间,此时redis服务器咋知道那些key已经过期要被删除,那些key还没过期?这里就涉及到redis过期策略实现的问题,这是一道很经典的面试题。

如果直接遍历所有的key,肯定是不行的,key可能有很多,直接遍历效率很低,最主要redis是单线程的程序,因此如果遍历key消耗的时间太多,redis处理命令的任务就会被阻塞住,会产生类似于执行keys *这样的效果,在使用的人看来,我输入命令没响应了,不就如同服务挂了一样吗?会造成严重的后果。

redis整体采取的策略是定期删除惰性删除相互结合。

惰性删除:假设这个key已经到过期时间了,但是我们暂时先不删它,key还存在,紧接着后面有一次访问正好用到了这个key,于是这次访问就会让redis服务器触发删除key的操作,同时在返回一个nil值。

定期删除:每隔一段时间扫描一下,看看哪些过期,但如果key很多,遍历效率很低,那怎么办呢?我们每次抽取一部分key进行验证过期时间,保证抽取检查的时间足够快,不会耗太多的时间。

虽然有了这两种策略结合,但整体效果一般,可能仍会有很多过期的key残留,没被及时删除掉,这些key就会占用内存空间,但没关系,redis除了上述两种策略,还提供了一系列内存淘汰策略,这里先知道一下即可,最主要的了解惰性删除和定期删除即可。

type

type可以查看key对应的value类型,redis所有的key都是string类型,但value可能会存在多种类型,下面是从官网截的图,type可能的返回结果,这个是不全面的,redis还有很多类型。当我们忘记一个key对应value类型不知道如何使用的时候,就可以使用type查看一下。

string就是字符串,list就是 列表,set是集合,zset是有序集合,hash是哈希表,stream是redis作为消息队列的时候使用这个类型的value,如果不存在返回结果是none。下面我们具体操作一下。

语法:

type key

时间复杂度:O(1) 

返回值:key对应的类型,如果不存在返回none

查询不存在的key类型

当前redis中并没有key,因此返回none

字符串类型 

创建一个键值对key1 111。再次说明,type是查询key对应value的类型,也就是说这里111是字符串类型。

列表类型

用lpush创建一个列表类型的value,l相当于是left,往最左边插入,就是头插操作。看到value类型是个列表。关于列表、集合、哈希表我们后面会一一介绍。

集合类型

通过sadd创建一个集合类型的value,s可其实就是set的缩写。

哈希类型

hset可以创建哈希类型的value,这里key4的value是一个哈希表,这个哈希表的key是filed1,value是value1。

剩下的类型就不一一演示了。

总结 

keys:用来查看匹配规则的key

exists:用来判定指定的key是否存在

del:删除指定的key

expire:给指定的key设置过期时间

ttl:查看key的过期时间

type:查询key对应的value类型 

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

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

相关文章

第49天:Web开发-JavaEE应用SpringBoot栈模版注入ThymeleafFreemarkerVelocity

#知识点 1、安全开发-JavaEE-开发框架-SpringBoot&路由&传参 2、安全开发-JavaEE-模版引擎-Thymeleaf&Freemarker&Velocity 一、开发框架-SpringBoot 参考:https://springdoc.cn/spring-boot/ 访问SpringBoot创建的网站 1、路由映射 RequestMapping…

腾讯云扩容记录

腾讯云扩容: sudo yum install -y cloud-utils-growpart 安装扩容工具 sudo file -s /dev/vda1 有数据 sudo LC_ALLen_US.UTF-8 growpart /dev/vda 1 sudo resize2fs /dev/vda1 df -Th 完毕 以下是对执行的命令的详细解释以及背后的原理: 1. 安装 cloud…

Linux上构建RPM包指南

构建RPM包主要需要 打包工具 (rpmbuild)源代码压缩包 (xxx.tar.gz)编译所需的依赖包spec脚本 文章目录 打包工具源代码包spec文件rsync.specopenssh.spec修改specopenssh-9.9p2 额外的源码包openssh.spec 依赖包rsyncopensshOpen…

秒杀系统的常用架构是什么?怎么设计?

架构 秒杀系统需要单独部署,如果说放在订单服务里面,秒杀的系统压力太大了就会影响正常的用户下单。 常用架构: Redis 数据倾斜问题 第一步扣减库存时 假设现在有 10 个商品需要秒杀,正常情况下,这 10 个商品应该均…

文章管理+

该文章管理也是引用由 components文件夹下的 PageContainer 文件来的,在PageContainer中设置来 父传子,通过文章管理页面传递过去标题,具名插槽设置是否需要button按钮,以及默认插槽传递内容。 通过在 el-form表单中 添加 inliine…

Windows对比MacOS

Windows对比MacOS 文章目录 Windows对比MacOS1-环境变量1-Windows添加环境变量示例步骤 1:打开环境变量设置窗口步骤 2:添加系统环境变量 2-Mac 系统添加环境变量示例步骤 1:打开终端步骤 2:编辑环境变量配置文件步骤 3&#xff1…

数据结构(初阶)(三)----单链表

单链表 概念 概念:链表是⼀种物理存储结构上⾮连续、⾮顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 结点 与顺序表不同的是,链表的结构类似于带车头的火车车厢,,链表的每个车厢都是独立…

Deepseek 开源周第一天:FlashMLA

Deepseek 隆重开启开源周!第一天我们迎来了FlashMLA。我很高兴带大家了解这项创新,揭秘 FlashMLA 为何能成为 AI 和 GPU 优化领域的变革者。 Deepseek 开源周的热门话题有哪些?

微软具身智能感知交互多面手!Magma:基于基础模型的多模态AI智能体

作者: Jianwei Yang, Reuben Tan, Qianhui Wu, Ruijie Zheng, Baolin Peng, Yongyuan Liang, Yu Gu, MuCai, SeonghyeonYe, JoelJang, Yuquan Deng, Lars Liden, Jianfeng Gao 单位:微软研究院,马里兰大学,威斯康星大学麦迪逊分校…

解决Docker Desktop启动后Docker Engine stopped问题

一、问题描述 当我们更新了Docker Desktop后,在重新打开就显示【Docker Engine stopped(Docker引擎已经停止)】,无法正常使用Docker,如下图所示: 二、问题分析 1、检查电脑主板的CPU是否开启虚拟化; 2、需检查Docker所需的功能是否开启; 3、检查WSL是否匹配; Docker的…

微信小程序:完善购物车功能,购物车主页面展示,详细页面展示效果

一、效果图 1、主页面 根据物品信息进行菜单分类,点击单项购物车图标添加至购物车,记录总购物车数量 2、购物车详情页 根据主页面选择的项,根据后台查询展示到页面,可进行多选,数量加减等 二、代码 1、主页面 页…

微服务学习(2):实现SpringAMQP对RabbitMQ的消息收发

目录 SpringAMQP是什么 为什么采用SpringAMQP SpringAMQP应用 准备springBoot工程 实现消息发送 SpringAMQP是什么 Spring AMQP是Spring框架下用于简化AMQP(高级消息队列协议)应用开发的一套工具集,主要针对RabbitMQ等消息中间件的集成…

echarts柱状图不是完全铺满容器,左右两边有空白

目录 处理前:echarts柱状图不是完全铺满容器,左右两边有空白处理前:通过调整 grid 组件配置处理后效果修改代码:1. 调整 grid 组件配置原理解决办法 2. 处理 xAxis 的 boundaryGap 属性原理解决办法 3. 调整 barMaxWidth 和 barMi…

【K8S】Kubernetes 基本架构、节点类型及运行流程详解(附架构图及流程图)

Kubernetes 架构 k8s 集群 多个 master node 多个 work nodeMaster 节点(主节点):负责集群的管理任务,包括调度容器、维护集群状态、监控集群、管理服务发现等。Worker 节点(工作节点):实际运…

千峰React:案例二

完成对html文档还有css的引入&#xff0c;引入一下数据&#xff1a; import { func } from prop-types import ./购物车样式.css import axios from axios import { useImmer } from use-immer import { useEffect } from reactfunction Item() {return (<li classNameacti…

C语言【指针篇】(四)

前言&#xff1a;正文1. 字符指针变量2. 数组指针变量2.1 数组指针变量是什么?2.2 数组指针变量怎么初始化 3. 二维数组传参的本质4. 函数指针变量4.1 函数指针变量的创建4.2 函数指针变量的使用4.3 两段有趣的代码4.3.1 typedef关键字 5. 函数指针数组6. 转移表 总结 前言&am…

GitCode 助力 python-office:开启 Python 自动化办公新生态

项目仓库&#xff1a;https://gitcode.com/CoderWanFeng1/python-office 源于需求洞察&#xff0c;打造 Python 办公神器 项目作者程序员晚枫在运营拥有 14w 粉丝的 B 站账号 “Python 自动化办公社区” 时&#xff0c;敏锐察觉到非程序员群体对 Python 学习的强烈需求。在数字…

对话Stack Overflow,OceanBase CTO 杨传辉谈分布式数据库的“前世今生”

近日&#xff0c; OceanBase CTO 杨传辉受邀出席全球知名开发者论坛 Stack Overflow 的最新一期播客节目&#xff0c;与 Stack Overflow 高级内容创作官 Ryan Donovan 展开对话。双方围绕分布式数据库的可靠性、一致性保障、HTAP 架构以及 AI 时代分布式数据库的发展趋势等热点…

小结:计算机网路中的性能指标小结

发现B站的这套课程不错&#xff0c;开始学习并笔记之&#xff1a;计算机网络微课堂&#xff08;有字幕无背景音乐版&#xff09;_哔哩哔哩_bilibili 1) 速率 2) 带宽 3) 吞吐量 带宽1 Gb/s的以太网&#xff0c;代表其额定速率是1 Gb/s&#xff0c;这个数值也…

seasms v9 注入漏洞 + order by注入+​information_schema​解决方法

目录 一、当注入时&#xff0c;information_schema被禁用的解决方法 1.通过sys库可以获取到表名和库名 2.通过无列名注入join获取列名 二、seasms v9 注入漏洞 三、order by注入 一、当注入时&#xff0c;information_schema被禁用的解决方法 information_schema数据库是My…