

📚️前言
🌟 本期我们将全面深入地讲解Redis中最常用的通用命令,帮助开发者更好地掌握Redis的核心操作。无论是初学者还是经验丰富的开发者,都能从本文中获得实用的Redis使用技巧。
💡 更多前沿技术分享、实战案例和深度解析,欢迎访问我的技术博客:GGBondlctrl-CSDN博客。博客持续更新Redis、分布式系统、数据库优化等热门技术内容,每周至少发布2篇干货文章。
👍 您的每一次点赞、收藏和分享,都是对我持续创作的最大动力。如果您觉得本文对您有帮助,别忘了给文章点个赞哦!
🚀 让我们直接进入正题,开始探索Redis强大的通用命令世界。本文将从基础命令介绍到高级用法,涵盖KEYS、TYPE、DEL、EXISTS等核心命令的实际应用场景和最佳实践。
在学习任何开源工具的时候,一般来说查看官方文档是比较重要的一个种方式;

在官方文档中,对于很多命令都有解释,但是小编这期只会讲解一下比较通用的命令;
中文官网:redis命令手册
get:根据我们的key来获取value
set:把key与value存储进去
redis是按照键值对的方式进行存储数据的 存储中的set与key都是字符串
但是这里的数据结构确实是字符串,但是在redis内部的编码方式来说,这里的数据机构可能不是字符串,小编下期会进行讲解
具体实现方式:
set key1 value1
那么我们可以尝试进行get这个key1的值,具体的实现方式:
get key1如下图所示:

如果此时我们获取的key是不存在的,那么此时返回的就是nil,如下图所示:

这里的nil就是与我们的null代表的意思基本是一致的~~~
是不是很简单,可以发现,在redis中的get与set就像是我们java中的哈希表一样的操作,十分简单
redis支持很多的数据结构,整体来说redis是键值对结构,但是这里支持的很多的数据结构,这里指的就是value,本身来说key一直都是string;
key 是一个固定的字符串标识符,用于唯一标识 Redis 数据库中的某个数据项。value 则可以是多种不同的数据结构类型,每种类型都有其特定的用途和操作方式。
其中类型如下所示:
字符串 哈希表 列表 集合 有序集合
操作不同数据结构,会有不同的命令;
keys用来查询当前服务器上匹配的key,通过一些特殊符号(通配符)来描述key的模样,匹配上述模样的key就会被查询出来;
具体的命令操作:
keys patternpattern:包含特殊符号的字符串,存在的意义就是去描述另外的字符串长什么样子(筛选字符串的时候)
支持的通配符如下所示:
?匹配一个字符 *匹配一个0-个或者多个任意字符 [ac]匹配ae,别的不可以进行匹配 [^e]排除E,只有E不可以进行匹配 [a-b]匹配A到B这个范围内的字符,是闭区间

具体的操作如下所示:
首先我们先设置几个键值对:

然后一一进行操作
“ ? ”统配符:keys h?llo
如下所示:

返回的key如上所示,可以发现?只匹配一个字符
“ * ”通配符:keys h*llo
如下所示:

其他的方式,大家可以自己去试一试,都是比较简单的命令
keys的时间复杂度是O(N)
在生产环境上,一般不建议使用KEYS *命令来查询Redis中所有的key。这主要是因为Redis采用单线程架构的设计特点:
KEYS *命令会扫描整个Redis数据库的所有keyredis用于缓存,但在mysql前面,万一redis被keys阻塞了,此时其他的redis操作就超时,这些请求就会直接查询数据库~~~ mysql本来查询就慢,就会导致mysql挂了~~~
exists判断key是否存在,使用命令如下:
exists key / [key...]
返回值:key存在的个数
时间复杂度:1(但是几个key就是几,并非通常意义下的O(N))
实现方式如下图所示:

当然我们也可以写成如下所示的命令:

