介绍:为什么要在 Rust 中缓存?
Rust 是一种系统编程语言,以其性能和内存安全性而备受推崇。然而,即使是速度最快的程序,在重复的 I/O 操作、复杂计算或频繁的数据库查询时也可能变慢。缓存允许保存昂贵操作的结果并即时返回,这对于高负载 Web 服务、游戏引擎和实时系统至关重要。
在本文中,我们将探讨 Rust 中三种缓存方法:外部系统(Redis、Memcached)和内嵌解决方案(lru-rs、moka)。您将学习如何将它们集成到代码中,每个工具解决什么问题,以及如何为您的项目选择最佳方案。
1. 外部缓存:Redis 和 Memcached
外部缓存系统作为独立服务运行,应用程序通过网络访问它们。它们非常适合分布式系统,当多个进程或服务器需要共享缓存时。
1.1. 通过 crate redis 使用 Redis
Redis 是最流行的 in-memory store,支持复杂的数据结构(列表、集合、哈希)。在 Rust 中连接 Redis 使用 crate redis。
安装:在 Cargo.toml 中添加:
[dependencies]redis = { version = "0.25", features = ["tokio-comp"] }tokio = { version = "1", features = ["full"] }基本字符串缓存示例:
use redis::AsyncCommands;
#[tokio::main]async fn main() -> redis::RedisResult<()> { let client = redis::Client::open("redis://127.0.0.1:6379/")?; let mut con = client.get_multiplexed_async_connection().await?;
// 写入缓存,有效期 60 秒 let _: () = con.set_ex("user:42", "Alice", 60).await?; // 读取 let val: Option = con.get("user:42").await?; println!("缓存的值:{:?}", val); Ok(())} Redis 非常适合缓存会话、API 响应和任务队列。它的缺点是需要安装和维护单独的服务器。
1.2. 通过 crate memcache 使用 Memcached
Memcached 是 Redis 的更轻量级替代品,专注于简单的 key-value 存储。crate memcache 提供同步和异步 API。
使用 crate memcache 的示例:
use memcache::{Client, MemcacheError};
fn main() -> Result<(), MemcacheError> { let client = Client::connect("memcache://127.0.0.1:11211")?; client.set("counter", 100, 30)?; // TTL = 30 秒 let val: Option = client.get("counter")?; println!("值:{:?}", val); Ok(())} Memcached 在简单的 get/set 操作上比 Redis 更快,但不支持复杂的数据结构。如果您只需要“键值对”且开销最小,请选择它。
2. 内嵌缓存库
对于单进程应用程序(CLI 工具、桌面程序、游戏服务器),外部缓存过于冗余。内嵌解决方案在进程内存中运行,无需网络,且速度最快。
2.1. lru-rs — 简单的 LRU 缓存
crate lru 实现了最近最少使用(Least Recently Used)淘汰策略的缓存。非常适合缓存解析结果、配置或小型对象。
use lru::LruCache;use std::num::NonZeroUsize;
fn main() { let mut cache: LruCache = LruCache::new(NonZeroUsize::new(3).unwrap()); cache.put("a", 1); cache.put("b", 2); cache.put("c", 3); cache.put("d", 4); // "a" 将被淘汰,因为缓存已满
println!("{:?}", cache.get(&"a")); // None println!("{:?}", cache.get(&"d")); // Some(4)} 优点:极简、可预测的运行时间、线程安全(当使用