Crates.io | foyer-memory |
lib.rs | foyer-memory |
version | 0.6.1 |
source | src |
created_at | 2024-03-12 06:23:15.428761 |
updated_at | 2024-07-08 05:49:24.257615 |
description | memory cache for foyer - the hybrid cache for Rust |
homepage | https://github.com/mrcroxx/foyer |
repository | https://github.com/mrcroxx/foyer |
max_upload_size | |
id | 1170183 |
size | 186,982 |
foyer aims to be a user-friendly hybrid cache lib in Rust.
foyer is inspired by Facebook/CacheLib, ben-manes/caffeine, and other projects, which is an excellent hybrid cache lib in C++. foyer is not only a 'rewrite in Rust project', but provide some features that CacheLib doesn't have for now.
Feel free to open a PR and add your projects here:
To use foyer in your project, add this line to the dependencies
section of Cargo.toml
.
foyer = "0.10"
If your project is using the nightly rust toolchain, the nightly
feature needs to be enabled.
foyer = { version = "0.10", features = ["nightly"] }
use foyer::{Cache, CacheBuilder};
fn main() {
let cache: Cache<String, String> = 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());
}
use foyer::{DirectFsDeviceOptionsBuilder, HybridCache, HybridCacheBuilder};
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let dir = tempfile::tempdir()?;
let hybrid: HybridCache<u64, String> = HybridCacheBuilder::new()
.memory(64 * 1024 * 1024)
.storage()
.with_device_config(
DirectFsDeviceOptionsBuilder::new(dir.path())
.with_capacity(256 * 1024 * 1024)
.build(),
)
.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(())
}
use std::sync::Arc;
use anyhow::Result;
use chrono::Datelike;
use foyer::{
DirectFsDeviceOptionsBuilder, FifoPicker, HybridCache, HybridCacheBuilder, LruConfig, RateLimitPicker, RecoverMode,
RuntimeConfigBuilder, TombstoneLogConfigBuilder,
};
use tempfile::tempdir;
#[tokio::main]
async fn main() -> Result<()> {
let dir = tempdir()?;
let hybrid: HybridCache<u64, String> = HybridCacheBuilder::new()
.memory(1024)
.with_shards(4)
.with_eviction_config(LruConfig {
high_priority_pool_ratio: 0.1,
})
.with_object_pool_capacity(1024)
.with_hash_builder(ahash::RandomState::default())
.with_weighter(|_key, value: &String| value.len())
.storage()
.with_device_config(
DirectFsDeviceOptionsBuilder::new(dir.path())
.with_capacity(64 * 1024 * 1024)
.with_file_size(4 * 1024 * 1024)
.build(),
)
.with_flush(true)
.with_indexer_shards(64)
.with_recover_mode(RecoverMode::Quiet)
.with_recover_concurrency(8)
.with_flushers(2)
.with_reclaimers(2)
.with_buffer_threshold(256 * 1024 * 1024)
.with_clean_region_threshold(4)
.with_eviction_pickers(vec![Box::<FifoPicker>::default()])
.with_admission_picker(Arc::new(RateLimitPicker::new(100 * 1024 * 1024)))
.with_reinsertion_picker(Arc::new(RateLimitPicker::new(10 * 1024 * 1024)))
.with_compression(foyer::Compression::Lz4)
.with_tombstone_log_config(
TombstoneLogConfigBuilder::new(dir.path().join("tombstone-log-file"))
.with_flush(true)
.build(),
)
.with_runtime_config(
RuntimeConfigBuilder::new()
.with_thread_name("foyer")
.with_worker_threads(4)
.build(),
)
.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."
);
let e = hybrid
.fetch(20230512, || async {
let value = mock().await?;
Ok(value)
})
.await?;
assert_eq!(e.key(), &20230512);
assert_eq!(e.value(), "Hello, foyer.");
hybrid.close().await.unwrap();
Ok(())
}
async fn mock() -> Result<String> {
let now = chrono::Utc::now();
if format!("{}{}{}", now.year(), now.month(), now.day()) == "20230512" {
return Err(anyhow::anyhow!("Hi, time traveler!"));
}
Ok("Hello, foyer.".to_string())
}
More examples and details can be found here.
foyer is built against the recent stable release. The minimum supported version is 1.77. The current foyer version is not guaranteed to build on Rust versions earlier than the minimum supported version.
Currently, foyer is still under heavy development.
The development state and the roadmap can be found here.
Contributions for foyer are warmly welcomed! 🥰
Don't forget to pass make fast
(which means fast check & test) locally before submitting a PR. 🚀
If you want to run a broader range of checks locally, run make full
. 🙌