掌握 Redis GET 和 SET:基本数据操作

通过这本关于 `GET` 和 `SET` 命令的综合指南,掌握 Redis 数据管理的基础知识。学习基本的字符串存储和检索,并探索必要的进阶选项,例如原子设置(`NX`/`XX`)和集成的键过期设置(`EX`/`PX`)。了解这些基本命令对于构建高性能缓存层至关重要。

34 浏览量

掌握 Redis 的 GET 和 SET:基础数据操作

Redis 以其速度和多功能性而闻名,它充当内存数据结构存储、缓存和消息代理。与 Redis 的任何交互的核心都是用于管理定义其结构的关键值对的基本命令。本文是掌握 SETGET 命令的综合指南——它们是 Redis 中数据持久化和检索的基石。

理解这两个简单而强大的命令对于构建高性能应用程序至关重要。无论您是实现简单的缓存层还是管理会话数据,有效使用 SETGET 都能确保您的 Redis 实例中的快速访问和可靠的数据处理。

Redis 的键值模型

在深入研究这些命令之前,重要的是要记住 Redis 运行在一个简单的键值存储模型上。每条数据(值)都使用唯一的标识符(键)来访问。键是字符串,而值可以是各种数据类型(字符串、列表、集合、哈希等)。SETGET 主要处理 String 数据类型,它是 Redis 中最基本和最常用的类型。

1. 设置数据:SET 命令

The SET 命令用于将值赋给一个键。如果该键已包含数据,SET 命令将覆盖现有值。其基本语法非常直接。

基本语法和用法

最简单的形式只需要键和值:

SET key value

示例:存储用户名

127.0.0.1:6379> SET user:100:name "Alice Johnson"
OK

127.0.0.1:6379> GET user:100:name
"Alice Johnson"

高级 SET 选项:NX、XX 和过期

SET 的强大之处在于其可选参数,这些参数允许进行原子条件设置和生存时间 (TTL) 管理。这些选项对于正确实现锁和缓存至关重要。

A. 条件设置(NXXX

这些选项控制设置操作何时发生,以防止意外覆盖或确保仅在键存在时才覆盖。

  • NX (Not Exists): 仅当该键存在时才设置它。这非常适合实现简单的分布式锁。
    redis SET my_lock_key some_unique_value NX

  • XX (Exists): 仅当该键已经存在时才设置它。当您确定键已填充时,此选项可用于更新特定键。
    redis SET session:token:456 new_value XX

B. 设置过期时间 (TTL)

为了管理内存并实现基于时间的缓存,您可以直接在 SET 命令中设置过期时间。这比单独设置键然后调用 EXPIRE 要高效得多。

  • EX seconds为单位设置过期时间。
  • PX milliseconds毫秒为单位设置过期时间。
  • EXAT timestamp 将过期时间设置为特定的 Unix 时间戳(秒)。
  • PXAT timestamp 将过期时间设置为特定的 Unix 时间戳(毫秒)。

示例:将键设置为在一小时(3600 秒)后过期

127.0.0.1:6379> SET cache:product:500 "Product Details" EX 3600
OK

127.0.0.1:6379> TTL cache:product:500 
(integer) 3598 

最佳实践: 缓存时,始终使用 SET key value EX N (或 PX N)。这确保即使 Redis 崩溃并重启,过期的键最终也会被清理,从而防止陈旧数据积累。

组合选项

所有选项通常可以组合用于复杂的原子操作:

# 仅在键不存在时设置它,并使其在 60 秒后过期
SET my_config_setting "active" NX EX 60

2. 检索数据:GET 命令

The GET 命令用于检索与给定键关联的字符串值。它是 Redis 执行的最快操作之一,通常在微秒内完成。

基本语法和用法

GET key

示例:检索已存储的用户名

127.0.0.1:6379> GET user:100:name
"Alice Johnson"

处理不存在的键

如果键不存在,GET 会返回一个特殊的响应,指示未找到任何内容:

127.0.0.1:6379> GET non_existent_key
(nil)

在应用程序代码中,接收 (nil) 是确定数据丢失的标准方式,通常会触发缓存未命中,此时应用程序必须从主数据源(如数据库)中获取数据,然后将其写回 Redis。

带有过期信息的检索值(带 GETEXGET

虽然基本的 GET 命令只返回值,但有时您需要知道该键是否即将过期。GETEX 命令(或在较新版本的 Redis 中结合特定标志使用 GET)可以同时返回值和剩余的生存时间 (TTL)。

然而,对于标准用法,更简单的方法是使用 GET 接着使用 TTL(如果需要检查过期时间),或者干脆依赖键自动消失。

3. 实际应用:使用 GETSET 进行缓存

GETSET 的基本用例是实现简单的缓存旁路(cache-aside)模式。

应用程序逻辑步骤:
1. 尝试检索(GET): 应用程序首先尝试使用 GET key 检索数据。
2. 缓存命中: 如果结果不是 (nil),则立即返回数据(快速)。
3. 缓存未命中: 如果结果是 (nil)
a. 应用程序从慢速主数据存储(例如 PostgreSQL)中获取数据。
b. 应用程序使用 SET key value EX [duration] 将新数据写回 Redis。
c. 然后将数据返回给用户。

此模式通过直接从内存中提供频繁访问的数据,极大地降低了延迟。

总结和后续步骤

SETGET 命令是与 Redis 数据交互的基本入口点。尽管它们看起来很简单,但 SET 的可选参数——特别是 NXXX 和过期修饰符(EXPX)——提供了构建健壮、生产级系统所需的原子控制。

关键要点:
* 使用 SET key value 进行简单写入。
* 使用 SET key value NX 防止覆盖现有数据。
* 使用 SET key value EX 3600 确保键在一小时后自动过期。
* 使用 GET key 检索数据;如果键缺失或过期,则预期返回 (nil)

一旦您熟悉了这些基本操作,就可以探索 Redis 的其他数据类型,例如哈希(HSETHGET)和列表(LPUSHRPOP),以充分释放这种强大的内存存储的潜力。