Redis 常见数据类型之全局通用命令详解

Redis 常见数据类型(一):全局通用命令详解

Redis 作为当下最热门的高性能键值数据库,它的 5 种核心数据结构是我们开发和运维的重中之重。想要用好 Redis,先得把 "通用钥匙" 摸透 ------ 也就是对所有 key 都生效的全局命令。今天我们就从预备知识入手,把这些基础命令讲得明明白白,为后面深入学习数据结构打好地基。


一、预备知识:为什么要先学全局命令?

在正式介绍 5 种数据结构之前,了解 Redis 的全局命令、数据结构和内部编码、单线程命令处理机制,能帮我们解决两个核心痛点:

  1. 告别死记硬背:Redis 命令上百个,但很多命令逻辑高度通用,理解底层机制后,学习效率会大幅提升。

  2. 避免踩坑翻车:Redis 不是万能的,有些命令和数据结构使用不当,可能会对 Redis 服务或业务应用造成致命伤害。

Redis 的所有数据结构,本质上都是 "键值对" 中的 "值",而针对 "键" 的操作,有一套所有数据结构都通用的命令,我们一个一个来看。


二、KEYS:按模式匹配查找 key

KEYS 命令可以返回所有满足指定模式(pattern)的 key,支持通配符匹配,是批量查找 key 的利器。

通配符规则

  • ?:匹配单个字符,比如 h?llo 能匹配 hellohallohxllo

  • \*:匹配任意多个字符(包括 0 个),比如 h\*llo 能匹配 hlloheeeello

  • \[\]:匹配指定范围内的单个字符,比如 h\[ae\]llo 匹配 hellohallo,但不匹配 hillo

  • \[^\]:匹配不在指定范围内的单个字符,比如 h\[^e\]llo 匹配 hallohbllo,但不匹配 hello

  • \[a\-b\]:匹配 a 到 b 之间的单个字符,比如 h\[a\-b\]llo 匹配 hallohbllo

基础信息

  • 语法:KEYS pattern

  • 有效版本:Redis 1.0.0 及以上

  • 时间复杂度:O (N),N 为数据库中 key 的总数

  • 返回值:匹配 pattern 的所有 key 列表

使用示例

bash 复制代码
# 批量设置3个key
redis> MSET firstname Jack lastname Stuntman age 35
"OK"

# 匹配包含name的key
redis> KEYS *name*
1) "firstname"
2) "lastname"

# 匹配以a开头、后接两个字符的key
redis> KEYS a??
1) "age"

# 匹配所有key(线上环境慎用!)
redis> KEYS *
1) "age"
2) "firstname"
3) "lastname"

⚠️ 注意:KEYS \* 会遍历所有 key,在 key 数量极多的生产环境中执行,会阻塞 Redis 主线程,导致服务短暂不可用,线上环境一定要避免直接使用。


三、EXISTS:判断 key 是否存在

EXISTS 命令用来检查一个或多个 key 是否存在,是我们操作 key 前常用的前置校验命令。

基础信息

  • 语法:EXISTS key \[key \.\.\.\]

  • 有效版本:Redis 1.0.0 及以上

  • 时间复杂度:O (1)

  • 返回值:存在的 key 的数量(支持同时判断多个 key)

使用示例

bash 复制代码
# 设置一个key
redis> SET key1 "Hello"
"OK"

# 判断单个key是否存在
redis> EXISTS key1
(integer) 1  # 1表示存在

# 判断不存在的key
redis> EXISTS nosuchkey
(integer) 0  # 0表示不存在

# 同时判断多个key
redis> SET key2 "World"
"OK"
redis> EXISTS key1 key2 nosuchkey
(integer) 2  # 只有key1和key2存在,返回2

四、DEL:删除指定的 key

DEL 命令用于删除一个或多个已存在的 key,支持批量删除,执行效率很高。

基础信息

  • 语法:DEL key \[key \.\.\.\]

  • 有效版本:Redis 1.0.0 及以上

  • 时间复杂度:O (1)

  • 返回值:成功删除的 key 的数量

使用示例

bash 复制代码
# 设置两个key
redis> SET key1 "Hello"
"OK"
redis> SET key2 "World"
"OK"

# 批量删除key1、key2和不存在的key3
redis> DEL key1 key2 key3
(integer) 2  # 成功删除2个key

