redis通用命令 - 指南
文章目录
1.引言
Redis 的核心能力通过命令实现 —— 从最基础的键值对读写,到过期时间设置、数据类型查询,每一条命令都对应着分布式场景的实际需求。本文将体系梳理 Redis 的高频基础命令,拆解命令背后的性能逻辑,同时深入解析 “过期策略”“定时器原理” 等核心底层知识,帮你从 “会用” 进阶到 “懂原理”。
2.基础命令
2.1 set:存储键值对
set命令用于将键(Key)和值(Value)关联并存储到 Redis 中,语法与特性如下:
- 基本语法:
set key value - 关键特性:
- Key 和 Value 均为字符串类型,输入时可加引号(如set “user:100” “lisi”),也可不加,Redis 会自动识别;
- Redis 命令不区分大小写(如SET和set效果一致);
- 若 Key 已存在,set命令会覆盖原有的 Value。
2.2 get:获取键对应的值
get命令用于根据 Key 查询对应的 Value,语法与返回结果如下:
- 基本语法:
get key - 返回结果:
- 若 Key 存在,返回对应的 Value(字符串格式,带双引号);
- 若 Key 不存在,返回nil—— 这与编程语言中的null含义相同,但在数据结构中更常见(如 C++ 红黑树的哨兵节点也用nil表示)。
2.3 keys:按模式匹配查询键
keys命令用于根据 “模式(pattern)” 筛选符合条件的 Key,是批量查找键的核心工具。
2.3.1常用匹配规则
?:匹配任意1 个字符

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

[abcd]:仅匹配括号内的指定字符(a、b、c、d 中的任意一个)

[^e]:排除指定字符(匹配除 e 外的任意字符)

[a-e]:匹配指定范围的字符(a 到 e 之间的任意字符)

2.3.2 生产环境禁用风险
keys命令的时间复杂度为 O (N)单线程模型,若生产环境中键数量庞大(如百万级),执行keys *等全量扫描命令会阻塞服务器,导致其他客户端请求无法响应,甚至引发服务雪崩。因此,生产环境中通常禁用keys命令,替代方案为scan(渐进式扫描,不阻塞服务)。就是(N 为 Redis 中的键总数),这意味着它需扫描所有键才能筛选结果。由于 Redis
否存在就是2.4 exists:判断键
exists命令用于检查一个或多个 Key 是否存在,是判断数据有效性的常用工具。
- 基本语法:
exists key1 [key2 ...]
- 关键特性:
- 时间复杂度为 O (1),性能极高;
- 承受批量判断 ——Redis 采用 “客户端 - 服务器” 架构,所有命令均需通过网络传输,而网络通信存在 “封装 - 分用”开销(发送方从应用层到物理层封装协议头,接收方反向分用)。批量操作能减少网络交互次数,大幅提升效率,这也是 Redis 很多命令支持多参数的核心原因。
2.5 del:删除指定的键
清理无效信息的核心命令。就是del命令用于删除一个或多个 Key,
- 基本语法:
del key1 [key2 ...] - 返回值:删除key的个数
- 误删风险分析:
- 作为缓存:仅存储热点数据,误删个别键可从 MySQL 重新加载,影响较小;但批量误删会导致所有请求穿透到 MySQL,可能压垮数据库;
- 作为数据库:直接存储全量业务材料,误删会导致数据丢失,影响极大;
- 作为消息队列:误删未消费的消息会导致业务中断,需结合消息持久化判断影响。
2.6 expire:设置键的过期时间
expire命令用于给 Key 设置存活时间(单位:秒),过期后 Key 会被自动删除。
- 基本语法:
expire key seconds