一次判定两个keys,与分两次来进行判定
客户端和服务器之间通过网络来进行通信,一次请求,获取一次响应
分开的写法会产生更多轮次的网络通信
在网络编程中,采用分开的写法(如多次独立的请求/响应交互)会导致以下几个显著的性能问题:
删除指定的key
可以一次删除一个或者多个,返回就是删除几个,若不存在key,不会报错
del key [key...]
删除一个key就是O(1),多个key就是多个(N)
具体的命令实现如下图所示:

expire作用是指定key设置过期时间
key存活时间超过指定的值,就会自动删除
expire key second
时间复杂度O(1)
0:设置失败 1:设置成功
设定过期时间,必须针对已经存在的key设置

就可以发现,我们设置key为hello的过期时间是10秒,然后在十秒内进行获取key是可以获取到的,但是在十秒之外获取到的key就是nil了,说明这里的key已经过期了~~~
ttl:time to live
网络原理,IP协议报头中就有一个字段TTL(但是TTL不是用时间衡量的,而是用次数)
TTL key
返回值:剩余过期时间 -1:没有关联过期时间 -2表示key不存在
这里我们可以搭配我们的expire命令进行使用,具体操作如下所示:

可以发现此时的时间秒数在不断减少,直到key过期后,再次进行ttl就是-2,表示key不存在了
返回key对应的数据类型
此处返回的就是key对应的value的类型

时间复杂度是O(1)
type key
lpush key2 111 222 333lpush例如链表的头插法,此时后面的value的类型就是list
sadd key3 111 222 333:类型为set
hset key4 field1 :类型为hash
如下所示:

其他的小编不再过多的进行演示了~~~
一个redis中同时存在很多key,这些key大部分都有过期时间,redis咋知道哪些key已经过期要被删除,哪些key没有过期
此时也需要结合定期删除的操作 每次抽取一部分进行验证过期时间,保证抽取检查的过程足够快
为啥对定期删除的时间有明确的要求呢?
😀:因为redis是单线程程序,主要的任务(处理每个命令任务)如果扫描过期key消耗的时间太多了,可能导致正常处理请求命令被阻塞了
假设key已经到了过期时间了,但是暂时还没有会进行删除操作,key还存在,但后面正好用到这个key进行访问; 那么这次访问就会让redis服务器触发删除key的操作,同时返回一个nil
虽然有两种策略结合,但是整体的效果一般~~~
任然可能会有很多过期的key残留了,没有及时删除
redis对上述进行补充,提供了内存淘汰机制(这里小编还没有具体进行了解)
定时器(多线程与redis单线程背驰)
把这些key加入到一个优先级队列,指定优先级规则,那么对队=首就是最快过期的key
扫描线程,不需要遍历,只需要扫描队首元素即可
并且扫描线程的频次不能过高,可以设置等待时间(节省CPU开销)在时间到了或者新的任务添加再次进行唤醒即可
把时间划分成很多小段~~(划分的粒度,看实际需求)

尝试执行意义就是:防止时间过长,导致不同时间任务重复在一个格子中
对于时间轮来说,每个格子是多少时间,一共多少格子,都是根据实际场景灵活进行调配的~~
并且在redis原码中,比较核心的机制就是事件循环,与时间轮的方式类似
注意:上述的实现方式基于多线程方式,与redis的单线程方式背道而驰,只是一种思想
Redis通用命令详解:掌握核心操作与最佳实践
本文系统介绍了Redis最常用的通用命令,包括SET/GET基础操作、高级命令如KEYS(慎用)、EXISTS、DEL、EXPIRE/TTL以及TYPE等。重点剖析了KEYS命令在生产环境的使用风险,以及Redis的两种关键过期策略:定期删除和惰性删除的协同工作机制。文章还探讨了键值类型识别和多键批量操作技巧,为开发者提供了Redis数据管理的实用指南。通过理解这些核心命令和底层机制,开发者可以更高效地使用Redis进行数据存储和缓存管理。