五、EXPIRE & TTL:给 key 设置过期时间

Redis 支持给 key 设置过期时间,到期后 key 会被自动删除,这两个命令是实现过期机制的核心。

1. EXPIRE:设置 key 的过期时间

EXPIRE 命令为指定的 key 添加秒级的过期时间(TTL,Time To Live)。

  • 语法:EXPIRE key seconds

  • 有效版本:Redis 1.0.0 及以上

  • 时间复杂度:O (1)

  • 返回值:1 表示设置成功,0 表示 key 不存在或设置失败

2. TTL:获取 key 的剩余过期时间

TTL 命令可以查询 key 的剩余过期时间(秒级)。

  • 语法:TTL key

  • 有效版本:Redis 1.0.0 及以上

  • 时间复杂度:O (1)

  • 返回值:

    • 正数:剩余的秒数

    • \-1:key 存在但没有设置过期时间

    • \-2:key 不存在

使用示例

bash 复制代码
# 设置一个key并给它设置10秒过期
redis> SET mykey "Hello"
"OK"
redis> EXPIRE mykey 10
(integer) 1

# 查看剩余过期时间
redis> TTL mykey
(integer) 10

💡 补充:EXPIRETTL 都有毫秒级的对应版本:PEXPIREPTTL,用法完全一致,只是时间单位换成毫秒。

过期机制示意图

我们可以用时间轴来理解 key 的过期过程:

Plain 复制代码
时间轴 →
|------- set key value ----|---- get key(能拿到值)----|---- Redis淘汰key(get返回nil)
           |                          |
           |-- expire key n(设置过期时间n秒)--|
  • key 设置过期时间后,会在当前时间 + 过期时间的节点被标记为过期

  • 过期的 key 不会立即被删除,Redis 会通过定期删除和惰性删除的策略清理它们


六、TYPE:查看 key 的数据类型

Redis 支持多种数据结构,TYPE 命令可以快速查看一个 key 对应的值的类型,帮我们避免命令使用错误。

基础信息

  • 语法:TYPE key

  • 有效版本:Redis 1.0.0 及以上

  • 时间复杂度:O (1)

  • 返回值:key 的数据类型,包括 none(key 不存在)、stringlistsetzsethashstream

使用示例

bash 复制代码
# 设置不同类型的key
redis> SET key1 "value"  # 字符串类型
"OK"
redis> LPUSH key2 "value"  # 列表类型
(integer) 1
redis> SADD key3 "value"  # 集合类型
(integer) 1

# 查看类型
redis> TYPE key1
"string"
redis> TYPE key2
"list"
redis> TYPE key3
"set"

七、小结:全局命令的核心价值

这几个全局命令,是我们和 Redis 交互的 "基础操作手册":

  • KEYS 帮我们批量查找 key,EXISTS 帮我们校验 key 是否存在

  • DEL 实现 key 的删除,EXPIRE/TTL 实现 key 的生命周期管理

  • TYPE 帮我们快速识别 key 的数据类型,避免命令用错

它们不仅是后续学习 5 种数据结构的热身,更是 Redis 日常运维和业务开发中高频使用的命令。下一篇我们就开始深入 Redis 最基础的数据结构 ------ 字符串(String),聊聊它的用法和应用场景。

相关推荐
Java&Develop1 小时前
pgsql 根据一个查询sql 生成 修改sql
数据库·sql
极创信息1 小时前
信创软件快速适配信创改造,实战落地思路
java·大数据·数据库·人工智能·mvc·软件工程·hibernate
@小柯555m1 小时前
MySql(高级查询--查找GPA最高值)
数据库·sql·mysql
轻刀快马1 小时前
穿透 MySQL 索引专栏 (五):【架构哲学】性能调优的终局之战:深分页灾难与千万级大表的索引设计原则
数据库·mysql·架构
DashVector1 小时前
Zvec v0.4.0 正式发布
数据库·嵌入式·ai编程
難釋懷1 小时前
Redis网络模型-用户空间和内核态空间
网络·arm开发·redis
whn19772 小时前
centos10.1上安装mysql 9.6
数据库·mysql
薪火铺子2 小时前
布隆过滤器原理与 Redis 防穿透实战
数据库·redis·缓存
网络工程小王2 小时前
【LangGraph 子图(Subgraph)详解】学习笔记
java·服务器·数据库·人工智能·langchain