Redis 获取带有前缀的键

2025 年 5 月 18 日 | 阅读 7 分钟

引言

Redis 是一种常见的可免费下载的内存结构化数据存储,可以实现为信息经纪人、数据库和缓存。Redis 以其卓越的速度以及对大量信息结构(包括电子表格、字符串、哈希码、集合和排序集合)的支持而闻名。 Redis 经常用于保存带有类似前缀的众多关键字,这使得组织数据变得更容易,并且使检索更有效。在当前的片段中,将讨论与共享类似前缀的 Redis 关键字进行通信,重点关注高效的查找和处理策略。

了解 Redis 键和前缀

键是 Redis 中用于存储和检索数据的特殊标识。在使用大型数据集时,将相似的键分组在一起并使用公共前缀通常很有帮助。例如,如果要设计一个管理用户会话的系统,则可以将与会话相关的键存储为前缀 session: 后跟一个唯一的标识符,如 session:12345。

使用前缀可以简化组织和检索相关数据的过程。但是,随着数据集越来越大,保持效率和可伸缩性需要有效地获取具有给定前缀的每个键。

Redis 属于键值存储类别,它是 NoSQL 数据库 的一个子集,通过简单的键值对技术存储数据。键值存储非常适合需要快速数据检索的用例,例如缓存、实时分析和会话管理,这得益于它们的速度和简单性。

Redis 中的基本键检索

Redis 有几个用于键管理的命令。 KEYS 命令是获取键的最基本命令;它返回符合指定模式的所有键。

例如,您可以使用以下命令获取以 session 开头的每个键

  • 此命令返回以 session: 开头的每个键。 尽管用户友好,但 KEYS 也有几个缺点。
  • 性能: 如果数据集很大,KEYS 命令的整个数据库扫描可能会很慢,并导致 Redis 服务器变得不可用。
  • 阻塞性质: KEYS 命令是阻塞的,这意味着在它完成之前,不能执行其他活动。

由于这些限制,通常不建议在具有大型数据集的生产场景中使用 KEYS。Redis 提供了替代命令,这些命令是非阻塞的,并且效率更高。

使用 Scan 进行高效的键检索

KEYS 并不是生产应用程序中 SCAN 命令的良好替代品。使用 SCAN,您可以使用基于游标的迭代器逐步搜索 Redis 数据库。此命令适用于大型数据集,因为它不会停止服务器。

基本 SCAN 语法为

  • cursor: Redis 用来记录扫描位置的指针。如果您最初将其设置为 0,则 Redis 将在每次扫描后返回一个新游标。
  • MATCH pattern: 键匹配模式。例如,要匹配以 session: 前缀开头的所有键,请使用 session:*。
  • COUNT count: 每次循环后要返回的键数的建议。请记住,Redis 可能会返回更多或更少的键;这只是一个指示。
  • 使用前缀 session: 此代码遍历每个键,以小块的形式处理它们。您可以使用 COUNT 参数管理批大小,这有助于平衡服务器负载和性能。

使用前缀管理键的高级技术

使用前缀管理键需要各种超出基本检索的复杂策略。这些包括管理复杂的模式、计数键以及删除包含特定前缀的键。

使用前缀取出键

SCAN 和 DEL 可以一起使用,以有效地删除具有特定前缀的所有键。

举个例子,请看这个:

此代码在搜索包含前缀 session: 的所有键后,分批删除键。使用此方法可以规避 KEYS 命令的性能缺点。

计算带有前缀的键

无需保留键,您可以使用 SCAN 命令通过简单地增加每个找到的键的计数器来计算具有特定前缀的键的数量

处理复杂的模式

您可能偶尔需要收集具有更复杂模式的键。Redis 匹配模式的功能支持通用的查询。例如,您可以使用:查找以 session: 前缀开头并以 : active 结尾的键。

使用此命令,您可以处理更专业的查询,因为它匹配类似于 session:12345:active 的键。

使用 Redis 模块进行增强的键管理

