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一过期就删除,而定期删除 + 惰性删除 的策略

  1. 定期删除:
    Redis 每隔一段时间(默认 100 毫秒)会随机抽取部分设置了过期时间的键,检查其是否过期,若过期则删除。

  2. 惰性删除:
    否过期 —— 若已过期则立即删除,并返回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 核心原理

  1. keys禁用原因:O (N) 时间复杂度 + 单线程模型,全量扫描会阻塞服务;
  2. 过期策略:定期删除(主动清理)+ 惰性删除(按需检查),平衡内存与性能;
  3. 批量操作优势:减少网络通信的 “封装 - 分用” 开销,提升分布式场景效率。

posted on 2025-09-29 21:43  slgkaifa  阅读(14)  评论(0)    收藏  举报

导航