redis 基本命令-17 (KEYS、EXISTS、TYPE、TTL)

Redis 基本命令:KEYS、EXISTS、TYPE、TTL

Redis 提供了一套基本命令,这些命令对于管理密钥和了解数据库中存储的数据至关重要。这些命令虽然简单,但提供了对 Redis 实例的结构和状态的重要见解。具体来说,KEYS、``EXISTS、``TYPE 和 TTL 允许您检查、验证和管理数据的生命周期。掌握这些命令是高效使用 Redis 的基础,并为更高级的作奠定了基础。

了解 KEYS 命令

KEYS 命令用于检索与指定模式匹配的键。虽然功能强大,但了解其含义至关重要,尤其是在生产环境中。

语法和用法

KEYS 命令的语法很简单:

复制代码
KEYS pattern

pattern 参数是 glob 样式的模式。以下是一些常见模式:

  • *:匹配所有内容。
  • h?llo:匹配 hello、hallo 和 hxllo。
  • h*llo:匹配 hllo、heello、hillo 和 heeeello。
  • h[ae]llo:匹配 hello 和 hallo,但不匹配 hillo。
  • h[^e]llo:匹配 hallo、hbllo、...,但不匹配 hello。
  • h[a-b]llo:匹配 hallo 和 hbllo。

例:

假设您的 Redis 数据库中有以下键:user:1000、user:1001、user:1002、product:1、product:2 和 session:123。

  • KEYS user:* 将返回 user:1000、user:1001 和 user:1002。
  • KEYS product:* 将返回 product:1 和 product:2。
  • KEYS *:* 将返回上面列出的所有键。
  • KEYS user:100? 将返回 user:1000、user:1001 和 user:1002。

性能注意事项

KEYS 命令扫描整个密钥空间,这在大型数据库上可能非常慢。这可能会阻止其他作并降低性能。 避免在生产环境中使用 KEYS。

选择:

  • SCAN: 使用 SCAN 命令,该命令提供了一种迭代方式来检索密钥。它返回一个游标,您可以使用该游标批量检索键,从而最大限度地减少对性能的影响。我们将在后面的模块中介绍 SCAN。
  • 集: 维护一个包含特定类型的所有键的单独集。当您需要检索这些键时,只需检索集的成员即可。
  • 键命名约定: 使用一致的键命名约定,以便更轻松地以编程方式识别和检索键,而无需依赖模式匹配。

使用 SCAN 的示例(简要介绍 - 后面的模块中将详细介绍):

您将迭代使用 SCAN,而不是 KEYS *:

复制代码
SCAN 0 MATCH * COUNT 10

此命令返回一个光标和一个键列表。然后,您将在下一个 SCAN 命令中使用返回的光标,直到光标为 0,这表示您已经迭代了整个键空间。

实践练习

  1. 将以下键添加到您的 Redis 数据库:user:1、user:2、product:1、order:1。
  2. 使用 KEYS 命令检索以 user: 开头的所有密钥。
  3. 使用 KEYS 命令检索包含数字 1 的所有键。
  4. 考虑如果您有数百万个键的潜在性能影响。

了解 EXISTS 命令

EXISTS 命令检查 Redis 数据库中是否存在键。如果键存在,则返回 1,如果键不存在,则返回 0。

语法和用法

复制代码
EXISTS key [key ...]

您可以在单个命令中检查是否存在多个键。

例:

复制代码
SET mykey "Hello"
EXISTS mykey  // Returns 1
EXISTS nonexistingkey // Returns 0
EXISTS mykey nonexistingkey // Returns 1 (because at least one key exists)

实际应用

  • 条件操作: 在对密钥执行作之前,使用 EXISTS 检查密钥是否存在。例如,您可能希望仅在用户配置文件已存在时才更新该配置文件。
  • 数据验证: 在尝试检索键的值之前,请使用 EXISTS 验证键是否存在。这可以防止错误并提高应用程序的稳健性。
  • 缓存: 使用 EXISTS 检查值是否已缓存,然后再从速度较慢的数据源中检索该值。

示例:条件更新

复制代码
if (redis.exists("user:123")) {
  // User exists, update their profile
  redis.hset("user:123", "name", "New Name");
} else {
  // User does not exist, create a new profile
  redis.hset("user:123", "name", "New User");
}

实践练习

  1. 设置名为 mykey 的键,其值为 myvalue。
  2. 使用 EXISTS 命令检查 mykey 是否存在。
  3. 使用 EXISTS 命令检查是否存在名为 nonexistentkey 的键。
  4. 使用 EXISTS 命令检查 mykey 和 nonexistentkey 是否都存在。

了解 TYPE 命令

TYPE 命令返回存储在给定键中的数据类型。Redis 支持多种数据类型,包括:

  • string
  • list
  • set
  • zset(排序集)
  • hash
  • stream

如果密钥不存在,则命令返回 none。

语法和用法

复制代码
TYPE key

例:

复制代码
SET mykey "Hello"
TYPE mykey // Returns "string"

LPUSH mylist "World"
TYPE mylist // Returns "list"

