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

【Redis基础】Redis基本的全局命令

✅作者简介:大家好,我是小杨
📃个人主页:「小杨」的csdn博客

🐳希望大家多多支持🥰一起进步呀!


Redis基本的全局命令

1,KEYS命令

语法:KEYS pattern

KEYS命令用来查询服务器上所有满足样式(pattern)的 key,使用该命令的时间复杂度为O(N)。

注:在生产环境上一般会禁止使用KEYS命令,这是因为Redis是一个单线程服务器,当Redis中的数据量较多时,执行KEYS命令的时间较长,就导致Redis服务器阻塞,进而无法给其他客户端提供服务。

KEYS命令⽀持如下统配样式:

  1. ?:匹配一个任意字符,如:h?llo 匹配 hello,hallo 和 hxllo。
  2. *:匹配0个或多个任意字符,如:h*llo 匹配 hllo 和 heeeello。
  3. [abc]:只能匹配到[]里面指定的字符,如:h[ae]llo 匹配 hello 和 hallo 但不匹配 hillo。
  4. [^a]:排除[]里面指定的字符,如:h[^e]llo 匹配 hallo,hbllo,… 但不匹配 hello。
  5. [a-c]:匹配[]里面指定的字符范围,包含两侧边界,如:h[a-b]llo 匹配 hallo 和 hbllo。

数据准备:

image-20231124111952253

具体实例:

1)?:匹配一个任意字符

image-20231124111918131

2)*:匹配0个或多个任意字符

image-20231124112205218

3)[ae]:只能匹配到[]里面指定的字符

image-20231124112442087

4)[ ^abc]:排除[]里面指定的字符

image-20231124112549510

5)[a-b]:匹配[]里面指定的字符范围

image-20231124112704974


2,EXISTS命令

语法:EXISTS key [key …]

EXISTS命令是判断指定的KEY是否存在,KEY可以是一个也可以是多个,返回的是KEY存在的个数。

一次查询多个KEY是否存在与分多次查询KEY是否存在相比的好处是:减少了网络开销和调用内存的开销,执行效率更高。

在实际应用中,选择哪一种方式通常取决于具体的需求,如果是为了减少网络开销,使用一次查询多个KEY;如果想更精细地判断每个键的存在性,使用分多次查询KEY比较合适。

数据准备:

image-20231124112844247

具体操作:

image-20231124113045961


3,DEL命令

语法:DEL key [key …]

DEL命令是删除指定的KEY,KEY可以是一个也可以是多个,返回的是删除Key的个数。

数据准备:

image-20231124112844247

具体操作:

image-20231124113203427


4,EXPIRE命令

语法:EXPIRE key seconds

EXPIRE命令用于给指定的KEY设置过期时间,设置的时间单位为秒,返回的结果是0或1。【0表示设置失败,1表示设置成功】

EXPIRE命令通常与TTL命令搭配使用,当KEY存活时间超过所设置的过期时间,就会被自动删除。

EXPIRE命令可用于很多业务场景,例如规定时间内完成业务操作【倒计时】,基于Redis实现分布式锁。

具体操作:

image-20231124113538564


问1:Redis的Key的过期策略是怎么实现的?

答:Redis 使用的是一种被称为惰性删除(Lazy Expire)的过期策略。具体来说,Redis 不会立即删除已过期的键值对,而是在访问某个键时,会检查该键是否过期,如果过期则会进行删除操作。

问2:使用惰性删除的过期策略有哪些优点和缺点?

答:使用惰性删除的过期策略的优点是:可以减少系统开销,只在需要时删除过期数据,提高性能和效率,避免了堵塞;而其缺点是:可能导致存储空间的浪费,因为过期数据并不立即删除,而是等到访问时才进行清理,不适用于对实时性要求非常高的业务场景。

问3:有没有其他的方法作为Redis的Key过期策略?

  1. 定期删除: Redis会定期地随机抽取一部分设置了过期时间的键,检查它们是否过期,如果过期则删除。这样可以在一定程度上避免惰性删除可能导致的键在内存中存留的时间较长问题。但定期删除也有可能带来一些性能开销,特别是在扫描大量键时。
  2. 定时任务: 基于优先级队列和基于时间轮的定时器是两种常见的实现方式,定时检查并删除过期的键。这是一种手动维护的方式,适用于对过期键的管理要求较为严格的场景。

问4:基于优先级队列的定时器简单介绍?

在基于优先级队列的定时器中,会将需要执行的任务按照执行时间加入优先级队列,优先级规则为过期时间越早,其优先级就越高;定时器会定期检查队列头部,查看队首任务的执行时间是否已经到期,如果已经过期,就会执行删除key的操作并将其从队列中移除。而在这个过程中,不需要遍历所有的key,只需要关注队列的头部。

另外,在检查队首元素的过期时间操作不能够太频繁,过于频繁会影响性能,此时的做法是根据当前系统的时间和队首元素的过期时间设置一个线程等待时间,当到了时间,就唤醒线程执行对应的操作,这种做法就避免了频繁检查,减少CPU开销,使得性能更高。【当线程在休眠时,新增一个更早过期的key,这时就要先唤醒当前线程,然后再重新根据当前系统时间和队首时间设置删除等待时间 …】

