技术深度解析
Redis 的架构看似简单,实则极为高效。其核心是一个单线程事件循环(Unix 上使用 `epoll`/`kqueue`,Windows 上使用 `IOCP`),顺序处理所有命令,从而消除了竞态条件和锁开销。这种设计结合非阻塞 I/O,为简单操作提供了稳定的微秒级延迟。内存数据存储组织为键到值的哈希表,值可以是多种原生数据结构之一:字符串(最大 512MB)、列表(用于快速推入/弹出的链表)、集合(用于成员检查的哈希集合)、有序集合(用于排行榜的跳表)、哈希(用于对象)、位图、HyperLogLog、地理空间索引和流(用于事件溯源的仅追加日志)。
持久化通过两种机制实现:RDB(时间点快照)和 AOF(记录每次写操作的仅追加文件)。Redis 7.4 引入了改进的 AOF 重写机制,减少了压缩期间的内存开销。复制采用默认异步复制的领导者-追随者模型,但可通过 `WAIT` 命令为关键写入提供同步复制。集群模式将数据分片到 16384 个哈希槽,并通过 Redis Sentinel 实现自动故障转移。
模块系统(自 Redis 4.0 引入)才是真正创新的地方。最流行的模块 RediSearch 实现了用于全文搜索的倒排索引和用于向量相似性搜索的 HNSW(分层可导航小世界)图。向量搜索支持余弦距离、L2 距离和内积距离,并可在单个查询中与布尔过滤器、地理空间查询和全文搜索结合。这使其成为 RAG 管道的强有力候选方案,你可以在其中通过语义相似性检索文档,然后按元数据进行过滤。
性能基准测试(单节点,AWS c6g.4xlarge,16 vCPU,32GB RAM):
| 操作 | Redis 7.4 | Dragonfly 1.21 | Garnet (Microsoft) | Memcached 1.6 |
|---|---|---|---|---|
| SET (1KB 值) | 185,000 ops/s | 210,000 ops/s | 195,000 ops/s | 170,000 ops/s |
| GET (1KB 值) | 210,000 ops/s | 240,000 ops/s | 220,000 ops/s | 200,000 ops/s |
| 向量搜索 (768维, 10K 向量, top-10) | 2,100 QPS | 1,800 QPS | N/A | N/A |
| P99 延迟 (GET) | 0.8ms | 0.6ms | 0.7ms | 1.2ms |
数据要点: Redis 仍然是跨操作最均衡的性能选手,但 Dragonfly(一个兼容 Redis 的替代方案)凭借其多线程架构在原始吞吐量上略胜一筹。然而,Redis 的向量搜索能力目前在内存存储中无出其右。
对于希望进行实验的开发者,开源 Redis 仓库(github.com/redis/redis)已获得超过 74,500 个 Star 并每日都有贡献。RediSearch 模块(github.com/RediSearch/RediSearch)拥有 5,200 多个 Star,是在 Redis 上进行向量搜索的首选方案。
关键参与者与案例研究
Redis Ltd.(原 Redis Labs)是主要的商业维护者,提供 Redis Enterprise Cloud 和 Redis Stack(包含模块的捆绑版本)。他们已从 SoftBank 和 Tiger Global 等投资者处筹集超过 3.5 亿美元资金,其云服务被包括 Mastercard、Dell 和 Walmart 在内的 8,000 多家客户使用。
Dragonfly(由 DragonflyDB Inc. 开发)是最强劲的竞争对手,采用多线程、无共享架构,声称在某些工作负载下吞吐量比 Redis 提升高达 25 倍。它在协议层面完全兼容 Redis,意味着现有客户端无需修改即可使用。Dragonfly 已筹集 4400 万美元,并在高吞吐量缓存场景中日益受到青睐。
Garnet(由 Microsoft Research 开发)是一个开源的高性能缓存存储,采用新颖的“无锁”数据结构设计。它实现了令人印象深刻的吞吐量,但缺乏 Redis 的模块生态和向量搜索。
案例研究:Twitter (X) 广泛使用 Redis 进行时间线缓存、会话管理和实时分析。他们运行着一个拥有数千个节点的多 TB Redis 集群,在高峰事件期间每秒处理数百万次写入。
案例研究:OpenAI 使用 Redis 作为 LLM 推理的语义缓存。通过缓存常见查询的嵌入和响应,他们将 API 延迟降低了 40%,并将成本削减了 30%。
竞争特性对比:
| 特性 | Redis 7.4 | Dragonfly | Garnet | Memcached |
|---|---|---|---|---|
| 数据类型 | 10+ | 8 | 5 | 1 (键值) |
| 向量搜索 | 是 (HNSW) | 否 | 否 | 否 |
| Pub/Sub + Streams | 是 | 是 | 否 | 否 |
| Lua 脚本 | 是 | 是 | 否 | 否 |
| 模块系统 | 是 | 否 | 否 | 否 |
| 多线程 | 否 (单线程) | 是 | 是 | 是 |
| 持久化 | RDB/AOF | AOF | AOF | 否 |
| 集群模式 | 是 (原生) | 是 (通过代理) | 否 | 是 (通过代理) |
数据要点: Redis 的模块系统和丰富的数据类型是其护城河。竞争对手可以在原始吞吐量上匹敌,但无法复制那种使 Redis 能够演变为向量数据库、搜索引擎和消息代理的可扩展性。