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


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

    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 的类型。

  • 相关阅读:
    IODAY2
    什么是 MyBatis?与 Hibernate 的区别
    蓝桥杯每日一题2023.9.21
    springcloud学习笔记(3)-服务管理组件Nacos
    【STM32】硬件资源及芯片介绍
    Python与CAD系列基础篇(三)创建二三维多段线、圆弧、椭圆弧、样条曲线
    Redis代码实践总结(二)
    路由器——交换机——网络交换机:区别
    nginx 虚拟主机的配置
    漫画 | 重磅!七国集团决定制裁Go语言!
  • 原文地址:https://blog.csdn.net/Shine0115/article/details/140109059