Redis 中的通用命令(命令的返回值、复杂度、注意事项及操作演示)

Redis 中的通用命令(高频率操作)

文章目录

  • [Redis 中的通用命令(高频率操作)](#Redis 中的通用命令(高频率操作))
  • [Redis 的数据类型](#Redis 的数据类型)
  • [redis-cli 命令](#redis-cli 命令)
  • [Keys 命令](#Keys 命令)
  • [Exists 命令](#Exists 命令)
  • [Expire 命令](#Expire 命令)
  • [Ttl 命令](#Ttl 命令)
  • Type命令

Redis 的数据类型

Redis 支持多种数据类型,整体来说,Redis 是一个键值对结构的,它的 key 固定是字符串类型,而 value 支持 字符串、哈希表、列表、集合、有序集合 等几种数据类型,操作不同的数据时就需要用到不同的命令,但是也有一些全局的命令 在这几种数据类型中都可以使用,命令如下:

redis-cli 命令

在Linux 上通过 redis-cli 即可启动 Redis 客户端,如下图:

(如果要退出redis客户端的话直接 Ctrl + d)

通过 redis-cli 命令就可以连接到我们电脑上的 redis 客户端,也可以通过指定 ip 地址来连接其他主机上的 redis 客户端,如下图:

通过 -h 选项指定主机地址,通过 -p 选项指定端口号

Keys 命令

keys 命令 用来查询服务器上匹配的 key(相当于模糊查询命令)

h?llo 将 ?替换成任意一个字符

h*llo 将 * 替换成0个或多个字符

h[ab]llo 只能匹配到 [] 指定的字符,别的字符都不行,相当于给出了固定的选项

h [ ^ x] llo []表示排除错误答案,除了匹配x,其他的任何字符都可以

h[a-b]llo 表示匹配到指定的字符

通过一些特殊符号,在服务上查找与之类似的key,这些特殊符号都有以下几种:

h?llo 将 ?替换成任意一个字符

h?llo 可以匹配到 hello/hxllo/hallo 等

操作演示:

  1. 设置三个key,分别为:hello、hallo、hbllo
  1. 使用 keys h?llo 进行模糊查询

h*llo 将 * 替换成0个或多个字符

h*llo 匹配到 h/hllo/heeeello

h[ab]llo 只能匹配到 [] 指定的字符,别的字符都不行,相当于给出了固定的选项

匹配到 hallo/hbllo

h [ ^ x] llo []表示排除错误答案,除了匹配x,其他的任何字符都可以

h [ ^ x] llo 可以匹配到 hello/hallo等,但是不会匹配到 hxllo,除了x其他的都可以

h[a-b]llo 表示匹配到指定的字符

h[a-b]llo 可以匹配到 hallo 或 hbllo

时间复杂度:O(n)

注意:Keys 的时间复杂度是 O(n),因为,它要遍历 Redis 中的所有数据,所以应该在生产环境上要慎重使用,尤其是 keys*,不要去使用,因为它会查询 Redis 中所有的 key,而 Redis 是一个单线程的服务器,执行 Keys * 的时间就比较长,就会造成 Redis 服务器被阻塞,无法给其他的客户端提供服务。

而 Redis 经常是用作缓存,是替 Mysql 冲锋陷阵的,万一 Redis 被Keys*给阻塞住了,此时其他的查询 Redis 的操作也就超时了,那么所有的查询请求就会给到 Mysql 上,此时突然一大波请求来到给到Mysql,就有可能给Mysql一个措手不及,给 Mysql 也搞挂了,此时就出现大问题了,如果没有及时的发现及时的恢复的话,会出现很大的问题!!!

Exists 命令

Exists key [key....] 查看 key 是否存在

**返回值:**key的个数

**时间复杂度:**O(k) 注意:这个k不是所有的数据,而是因为它是可以查看多个key是否存在的,所以这个k是要查询的key的数量

操作演示:

这里就出现一个问题:它可以一次查询多个 key,那么我一次查询多个 key 和 查询一个一个的 key 有什么区别吗?

答案:区别是很大的,首先呢,Redis 是 客户端-服务器 结构的,所以,是通过网络来通信的,而一次查询多个 key 时,只需要向服务器发送一次请求即可,而一次查询一个,一个一个的查,是要发送多个请求的,而网络通信的效率是比较低,成本是比较高的。

del key [key....] 删除 key

返回值:成功删除 key 的个数

**时间复杂度:**O(k) ,注意这个k不是所有的数据,而是因为它是可以查看多个key是否存在的,所以这个k是指定的 key 的数量。

操作演示:

Expire 命令

expire [key] seconds 给指定的key设置过期时间,时间单位是:秒。key 的存活时间超过这个值时就会自动删除

pexpire [key] 毫秒 给指定的key设置过期时间,时间单位是:毫秒

注意:这里设置过期时间,指定的 key 必须是已经存在的。

**返回值:**0或1,0 表示设置失败,1 表示设置成功。

时间复杂度是:O(1)

这种给 Redis 中的key设置过期时间的方式也常用于很多的场景,例如:给验证码设置过期时间,点外卖优惠券过期时间等

操作演示:

Ttl 命令

ttl [key] 获取指定key剩余的过期时间

**返回值:**剩余的过期时间/-1:没有设置过期时间/-2:没有指定的key

时间复杂度:O(1)

操作演示:

Redis 的过期策略是如何实现的?换句话说,一个Redis中的存在多个有过期时间的key,那么,Redis如何知道哪些key要被删除,哪些不被删除?(重要)

Redis 的过期策略整体是这两种方式相结合的:定期删除 和 惰性删除

惰性删除:假设有一个key的过期时间已经到了,但是暂时不会给他删除,先保留着,等到我们下次去访问这个key时,此时Redis服务器就会触发删除操作,将key删除,此时就返回一个 nil。

定期删除:定期的去扫描key,如果有过期的key,就进行删除,但是这里有一个问题就是,如果key非常多的话,扫描起来就比较浪费时间,所以,在这里对定期扫描的时间进行了要求,就是它在扫描检查的时候是一部分一部分抽取着扫描检查,以保证扫描检查的时间足够快。

这里为什么要对扫描的时间进行要求呢?

首先,Redis 是单线程执行任务的,Redis 主要的任务还要处理用户发来的命令,如果扫描key的时间太长,处理命令的任务就会被阻塞,所以,进行了要求。

以上两种方式,虽然可以对 key 进行删除,但是整体效果一般,它也可能会残留很多的key没有及时的删除掉。

Redis 为了删除操作进行补充,还提供了一系列的内存淘汰策略。

网上还有人说Redis有定时删除策略,这个说法是错误的,Redis 并没有采用定时删除策略

Type命令

type 查看key对应的数据类型

**返回值:**key 的数据类型

时间复杂度:O(1 )

操作演示:

再次明确,Redis 中,key 的类型固定就是 String,而 Value 的类型主要有以下几种:none, String,list,set,zset,hash,strem。这里面查看类型也就是查看 Value 的类型。

相关推荐
wilsonzane3 分钟前
Mongodb集群中的分布式读写
数据库·分布式·mongodb
关中雪12 分钟前
【应届应知应会】SQL常用知识点50道
数据库·mysql·nosql·秋招·校招·春招
zxrhhm22 分钟前
MySQL中使用PROFILING来查看SQL执行流程
数据库·mysql
醇氧23 分钟前
【postgresql】表操作
数据库·sql·postgresql
PGCCC23 分钟前
使用预加载库优化 PostgreSQL 函数#postgresql认证
数据库·postgresql
baozongwi1 小时前
CTF常用sql注入(一)联合注入和宽字节
数据库·sql·web安全
freesharer1 小时前
Zabbix 配置WEB监控
前端·数据库·zabbix
尾巴尖上的阳光1 小时前
ETCD概述--使用/特性/架构/原理
数据库·架构·etcd
关兮月2 小时前
MySQL存储与优化 一、MySQL架构原理
数据库·mysql
我想我不够好。2 小时前
SQL-DQL
数据库·sql