Rust中的缓存:Redis、Memcached及内置解决方案

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Rust中的缓存:Redis、Memcached及内置解决方案



缓存是优化Web应用程序和高负载系统性能的关键机制之一。在Rust生态系统中,有多种强大的库可用于组织缓存:从分布式解决方案(Redis、Memcached)到轻量级内存缓存(moka、cached)。在本文中,我们将详细分析每一种方案,提供代码示例并比较它们的性能。



1. 通过crate redis-rs使用Redis



redis-rs 是Rust中最主要且最成熟的Redis客户端。它支持所有主要功能:字符串、列表、哈希、发布/订阅、事务和集群。



安装

[dependencies]redis = { version = "0.25", features = ["tokio-comp"] }tokio = { version = "1", features = ["full"] }


示例:使用Redis进行基本缓存

use redis::{AsyncCommands, Client};use std::time::Duration;

#[tokio::main]async fn main() -> redis::RedisResult<()> { let client = Client::open("redis://127.0.0.1:6379/")?; let mut con = client.get_multiplexed_async_connection().await?;

// 设置键,TTL为60秒 con.set_ex("user:1:profile", "{\\"name\\":\\"Alice\\"}", 60).await?;

// 读取值 let data: Option<String> = con.get("user:1:profile").await?; println!("获取到: {:?}", data);

// 计数器递增 let count: i64 = con.incr("page_views", 1).await?; println!("页面浏览量: {}", count);

Ok(())}


重要特性:

  • 异步性: redis-rs 支持同步和异步(tokio/async-std)模式。
  • 管道: 命令分组以降低延迟。
  • 集群: 通过 redis::cluster 支持Redis集群。


2. 通过crate memcached-rs使用Memcached



Memcached 是一个轻量级的分布式键值存储。对于Rust,有crate memcached-rs(或 memcache)。



使用示例

use memcache::Client;

fn main() -> memcache::MemcacheResult<()> { let client = Client::connect("memcache://127.0.0.1:11211")?;

// 写入并设置TTL client.set("session:token_abc", "user_data", 30)?;

// 读取 let value: Option<String> = client.get("session:token_abc")?; println!("来自Memcached: {:?}", value);

// 删除 client.delete("session:token_abc")?;

Ok(())}


何时选择Memcached而非Redis:

  • 如果只需要简单的缓存(键值对)。
  • 如果最小延迟很重要(对于简单操作,Memcached比Redis更快)。
  • 如果不需要Redis的数据结构(列表、哈希、集合)。


3. 内置内存缓存:moka 和 cached



对于单个进程内的缓存(无需外部服务器),crate moka 和 cached 非常合适。



3.1 Moka — 高性能缓存



moka 是一个异步、线程安全的缓存,支持TTL、最大容量和淘汰策略(LRU、LFU)。



use moka::future::Cache;use std::time::Duration;

#[tokio::main]async fn main() { let cache: Cache<String, String> = Cache::builder() .max_capacity(10_000) // 最多10,000条记录 .time_to_live(Duration::from_secs(300)) // TTL 5分钟 .build();

// 插入 cache.insert("key1".to_string(), "value1".to_string()).await;

// 获取 if let Some(value) = cache.get(&"key1".to_string()).await { p

推荐