摘要:在计算机程序和系统中,缓存是十分常用的性能优化手段和工具。各个主流的编程语言都实现了不同的缓存库,来实现本地的数据缓存,而在 Rust 语言中,Foyer 库就提供了优秀的缓存实现,它更是实现了混合缓存,能够无缝集成使用不同存储介质的缓存,具有很强的灵活性。
在计算机程序和系统中,缓存是十分常用的性能优化手段和工具。各个主流的编程语言都实现了不同的缓存库,来实现本地的数据缓存,而在 Rust 语言中,Foyer 库就提供了优秀的缓存实现,它更是实现了混合缓存,能够无缝集成使用不同存储介质的缓存,具有很强的灵活性。
Foyer 是一个 Rust 语言编写的混合缓存库,其代码仓库位于 https://github.com/foyer-rs/foyer。该项目旨在为 Rust 开发者提供一个功能强大、易于使用的缓存解决方案,支持多种缓存算法的灵活切换,同时结合了内存缓存和磁盘缓存的优势,能够满足不同场景下的数据存储和访问需求。
Foryer 功能强大,有以下特色功能:
混合缓存:无缝集成了内存缓存和磁盘缓存,以实现最佳的性能和灵活性即插即用算法:为用户提供各种即插即用易于替换的缓存算法,确保能适应各种不同的使用场景支持高并发:Foryer 采用了强大的线程安全机制,能够处理高并发情况,保证在高负载下的可靠性能零拷贝内存缓存抽象:借助 Rust 强大的类型系统,Foyer 中的内存缓存通过零拷贝抽象,实现了更优的性能开发者友好:提供了简单直观的 API,使缓存集成变得轻松,上手门槛低开箱即用的监控能力:只需一行代码,即可集成 Prometheus、Grafana、OpenTelemetry 和 Jaeger 等流行的监控系统Foyer 是一个 Rust 库,使用前首先把其添加到 Rust 项目中 Cargo.toml 的 dependencies 部分:
foyer = "0.14"如果需要使用 nightly 版本体验新功能,需要打开 nightly 特性:
foyer = { version = "0.14", features = ["nightly"] }Foyer 提供了开箱即用的基于内存的缓存,使用 CacheBuild 进行构建:
use foyer::{Cache, CacheBuilder};fn main { let cache: Cache = CacheBuilder::new(16).build; let entry = cache.insert("hello".to_string, "world".to_string); let e = cache.get("hello").unwrap; assert_eq!(entry.value, e.value);}这个例子中就构建了一个容量为 16 的缓存,默认使用 w-TinyLFU 算法。可以向缓存中插入 k-v 对,然后从中取出值。
Foyer 的内存缓存是一个分片的设计,可以通过配置合适的分片数,或更合理的哈希算法,来规避可能存在的数据不均衡问题:
let cache: Cache = CacheBuilder::new(1024) .with_shards(64) .build;let cache: Cache = CacheBuilder::new(1024) .with_hash_builder(CustomizedRandomState::default) .build;Foyer 最主要的特色功能就是混合缓存了,可以使用 HybridCacheBuilder 进行构建:
use foyer::{DirectFsDeviceOptions, Engine, HybridCache, HybridCacheBuilder};#[tokio::main]async fn main -> anyhow::Result { let dir = tempfile::tempdir?; let hybrid: HybridCache = HybridCacheBuilder::new .memory(64 * 1024 * 1024) .storage(Engine::Large) // use large object disk cache engine only .with_device_options(DirectFsDeviceOptions::new(dir.path).with_capacity(256 * 1024 * 1024)) .build .await?; hybrid.insert(42, "The answer to life, the universe, and everything.".to_string); assert_eq!( hybrid.get(&42).await?.unwrap.value, "The answer to life, the universe, and everything." ); Ok()}以上的例子中,缓存既使用了默认的内存,也使用了位于磁盘的文件系统上的一个临时文件夹。它的使用方式与纯内存缓存基本一致,进行了很好的抽象,易于使用。
这里的存储使用了 Engine::Large,这是针对单个缓存项大于2 KiB的场景的。单条缓存数据过大,在纯内存场景下会占据大量珍贵的内存,而使用混合缓存,利用磁盘针对此类数据进行分级存储,则更为适合。
Foyer 作为一个 Rust 编写的缓存库,具有丰富的功能和良好的性能。其即插即用缓存算法和混合缓存设计,使得开发者可以根据不同的业务需求灵活配置缓存策略,提高系统的性能和稳定性。同时,详细的性能监控和追踪功能也为开发者提供了便利,能够及时发现和解决缓存使用过程中出现的问题。
Foyer 可以广泛应用于各种场景,在 Web 开发中,可以使用 Foyer 来缓存数据库查询结果、API 响应数据等,减少数据库的访问压力,提高网站的响应速度;在分布式系统中,Foyer 可以作为节点间的数据缓存,提高数据的共享和访问效率。
来源:每日开源代码