当前位置: 首页 > article >正文

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.kler.cn/a/568520.html

相关文章:

  • Java 容器之 List
  • 2024年时间序列预测领域的SOTA模型总结
  • 代数结构—笔记
  • swift 开发效率提升工具
  • Oracle 数据库基础入门(四):分组与联表查询的深度探索(上)
  • 内存管理c/c++
  • 鸿蒙项目实战:PR#39888中解决的ACE引擎具体问题及技术方案赏析
  • Android 端侧运行 LLM 框架 MNN 及其应用
  • 【Linux】消息队列和信号量
  • 问题修复-后端返给前端的时间展示错误
  • Pytorch使用手册—Raspberry Pi 4 上的实时推理(30 FPS!)(专题三十六)
  • QEMU源码全解析 —— 内存虚拟化(23)
  • 语法Object.defineProperty()
  • YashanDB简介
  • Java 设计模式:软件开发的精髓与艺
  • FunPapers[3]:WWW‘25「快手」生成式回归预测观看时长
  • Makefile、Make和CMake:构建工具的三剑客
  • 字符串的原理
  • 水果识别系统 | BP神经网络水果识别系统,含GUI界面(Matlab)
  • 数学建模:MATLAB极限学习机解决回归问题