Redis Keys 命令(千字长文)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观

前言

在现代互联网应用中,Redis 作为高性能的内存数据库,因其快速的数据访问能力和丰富的数据结构,被广泛应用于缓存、消息队列、计数器等场景。而 Redis Keys 命令 是操作 Redis 的核心工具之一,它允许开发者对键(Key)进行增删查改、遍历、过期时间设置等操作。对于编程初学者和中级开发者而言,掌握 Keys 命令不仅是理解 Redis 工作原理的基础,更是高效开发分布式系统的关键技能。

本文将从零开始,通过案例和代码示例,深入浅出地讲解 Redis Keys 命令的核心功能,并结合实际场景帮助读者理解其应用价值。


一、Redis Keys 命令的核心概念

1.1 键(Key)的基本作用

在 Redis 中,键(Key)是数据存储的唯一标识符,类似于传统数据库中的表名或对象 ID。每个键对应一个值(Value),而值可以是字符串、哈希表、列表、集合等数据类型。例如,保存用户登录信息时,键可能是 "user:123:session",对应的值可能是用户会话的 JSON 数据。

形象比喻:可以将 Redis 想象成一个巨大的图书馆,而 Keys 命令就是图书管理员手中的目录系统。通过键,开发者能快速定位、修改或删除特定的“书籍”(数据)。

1.2 Keys 命令的分类

Keys 命令主要分为以下几类:

  • 基础操作:增删改查键的基本功能。
  • 遍历与模式匹配:根据特定模式查找键。
  • 过期时间管理:设置或获取键的生存时间(TTL)。
  • 批量操作:对多个键执行原子性操作。

二、Keys 命令的基础操作

2.1 创建与删除键

SETDEL 命令

SET 命令用于向 Redis 中写入键值对,而 DEL 命令用于删除指定键。

示例代码(Redis CLI)

SET username "john_doe"  

DEL username  

EXISTS 命令

EXISTS 命令用于检查键是否存在,返回 1 表示存在,0 表示不存在。

示例

EXISTS username  # 返回 1(如果键存在)  

2.2 获取与更新键值

GETGETSET 命令

GET 用于读取键的值,而 GETSET 可以同时读取旧值并设置新值。

示例

SET counter 0  
GET counter  # 返回 "0"  

GETSET counter "1"  # 返回 "0",并设置新值为 "1"  

三、高级 Keys 命令:遍历与模式匹配

3.1 KEYS 命令:按模式查找键

KEYS pattern 可以匹配符合特定模式的所有键,其中 * 表示通配符。例如:

KEYS user:*  # 查找所有以 "user:" 开头的键  

注意:在生产环境中应避免使用 KEYS,因为它可能阻塞 Redis 服务。

3.2 SCAN 命令:非阻塞的键遍历

SCANKEYS 的替代方案,通过分页遍历避免阻塞问题。

示例

SCAN 0 MATCH user:* COUNT 100  
  • COUNT 参数控制每次返回的键数量。
  • 返回值包括下一个游标和当前页的键列表,需循环调用直到游标为 0

3.3 RANDOMKEY 命令

RANDOMKEY 返回一个随机键,但若数据库为空则返回 nil。此命令常用于调试或测试场景。


四、过期时间管理:TTL 与 Expire 命令

4.1 设置键的生存时间(TTL)

EXPIREPEXPIRE

  • EXPIRE key seconds:设置键在指定秒数后过期。
  • PEXPIRE key milliseconds:以毫秒为单位设置过期时间。

示例

EXPIRE session 300  

EXPIREATPEXPIREAT

这两个命令允许直接设置过期时间戳(Unix 时间戳)。

4.2 查询剩余生存时间

TTL key 返回键剩余的存活时间(秒),若未设置过期时间则返回 -1

示例

TTL session  # 返回剩余秒数或 -1  

五、批量操作与事务

5.1 DEL 的批量删除

DEL key [key ...] 可一次删除多个键:

DEL user:1 user:2 user:3  

5.2 事务中的 Keys 操作

通过 MULTIEXEC 组合,可将多个 Keys 操作打包为原子性事务:

MULTI  
SET key1 "value1"  
SET key2 "value2"  
EXEC  

六、实际案例:用户会话管理

6.1 场景描述

假设我们需要设计一个用户登录系统的会话缓存,要求:

  1. 会话信息存储在 Redis 中。
  2. 每个会话有效期为 30 分钟。
  3. 支持快速查询和删除失效会话。

6.2 实现代码(Python 示例)

import redis  
import time  

r = redis.Redis(host='localhost', port=6379, db=0)  

def create_session(user_id):  
    session_id = f"user:{user_id}:session"  
    session_data = {"last_active": time.time()}  
    # 设置键值并设置过期时间(1800秒=30分钟)  
    r.set(session_id, str(session_data), ex=1800)  
    return session_id  

def check_session(session_id):  
    if r.exists(session_id):  
        data = eval(r.get(session_id))  
        return data["last_active"] > time.time() - 1800  
    return False  

def cleanup_expired_sessions():  
    # 使用 SCAN 遍历并删除过期会话  
    cursor = '0'  
    while True:  
        cursor, keys = r.scan(cursor=cursor, match="user:*:session", count=100)  
        if keys:  
            r.delete(*keys)  
        if cursor == '0':  
            break  

create_session(123)  
print(check_session("user:123:session"))  # True  
time.sleep(1900)  # 等待超过 30 分钟  
cleanup_expired_sessions()  

七、性能与最佳实践

7.1 避免 KEYS 命令的滥用

KEYS 在数据量大时会阻塞 Redis,导致服务不可用。推荐改用 SCAN 实现非阻塞遍历。

7.2 合理使用过期时间

  • 对临时数据(如会话、验证码)设置合理的 EXPIRE 时间,避免内存泄漏。
  • 使用 TTL 监控键的存活状态,及时处理即将过期的数据。

7.3 键名设计规范

  • 使用前缀分隔不同业务模块(如 user:*, order:*)。
  • 避免特殊字符,推荐使用 :_ 分隔命名空间。

八、结论

Redis Keys 命令是开发者与 Redis 数据库交互的核心工具。通过本文的讲解,读者已掌握了键的增删改查、模式匹配、过期时间管理等关键技能,并通过实际案例理解了其应用场景。

在实际开发中,合理使用 SCAN 替代 KEYS、结合 EXPIRE 管理数据生命周期,能显著提升 Redis 的稳定性和性能。希望本文能帮助读者在构建高效、可靠的分布式系统时,更加得心应手地运用 Redis Keys 命令。


关键词布局检查

  • Redis Keys 命令(前言、标题、案例部分自然出现)
  • Keys 命令(基础操作、高级命令部分)
  • Redis 过期时间(TTL 部分)
  • Redis 批量操作(事务章节)

最新发布