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

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

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

了解 KEYS 命令

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

语法和用法

KEYS 命令的语法很简单:

复制代码
KEYS pattern

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

  • *:匹配所有内容。
  • h?llo:匹配 hellohallohxllo
  • h*llo:匹配 hlloheellohilloheeeello
  • h[ae]llo:匹配 hellohallo,但不匹配 hillo
  • h[^e]llo:匹配 hallohbllo、...,但不匹配 hello
  • h[a-b]llo:匹配 hallohbllo

例:

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

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

性能注意事项

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

选择:

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

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

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

复制代码
SCAN 0 MATCH * COUNT 10

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

实践练习

  1. 将以下键添加到您的 Redis 数据库:user:1user:2product:1order: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 命令检查 mykeynonexistentkey 是否都存在。

了解 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 的列表,其中包含元素 item1item2
  3. 创建一个名为 myhash 的哈希,其中包含字段 field1field2 以及相应的值 value1value2
  4. 使用 TYPE 命令确定 mykeymylistmyhash 和不存在的密钥的数据类型。

了解 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 交互的基本构建块。了解如何有效地使用它们将使您能够更有效地管理数据并构建强大的应用程序。

相关推荐
郑州光合科技余经理15 分钟前
PHP构建:支撑欧美澳市场的同城生活服务平台开发
java·开发语言·数据库·uni-app·php·排序算法·生活
JIngJaneIL9 小时前
基于springboot + vue古城景区管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
微学AI9 小时前
复杂时序场景的突围:金仓数据库是凭借什么超越InfluxDB?
数据库
廋到被风吹走9 小时前
【数据库】【Redis】定位、优势、场景与持久化机制解析
数据库·redis·缓存
有想法的py工程师11 小时前
PostgreSQL + Debezium CDC 踩坑总结
数据库·postgresql
Nandeska11 小时前
2、数据库的索引与底层数据结构
数据结构·数据库
小卒过河010411 小时前
使用apache nifi 从数据库文件表路径拉取远程文件至远程服务器目的地址
运维·服务器·数据库
过期动态11 小时前
JDBC高级篇:优化、封装与事务全流程指南
android·java·开发语言·数据库·python·mysql
Mr.朱鹏11 小时前
SQL深度分页问题案例实战
java·数据库·spring boot·sql·spring·spring cloud·kafka
一位代码11 小时前
mysql | 常见日期函数使用及格式转换方法
数据库·mysql