问5:基于时间轮的定时器简单介绍?

在基于时间轮的定时器中,通常使用时间轮数据结构来实现定时任务的调度和执行。时间轮是一种将时间划分为若干个槽(slot)的数据结构,每个槽表示一个时间单位。时间轮按照时间的流逝,不断地顺时针移动,使得每个槽的时间逐渐增加。

时间轮调度器的时间精度不是很高,对于精度要求特别高的调度任务可能不太适合,因为时间轮算法的精度取决于时间段指针单元的最小粒度大小。比如时间轮的格子是一秒跳一次,那么调度精度小于一秒的任务就无法被时间轮所调度。

时间轮底层采用数组实现,数组中的每个元素可以存放一个定时任务列表(TimerTaskList)。TimerTaskList 是一个环形的双向链表,链表中的每一项表示的都是定时任务项(TimerTaskEntry),其中封装了真正的定时任务 TimerTask。

image-20231124132255694

5,PEXPIRE命令

语法:PEXPIRE key milliseconds

PEXPIRE命令用于给指定的KEY设置过期时间,设置的时间单位为毫秒,返回的结果是0或1。【0表示设置失败,1表示设置成功】

PEXPIRE命令通常与PTTL命令搭配使用,当KEY存活时间超过所设置的过期时间,就会被自动删除。


6,TTL命令

语法:TTL key

TTL命令用于查询指定的KEY剩余的生存时间,以秒为单位,返回的是给定key的剩余生存时间(TTL,time to live)。

TTL命名有三种返回值,分别为【key的剩余生存时间】,-1【key未设置过期时间】,-2【key不存在】。

具体操作:


7,PTTL命令

语法:PTTL key

PTTL命令用于查询指定的KEY剩余的生存时间,以毫秒为单位,返回的是给定key的剩余生存时间。

PTTL命名有三种返回值,分别为【key的剩余生存时间】,-1【key未设置过期时间】,-2【key不存在】。


8,TYPE命令

语法:TYPE key

TYPE命令用于判断指定KEY的Value数据类型,返回的是key所储存的值的类型,可以是none,string,list,set,zset,hash,stream … 。

数据准备:

image-20231124114124041

具体操作:

image-20231124114218165


本文小结:Redis有哪些基本全局命令?

  1. KEYS:查询服务器中所有满足 pattern 的 KEY。语法:keys pattern,
  2. EXISTS:判断指定的KEY是否存在,返回KEY存在的个数。语法:exists key [key …]
  3. DEL:删除指定的KEY,返回的是删除KEY的个数。语法:del key [key …]
  4. EXPIRE/PEXPIRE:给指定的KEY设置过期时间,返回的结果是0或1。语法:expire/pexpire key seconds/milliseconds
  5. TTL/PTTL:查询指定的KEY剩余的生存时间,返回的结果是key的剩余生存时间,-1【key未设置过期时间】,-2【key不存在】。语法:ttl/pttl key
  6. TYPE:判断指定KEY的Value数据类型,返回的是key所储存的值的类型。语法:type key

结语

这就是本期博客的全部内容啦!如果有什么其他的问题无法自己解决,可以在评论区留言哦!

最后,如果你觉得这篇文章写的还不错的话或者有所收获的话,麻烦小伙伴们动动你们的小手,给个三连呗(点赞👍,评论✍,收藏📖),多多支持一下!各位的支持是我最大的动力,后期不断更新优质的内容来帮助大家,一起进步。那我们下期见!

在这里插入图片描述



http://www.kler.cn/a/149829.html

相关文章:

  • Node.Js+Knex+MySQL增删改查的简单示例(Typescript)
  • 物联网(RFID)全景:被装信息化监控应用与挑战
  • 【Xrdp联机Ubuntu20.04实用知识点补充】
  • 重学SpringBoot3-整合 Elasticsearch 8.x (三)使用Repository
  • LLMs:MindFormers的简介、安装和使用方法、案例应用
  • docker compose 多个 Dockerfile
  • 一文详解Python中常用数据类型
  • render函数举例
  • vue中下载文件后无法打开的坑
  • Linux 下命令行启动与关闭WebLogic的相关服务
  • PPP/INS紧组合代码学习
  • uniapp设置手机通知权限以及uniapp-push2.0推送
  • 【迅搜04】索引配置(一)加载配置文件以及服务端配置
  • SpringBoot : ch09 整合Redis
  • 解析javascript数组方法 find 和 filter 有何区别
  • Android 11.0 默认开启USB调试功能
  • 【C++】内存管理(new与delete)
  • android开发:安卓13Wifi和热点查看与设置功能
  • 【Java Spring】SpringBoot 五大类注解
  • 使用elasticsearch-head插件修改elasticsearch数据
  • [UGUI]Unity背包系统制作详细步骤
  • 【古月居《ros入门21讲》学习笔记】15_ROS中的坐标系管理系统
  • 王者农药小游戏
  • MySQL 索引类型
  • html实现计算器源码
  • linux 账号管理实例一,stdin,passwd复习