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

news/2024/11/29 8:50:42/

✅作者简介:大家好,我是小杨
📃个人主页:「小杨」的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.ppmy.cn/news/1249229.html

相关文章

【Python】获取ip

要使用Python获取IP地址,可以使用socket库中的gethostname()函数和gethostbyname()函数。 import socketdef get_ip_address():hostname socket.gethostname()ip_address socket.gethostbyname(hostname)return ip_addressip get_ip_address() print("IP地…

rss服务搭建记录

layout: post title: RSS subtitle: vps搭建RSS服务 date: 2023-11-27 author: Sprint#51264 header-img: img/post-bg-universe.jpg catalog: true tags: - 折腾 文章目录 引言RSShub-dockerRSS-radarFreshrssFluent reader获取fever api配置Fluent Reader同步 结语 引言 一个…

【Qt之QSqlRelationalDelegate】描述及使用

描述 QSqlRelationalDelegate类提供了一个委托,用于显示和编辑来自QSqlRelationalTableModel的数据。 与默认委托不同,QSqlRelationalDelegate为作为其他表的外键的字段提供了一个组合框。 要使用该类,只需在带有QSqlRelationalDelegate实例…

【Android Jetpack】ViewBinding 视图绑定

文章目录 ViewBinding使用方法1.build.gradle中开启2.代码中使用普通ActivityFragmentAdapterinclude View Binding 的传统使用方式与findViewById的区别与DataBinding的对别 ViewBinding ViewBinding是Google在2019年I/O大会上公布的一款Android视图绑定工具,在And…

【LeetCode:1670. 设计前中后队列 | 数据结构设计】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

Unity版本使用情况统计(更新至2023年10月)

本期UWA发布的内容是第十三期Unity版本使用统计,统计周期为2023年5月至2023年10月,数据来源于UWA网站(www.uwa4d.com)性能诊断提测的项目。希望给Unity开发者提供相关的行业趋势,了解近半年来哪些Unity版本的使用概率更…

代码随想录算法训练营第四十三天【动态规划part05】 | 1049. 最后一块石头的重量 II、494. 目标和、474.一和零

1049. 最后一块石头的重量 II 题目链接: 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 求解思路: 等于把石头尽量分成重量相同的两堆 动规五部曲 确定dp数组及其下标含义:容量为j的背包,最多能装…

基于springboot实现班级综合测评管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现班级综合测评管理系统演示 摘要 随着互联网技术的高速发展,人们生活的各方面都受到互联网技术的影响。现在人们可以通过互联网技术就能实现不出家门就可以通过网络进行系统管理,交易等,而且过程简单、快捷。同样的&#x…