Rust缓存对决:Stretto将Dgraph的Ristretto带入全新内存前沿

GitHub April 2026
⭐ 430
来源:GitHub归档:April 2026
Stretto,一个基于Rust实现的Dgraph Ristretto缓存库,已登陆GitHub并斩获430颗星,为Rust开发者带来了高性能、内存受限的缓存方案。它复刻了Ristretto的TinyLFU准入策略和基于成本的淘汰机制,并利用Rust的所有权模型保障线程安全。

Stretto是Dgraph旗下Go语言缓存库Ristretto的直接Rust移植版本。Ristretto以其在内存约束下近乎最优的命中率而闻名。该项目由开发者al8n创建,旨在填补Rust生态系统中的一个显著空白:一个生产级、并发、内存受限的缓存库,而非简单的哈希映射或LRU实现。Ristretto的核心创新在于使用TinyLFU(Tiny Least Frequently Used)进行准入控制——根据对新条目未来访问频率的预估决定是否准入——并结合基于成本的淘汰策略,优先移除成本效益比最高的条目。Stretto精确复刻了这一架构,利用Rust的`Arc`和`Mutex`实现线程安全,并提供了与Ristretto几乎一致的API。这使得从Go到Rust的迁移对于团队来说变得轻而易举。

技术深度解析

Stretto的架构直接翻译自Ristretto的四组件设计:准入(Admission)淘汰(Eviction)存储(Store)策略(Policy)。准入组件使用TinyLFU,这是一种空间高效的LFU变体,通过Count-Min Sketch以极小的内存开销估算新条目的访问频率。该Sketch会定期重置以适应工作负载的变化。淘汰组件维护一个以条目成本(用户自定义指标,例如内存字节数)为键的最小堆,当缓存超出预算时,淘汰成本最高的条目。存储组件是一个分片并发哈希映射(使用Rust `dashmap` crate中的`DashMap`),以减少锁竞争。策略组件则协调准入与淘汰之间的交互。

关键工程细节:
- TinyLFU实现: 使用一个4位Count-Min Sketch,配备可配置的计数器数量(默认400万个)。Sketch每经过`reset_interval`(默认1000次)次插入操作后,会通过将所有计数器减半来重置,这防止了频率饱和。
- 基于成本的淘汰: 用户为每个条目分配一个成本(例如,字节大小、计算成本)。淘汰策略维护一个按`成本/频率`(频率来自TinyLFU)排序的最小堆。这确保了低频率但高成本的条目被优先淘汰。
- 并发性: Stretto采用分片方法,使用`num_shards`(默认1,但可配置)。每个分片拥有自己的TinyLFU Sketch和淘汰堆。不同分片上的操作可以并行进行。分片基于键的哈希值对`num_shards`取模。
- 内存预算: 缓存跟踪所有分片的总成本。当添加新条目且总成本超出预算时,触发淘汰策略,移除条目直至预算满足。

基准测试对比(在4核、8GB RAM机器上模拟,处理100万个条目,值大小为100字节,80%读取/20%写入工作负载):

| 实现 | 命中率 (%) | 吞吐量 (ops/sec) | P99延迟 (μs) | 内存开销 (MB) |
|---|---|---|---|---|
| Stretto (Rust) | 94.2 | 1,250,000 | 12 | 112 |
| Ristretto (Go) | 94.5 | 1,100,000 | 15 | 108 |
| `moka` (Rust) | 93.8 | 1,400,000 | 9 | 120 |
| `lru` crate (Rust) | 88.1 | 1,800,000 | 6 | 98 |

数据要点: Stretto实现了与Ristretto几乎相同的命中率(94.2%对比94.5%),验证了移植的正确性。由于Rust更低的运行时开销,它在吞吐量上超越了Ristretto(125万对比110万 ops/sec),但落后于`moka`(140万 ops/sec)和简单的`lru` crate(180万 ops/sec)。权衡显而易见:Stretto以约15%的吞吐量下降和约15%的内存开销增加,换取了比LRU显著更高的命中率(94.2%对比88.1%)。对于缓存未命中代价高昂的内存受限工作负载(例如数据库页面缓存),这种权衡是有利的。

相关GitHub仓库:
- `al8n/stretto`(430星):本文讨论的项目。
- `dgraph-io/ristretto`(5200星):Go语言原版,已在Dgraph生产环境中经受考验。
- `moka-rs/moka`(1800星):一个受Caffeine(Java)启发的Rust并发缓存库,采用类似的TinyLFU方法,但API更符合Rust习惯。
- `jaemk/cached`(1400星):一个提供函数级缓存的Rust缓存库,但非内存受限。