- 扩展命令:pexpire key milliseconds—— 以毫秒为单位设置过期时间,适合更高精度的场景。
- 典型应用:
- 临时内容存储(验证码、临时 token);
- 分布式锁防死锁(加锁时设置过期时间,避免解锁失败导致锁永久占用)。
- 时间复杂度:O(1)。
2.7 ttl:查询键的剩余存活时间
ttl命令用于查询 Key 当前的剩余存活时间(单位:秒),是验证过期设置的常用工具。
- 基本语法:
ttl key

返回结果说明:
- 正数:剩余存活时间(秒);
- -1:Key 存在但未设置过期时间;
- -2:Key 不存在或已过期。
扩展命令:pttl key—— 以毫秒为单位返回剩余时间。
注意:此处的ttl与网络协议中的TTL(Time To Live)含义不同:IP 协议的TTL是 “跳数限制”(数据报最多经过的路由器数量),而 Redis 的ttl是 “时间限制”。
2.8 type:查询值的数据类型
- 基本语法:
type key

3.Redis 的过期策略与定时器实现
采用就是redis并不是等key一过期就删除,而定期删除 + 惰性删除 的策略
定期删除:
Redis 每隔一段时间(默认 100 毫秒)会随机抽取部分设置了过期时间的键,检查其是否过期,若过期则删除。惰性删除:
否过期 —— 若已过期则立即删除,并返回nil;若未过期则正常返回值。就是当客户端访问某个键时,Redis 才会检查该键
4.定时器实现原理
Redis 并未采用传统定时器删除过期键,但了解定时器原理能协助理解 “为何 Redis 选择现有策略”。常见的定时器实现有两种:优先级队列和时间轮。
4.1 基于优先级队列的定时器
核心结构:采用 “优先级队列(堆)” 存储待执行的过期任务,过期时间越早的任务优先级越高,队首始终是最早要过期的键。
优先级队列里多加入了一个过期后要删除的key)此时,唤醒线程,重新计算休眠时长调整时间即可。就是流程:定时器只需要分配一个线程,去检查队首是否过期即可(队首没过期,其他一定没过期),检查队首元素发现还差一定时间才过期,这时候设置一个等待,当前线程进入休眠状态,时间差不多到了再唤醒。如果线程休眠过程中,来了个新的任务(对于扫描线程来说,新任务就
4.2 基于时间轮的定时器

核心结构:类似 “时钟表盘”,将时间划分为多个均等的 “格子”(每个格子代表固定时间,如 1 秒),每个格子挂载一个任务链表;指针按固定频率转动,指向当前时间对应的格子。
当指针每走到一个格子,就会尝试执行这个格子链表上的任务,若是指定的过期时间特别长,就会沿着时间轮一直转,一定圈数后找到特定的位置。
通过时间轮的格子代表的时间可以调配,时间轮的轮子个数也是能够变的,具体情况具体分析。
5.小结
5.1 核心命令速查
| 命令 | 功能 | 时间复杂度 | 关键注意事项 |
|---|---|---|---|
| set | 存储键值对 | O(1) | 覆盖已有键的值 |
| get | 获取键对应的值 | O(1) | 不存在返回nil |
| keys | 按模式匹配查询键 | O(N) | 生产环境禁用,避免阻塞服务 |
| exists | 判断键是否存在 | O(1) | 支持批量判断,减少网络开销 |
| del | 删除指定键 | O(1) | 误删风险随应用场景变化 |
| expire | 设置键的过期时间(秒) | O(1) | 配合ttl验证过期设置 |
| ttl | 查询键的剩余存活时间(秒) | O(1) | 返回 - 1 表示未设过期,-2 表示键不存在 |
| type | 查询值的数据类型 | O(1) | 区分 Value 的不同数据结构 |
5.2 核心原理
- keys禁用原因:O (N) 时间复杂度 + 单线程模型,全量扫描会阻塞服务;
- 过期策略:定期删除(主动清理)+ 惰性删除(按需检查),平衡内存与性能;
- 批量操作优势:减少网络通信的 “封装 - 分用” 开销,提升分布式场景效率。
浙公网安备 33010602011771号