Redis 模块可以增加 Redis 的功能并提供更好的键管理功能。RediSearch 就是这样一个模块,它提供了更复杂的查询功能,例如全文搜索和二级索引。

RediSearch 允许您索引键,从而实现更复杂和快速的查询处理。例如,您可以索引所有会话键,然后使用不同的条件(例如状态、用户 ID 或会话长度)查询它们。

以下是使用 RediSearch 索引和搜索键的简单示例

创建索引

索引数据

查询索引

此命令产生用户 1 的所有会话键。RediSearch 的多功能性支持超出基本前缀匹配的复杂搜索。

优化 Redis 以进行键前缀管理

在 Redis 中有效管理带有前缀的键需要对资源使用和性能进行细致的评估。

以下是有关优化的提示

使用正确的数据结构

如果您的数据紧密相连,请考虑使用 Redis 哈希(HSET、HGET)而不是多个字符串键。散列可以简化键管理并减少内存使用量。

使用密钥过期

使用 EXPIRE 或 SETEX 设置键的过期时间,以便它们在经过一定时间后自动删除。特别是,这有助于会话管理。

观察并调整 Redis

使用 Redis CLI 或 Redis Insight 等工具定期检查 Redis 性能。通过调整配置选项(如保存间隔、maxmemory 和 maxmemory-policy)来优化速度。

使用 Lua 脚本进行原子操作

Redis 的 Lua 编程语言支持原子执行复杂任务。例如,您可以使用 Lua 脚本原子地删除具有特定前缀的所有键。

使用 Redis 集群进行数据分区

如果您负责大型数据集,Redis 集群可能是在多个节点上分配数据的有效工具。这可以实现更有效的扩展和密钥管理。

实际用例

让我们检查一些实际的用例,以了解使用前缀管理 Redis 键的实际应用。

会话管理

Redis 可以通过为它们添加 session: USERID 之类的会话前缀,在大型 Web 应用程序中保留单个用户会话。有效的会话检索和删除变得至关重要,尤其是在会话过期或注销的情况下。

缓存层

Redis 经常在微服务系统中用作缓存层。使用服务的名称为键添加前缀(例如 serviceA:data: 和 serviceB:data:)可以更有效地管理和删除特定服务的缓存。

设置速率限制

使用 Redis 经常实现速率限制 API。为了跟踪和实施限制,诸如 rate_limit:/api/v1/resource: USERID 之类的键可以带有 API 端点和用户 ID 的前缀。

工作场所行

作业排队系统中的 Redis 键可以带有队列名称的前缀,例如 queue:job_type:。这有助于在各种队列中有效检索和管理工作。

常见陷阱及如何避免

大型数据集的问题

使用 KEYS 等命令可能会导致性能损失,这是在使用 Redis 中的大型数据集时出现的典型问题。在生产环境中,这可能会导致延迟峰值,甚至导致中断。

性能瓶颈和延迟

优先使用 SCAN 而不是 KEYS 等非阻塞命令,以防止延迟问题。此外,如果您期望大量键,请考虑在多个 Redis 实例中对数据进行分片。

避免典型问题的最佳方法

  • 使用 SCAN 进行键检索:在生产中,始终首选 SCAN 而不是 KEYS。
  • 命名您的密钥:使用前缀可以正确地管理和排列密钥。
  • 跟踪 Redis 性能:密切关注 Redis 实例的性能,以便及早发现和解决任何问题。

结论

Redis 用户经常使用前缀管理键,这提高了数据组织和检索性能。尽管易于使用,但 KEYS 命令的速度限制使其不适用于大型数据集。或者,使用 SCAN 命令是一种更具可伸缩性和有效性的方法,用于获取带有特定前缀的键。

您可以使用这些方法和最佳实践通过前缀来有效地管理和检索 Redis 键,这将保证您的应用程序即使在数据集增长时也能保持可伸缩性和性能。

您可以使用这些方法和最佳实践,有效地管理和检索带有前缀的 Redis 键,这将确保您的应用程序即使在数据集扩展时也能保持可伸缩性和性能。


下一个主题Redis-hset-expire