Redis 经常被条件反射地引入,“直接加个 Redis”,仿佛它能一劳永逸地解决性能问题。它确实是后端工程师工具箱中最有用的工具之一,但要用好它,首先得理解它到底是什么:一个内存数据结构存储,而不仅仅是一个缓存。一旦你把它看作一个快速、通用的真实数据结构存储,它能干净地解决的问题(缓存、限流、队列、会话、排行榜、锁)就不再显得杂乱无章,而是同一个思路在多场景下的应用。
这是 Redis 大师班的开篇之作,承接自 PostgreSQL 系列:Redis 通常与 Postgres 等主数据库并存,而非替代它。
内存是核心要点
Redis 将数据保存在 RAM 中。这一事实解释了它的大部分特性。从内存读取数据的速度比从磁盘读取快几个数量级,因此 Redis 操作通常在 1 毫秒以内完成,单个实例即可处理极高的请求率。这种速度正是它成为热路径默认选择的原因——在这些路径上,数据库往返会太慢。
代价在于 RAM 比磁盘更小、更贵,且易失。Redis 通过持久化选项来解决持久性问题(我们稍后会讨论),但首先要建立的心智模型是:Redis 之所以快,是因为它在内存中;你用它存储那些需要快速访问的数据,而不是作为所有数据的永久归宿。
它是数据结构存储,而非键值二进制块
常见的误解是认为 Redis 只是简单的键值存储,输入字符串,输出字符串。远不止如此。Redis 将真实的数据结构作为值存储,每种结构都有自己的命令:
- 字符串(Strings):用于简单值、计数器和缓存的二进制大对象。
- 哈希(Hashes):用于带字段的对象,例如用户记录。
- 列表(Lists):用于有序序列和简单队列。
- 集合(Sets):用于唯一集合和成员检查。
- 有序集合(Sorted sets):用于排行榜、优先级队列等排名数据。
- 此外还有流、位图、HyperLogLog、地理空间索引和概率结构。
这正是 Redis 如此通用的原因。排行榜是一个有序集合,限流器是一个带过期时间的计数器,作业队列是一个列表或流。每种结构都由 Redis 实现并提供原子操作,因此你无需自己构建即可获得相应行为。本系列后续内容将主要介绍这些结构及其支持的模式。
Redis 擅长什么
其强用例具有共同特征:快速访问瞬态数据或权威数据的廉价可重建副本。
- 缓存(Caching):存储昂贵查询或计算的结果,避免重复执行。这是最常见的用途,本系列将专门用一个模块讨论。
- 会话存储(Session storage):需要在每次请求时快速读取,且不适合放在主数据库中的用户会话。
- 限流(Rate limiting):按用户、按时间窗口统计请求次数,这正是 Redis 擅长的带过期计数器。
- 队列与作业处理(Queues and job processing):列表和流支撑了许多任务队列系统。
- 实时特性(Real-time features):排行榜、计数器、发布/订阅消息、在线状态等,都需要亚毫秒级的更新。
- 分布式协调(Distributed coordination):跨多个应用服务器的锁和信号量。
Redis 不适合什么
了解边界与了解用途同样重要。以下情况不适合使用 Redis:
- 需要将其作为关键数据的主数据库。 Redis 虽有持久化,但其模型更偏向速度,而非关系型数据库的持久性保证。订单、支付和用户账户等真相来源应使用 Postgres 等数据库,Redis 仅作为前置快速层。
- 数据无法装入内存。 Redis 将所有数据放在 RAM 中,如果数据集远超内存预算,则不适合;磁盘型数据库往往是更好的归宿。
- 需要复杂查询、联接或临时报表。 Redis 没有 SQL、联接和查询规划器。它在支持的数据结构访问模式上很快,但不适合任意查询。
反复出现的原则是:Redis 补充主数据库,而非替代它。Postgres 拥有持久、可查询的真相来源;Redis 让热路径更快。
需要带走的思维模型
把 Redis 想象成一个装满快速、原子数据结构的内存盒子,放在真实数据库旁边。当问题可以映射到其中一种结构(计数器、排名集合、队列、缓存值)时,Redis 就能干净快速地解决;当问题需要持久性、复杂查询或超出内存容量的数据时,那就是数据库的工作。构建良好的系统通常会同时使用两者,各司其职。
有了这个框架,本系列后续内容就顺理成章:先讲数据结构本身,再讲 Redis 最常见的缓存模式,接着是基础设施用途(队列、锁、限流),最后是如何在生产环境中可靠地运行 Redis。
接下来,我们将具体介绍核心数据结构,从字符串、哈希、列表、集合和有序集合的概览开始,说明每种结构适合解决的真实问题。
要点总结
- Redis 是一个内存数据结构存储,因此其操作在亚毫秒级完成,这就是它被用于热路径的原因。
- 它不是简单的键值存储,而是提供了真实的数据结构(字符串、哈希、列表、集合、有序集合等),每种结构都有原子命令。
- 强用例包括:缓存、会话、限流、队列、实时特性和分布式协调。
- Redis 补充 Postgres 等主数据库;它不是关键数据的持久、可查询真相来源。
- 当数据超出内存、需要复杂查询与联接,或需要作为关键数据的持久记录系统时,它并不合适。
常见问题
Redis 到底是什么?
Redis 是一个内存数据结构存储。它将数据保存在 RAM 中以实现亚毫秒级访问,并提供字符串、哈希、列表、集合和有序集合等真实数据结构,每种结构都有自己的原子命令,而非简单的键值存储。
Redis 只是缓存吗?
不是。缓存是其最常见的用途,但 Redis 还能支撑限流、会话存储、作业队列、排行榜、发布/订阅消息和分布式锁,因为每种场景都可以映射到其内置数据结构之一。
Redis 可以替代我的数据库吗?
对于关键数据通常不行。Redis 更注重速度,而非关系型数据库的持久性和查询能力,且所有数据都放在内存中。请将其与 Postgres 等主数据库并用:Postgres 拥有持久的真相来源,而 Redis 负责加速热路径。
Redis 为什么这么快?
因为它将数据存储在内存中,从 RAM 读取远快于从磁盘读取,因此操作通常在 1 毫秒内完成。此外,其数据结构还拥有高效、专用的命令。
什么时候不应该使用 Redis?
当数据集远大于可用内存、需要复杂查询、联接或临时报表,或需要将其作为关键数据的持久记录系统时。这些场景适合磁盘型数据库。
延伸阅读
本文最初发布于 amanksingh.com/blog/redis-what-and-why。
关于作者
Aman Kumar Singh 是印度诺伊达的团队负责人兼高级软件工程师,专注于使用 TypeScript、Next.js、NestJS、PostgreSQL 和 Redis 撰写全栈工程、系统设计和生产级 SaaS 相关内容。
- 作品集:amanksingh.com
- GitHub:amansingh1501
- LinkedIn:amansingh1597
0 Comments
Log in to join the conversation.No comments yet. Be the first to share your thoughts.