https://github.com/ngkv/concurrent_lru
A concurrent LRU cache.
https://github.com/ngkv/concurrent_lru
cache concurrency lru rust
Last synced: 4 months ago
JSON representation
A concurrent LRU cache.
- Host: GitHub
- URL: https://github.com/ngkv/concurrent_lru
- Owner: ngkv
- License: mit
- Created: 2021-02-13T13:18:14.000Z (over 5 years ago)
- Default Branch: master
- Last Pushed: 2021-02-14T14:33:40.000Z (over 5 years ago)
- Last Synced: 2025-12-14T01:52:12.010Z (7 months ago)
- Topics: cache, concurrency, lru, rust
- Language: Rust
- Homepage:
- Size: 25.4 KB
- Stars: 23
- Watchers: 1
- Forks: 2
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Concurrent LRU
[![crates.io Badge]][crates.io package]
[![docs.rs Badge]][docs.rs documentation]
[![License Badge]][license]
An implementation of a concurrent LRU cache. It is designed to hold heavyweight
resources, e.g. file descriptors, disk pages. The implementation is heavily
influenced by the [LRU cache in LevelDB].
Currently there are two implementations, `unsharded` and `sharded`.
- `unsharded` is a linked hashmap protected by a big lock.
- `sharded` shards `unsharded` by key, providing better performance under
contention.
## Example
```rust,no_run
use concurrent_lru::sharded::LruCache;
use std::{fs, io};
fn read(_f: &fs::File) -> io::Result<()> {
// Maybe some positioned read...
Ok(())
}
fn main() -> io::Result<()> {
let cache = LruCache::::new(10);
let foo_handle = cache.get_or_try_init("foo".to_string(), 1, |name| {
fs::OpenOptions::new().read(true).open(name)
})?;
read(foo_handle.value())?;
drop(foo_handle); // Unpin foo file.
// Foo is in the cache.
assert!(cache.get("foo".to_string()).is_some());
// Evict foo manually.
cache.prune();
assert!(cache.get("foo".to_string()).is_none());
Ok(())
}
```
## Contribution
Contributions are welcome! Please [fork the
library](https://github.com/ngkv/concurrent_lru/fork), push changes to your
fork, and send a [pull
request](https://help.github.com/articles/creating-a-pull-request-from-a-fork/).
All contributions are shared under an MIT license unless explicitly stated
otherwise in the pull request.
## Performance
TODO
[license badge]: https://img.shields.io/badge/license-MIT-blue.svg
[crates.io badge]: https://img.shields.io/crates/v/concurrent_lru.svg
[crates.io package]: https://crates.io/crates/concurrent_lru
[documentation]: https://docs.rs/concurrent_lru
[docs.rs badge]: https://docs.rs/concurrent_lru/badge.svg
[docs.rs documentation]: https://docs.rs/concurrent_lru/
[license badge]: https://img.shields.io/badge/license-MIT-blue.svg
[license]: https://raw.githubusercontent.com/ngkv/concurrent_lru/master/LICENSE
[LRU cache in LevelDB]: https://github.com/google/leveldb/blob/master/util/cache.cc