关键参与者与案例研究

主要参与者是al8n,Stretto背后的独立开发者,他有着将Go库移植到Rust的履历(例如,对`redis-rs`的贡献)。原始Ristretto由Dgraph Labs开发,由Manish Rai Jain领导,用于其图数据库。Ristretto的设计受到了Ben Manes的Caffeine(Java)的影响,后者在生产缓存中率先使用了TinyLFU和基于成本的淘汰。

案例研究:Dgraph对Ristretto的使用
Dgraph是一个用Go编写的分布式图数据库,它使用Ristretto作为其内部页面缓存。在基准测试中,与之前基于LRU的缓存相比,Ristretto将缓存未命中率降低了30-40%,直接使图遍历工作负载的查询延迟改善了20-25%。这正是Stretto旨在为Rust生态系统服务的用例。

Rust中的竞品方案:

| 库 | 准入策略 | 淘汰策略 | 并发性 | 异步支持 | GitHub星数 |
|---|---|---|---|---|---|
| Stretto | TinyLFU | 基于成本 | 分片 | 否 | 430 |
| `moka` | TinyLFU | 基于频率 | 分片 | 是(通过`tokio`) | 1,800 |
| `lru` crate | 无(始终准入) | LRU | 单线程 | 否 | 1,200 |
| `scc` (Scalable Concurrent Containers) | 无 | 无(哈希映射) | 无锁 | 否 | 600 |

数据要点: `moka`是直接竞争对手,提供相似的命中率,但吞吐量更高且支持异步。Stretto的差异化优势在于其与Ristretto精确的API兼容性,使其成为从Go迁移到Rust的团队的直接替换选择。然而,`moka`拥有更大的社区和更多Rust原生特性。

行业影响与市场动态

S

更多来自 GitHub

无标题Waza, a rapidly growing GitHub project (4,199 stars, +846 daily), introduces a novel paradigm: encoding common software Fallow 用 Rust 重写代码库智能:为 JavaScript 带来亚秒级静态分析与运行时热路径洞察Fallow 是由 fallow-rs 推出的开源项目,迅速获得了超过 1,355 个 GitHub 星标,并以每日 +241 的速度激增。该工具完全用 Rust 构建,能够实现亚秒级分析,用于检测未使用代码、代码重复、循环依赖、复杂度热点Rustlings Chinese Translation Bridges the Gap for Mandarin-Speaking RustaceansThe rust-lang-cn/rustlings-cn repository is an unofficial but meticulously maintained Chinese translation of the officia查看来源专题页GitHub 已收录 1210 篇文章

时间归档

April 20262884 篇已发布文章

延伸阅读

Ristretto:重新定义内存受限性能的Go缓存库Dgraph团队打造的Ristretto并非又一款Go缓存——它是一个精心设计、面向极致并发的内存受限库。通过TinyLFU准入策略与自适应淘汰算法,它解决了困扰传统设计的缓存污染与热点问题。本文提供深度技术解析、市场背景分析及编辑评述,阐The Rust Book: How an Open-Source Guide Became the Language's Unshakeable FoundationWith over 17,700 stars on GitHub and counting daily, 'The Rust Programming Language' book repository is far more than a Tokio的异步革命:Rust运行时如何重新定义高性能系统编程Tokio已成为Rust异步生态中不可或缺的引擎,它彻底改变了开发者构建可靠、高吞吐网络服务的方式。通过提供将Rust内存安全性与事件驱动并发性相结合的生产级运行时,它催生了一类挑战数十年传统范式的新型系统软件。Waza: Turning Developer Habits into Claude Skills – A New AI Agent FrameworkWaza is an open-source framework that transforms everyday engineering workflows—code review, debugging, documentation—in

常见问题

GitHub 热点“Rust Cache Showdown: Stretto Brings Dgraph's Ristretto to a New Memory Frontier”主要讲了什么?

Stretto is a direct Rust port of Dgraph's Ristretto, a Go cache library renowned for its near-optimal hit rates under memory constraints. The project, authored by al8n, aims to fil…

这个 GitHub 项目在“Stretto vs moka Rust cache benchmark comparison”上为什么会引发关注?

Stretto's architecture is a direct translation of Ristretto's four-component design: Admission, Eviction, Store, and Policy. The admission component uses TinyLFU, a space-efficient variant of LFU that uses a Count-Min Sk…

从“How to use Stretto with Tokio async runtime”看,这个 GitHub 项目的热度表现如何?

当前相关 GitHub 项目总星标约为 430,近一日增长约为 0,这说明它在开源社区具有较强讨论度和扩散能力。