SADD myset "Element"
TYPE myset // Returns "set"

HSET myhash field value
TYPE myhash // Returns "hash"

ZADD myzset 1.0 element
TYPE myzset // Returns "zset"

TYPE nonexistingkey // Returns "none"

实际应用

  • 数据验证: 使用 TYPE 确保键在对键执行作之前包含预期的数据类型。这可以防止错误并确保数据完整性。
  • 调试: 使用 TYPE 在调试 Redis 应用程序的问题时检查键的数据类型。
  • 多态运算: 在某些情况下,您可能希望根据键的数据类型执行不同的作。 使用 TYPE 命令可以实现这种多态行为。

示例:数据验证

复制代码
if (redis.type("mykey") == "string") {
  // Key is a string, perform string-specific operations
  String value = redis.get("mykey");
  System.out.println("Value: " + value);
} else {
  // Key is not a string, handle the error
  System.out.println("Error: Key is not a string");
}

实践练习

  1. 设置一个名为 mykey 的键,字符串值为 myvalue。
  2. 创建一个名为 mylist 的列表,其中包含元素 item1 和 item2。
  3. 创建一个名为 myhash 的哈希,其中包含字段 field1 和 field2 以及相应的值 value1 和 value2。
  4. 使用 TYPE 命令确定 mykey、mylist、myhash 和不存在的密钥的数据类型。

了解 TTL 命令

TTL (Time To Live) 命令返回具有关联到期时间的密钥的剩余生存时间 (以秒为单位)。

语法和用法

复制代码
TTL key

返回值:

  • 正整数: 剩余生存时间(以秒为单位)。
  • -1: 密钥存在,但没有关联的过期时间。
  • -阿拉伯数字: 密钥不存在。

例:

复制代码
SET mykey "Hello" EX 10  // Set key with 10-second expiration
TTL mykey // Returns a value between 0 and 10 (depending on how much time has passed)

TTL nonexistingkey // Returns -2

SET anotherkey "World"
TTL anotherkey // Returns -1

实际应用

  • 缓存管理: 使用 TTL 监控缓存数据的过期时间,并根据需要刷新缓存。
  • 会话管理: 使用 TTL 跟踪用户会话的过期时间,并在用户处于非活动状态一段时间后自动注销。
  • 速率限制: 将 TTL 与其他命令结合使用以实现速率限制机制。

示例:缓存刷新

复制代码
if (redis.ttl("cached_data") < 60) {
  // Cache is about to expire, refresh it
  String data = retrieveDataFromDatabase();
  redis.setex("cached_data", 3600, data); // Set with 1-hour expiration
}

修改过期时间

  • EXPIRE 密钥秒: 将 key 的过期时间设置为指定的秒数。
  • PEXPIRE 密钥毫秒: 将 key 的过期时间设置为指定的毫秒数。
  • PERSIST 键: 删除密钥的过期时间,使其持久化。

例:

复制代码
SET mykey "Hello"
EXPIRE mykey 60 // Set expiration to 60 seconds
TTL mykey // Returns a value between 0 and 60

PERSIST mykey
TTL mykey // Returns -1

实践练习

  1. 设置一个名为 mykey 的键,其值为 myvalue,有效期为 30 秒。
  2. 使用 TTL 命令检查 mykey 的剩余生存时间。
  3. 使用 EXPIRE 命令将 mykey 的过期时间再延长 60 秒。
  4. 使用 PERSIST 命令从 mykey 中删除过期时间。
  5. 验证 TTL 命令现在是否为 mykey 返回 -1。

这些基本命令是与 Redis 交互的基本构建块。了解如何有效地使用它们将使您能够更有效地管理数据并构建强大的应用程序。

相关推荐
leisoo809720 分钟前
股票筹码分布怎么用获利比例成本区间与集中度实战 IG50免费开源股票数据API接口
开发语言·jvm·数据库·python·开源
字节跳动的猫27 分钟前
LikeShop 商品评价体系二开:追评、晒图审核与评价标签筛选功能开发
运维·数据结构·数据库
范中勤1 小时前
LLM 动态加载与多用户缓存架构技术文档
redis·langchain·llm·缓存架构·多用户隔离
行业研究员2 小时前
Agent Memory降低Token消耗原理解析
数据库·人工智能·oracle·腾讯云·智能体
yixun_gdas2 小时前
企业网站内容巡查的价值与方法:企业官网的合规与形象管理
数据库·内容运营
见闻小天地2 小时前
空调机房赛莱默B&G冷冻泵/冷却泵的核心技术特性分析
大数据·运维·数据库
辛迪聊物业数字化2 小时前
物业管理系统新手部署与实操指南
数据库·物联网·架构·系统架构
March.s2 小时前
MySQL 数据库原理与实战:从数据管理到 LAMP 建站全解
数据库·mysql
小小龙学IT2 小时前
Redis 源码深度解析:从常用命令到内部实现
redis·golang·开源
字节跳动的猫3 小时前
LikeShop 种草社区模块二开:笔记发布、话题广场与商品挂载实现
数据结构·数据库