lru-cache
Version, currently 1.0.34 versions
- 1.0.3latestMar 26, 2021
- 1.0.2not indexedMar 26, 2021
- 1.0.1not indexedMar 26, 2021
- 1.0.0not indexedMar 26, 2021
github.com/Nicolab/crystal-lru-cache
:gem: key/value LRU cache that supports lifecycle, global size limit and expiration time.
10 stars
0 dependents
License: MIT
Installation
# Add this to your shard.yml
dependencies:
lru-cache:
github: Nicolab/crystal-lru-cache
version: ~> 1.0.3Then run:
shards installshard.yml
- Crystal
>= 0.36.1- License
- MIT
- Author
- Nicolas Talle <dev@nicolab.net>
- Target
lru-cachefrom src/lru-cache.cr
Dependencies
Development Dependencies
- ameba*github: crystal-ameba/amebadev
README
# LRU cache
[](https://github.com/Nicolab/crystal-lru-cache/actions) [](https://github.com/Nicolab/crystal-lru-cache/releases) [](https://nicolab.github.io/crystal-lru-cache/)
:gem: Key/value LRU cache that supports lifecycle, global size limit and expiration time.
> LRU: Least Recently Used
_lru-cache_ supports lifecycle, a global item size limit and an expiration time can be set for each item independently.
If a *max_size* is defined, the LRU cache can only contain *max_size* items.
Beyond *max_size*, items are deleted from the oldest to the most recently used.
A caching system is a vital part, it must be simple to use, reliable and efficient. _lru-cache_ is battle tested 👌
## Installation
1. Add the dependency to your `shard.yml`:
```yaml
dependencies:
lru-cache:
github: nicolab/crystal-lru-cache
version: ~> 1.0.3 # Check the latest version!
```
2. Run `shards install`
## Usage
```crystal
require "lru-cache"
cache = LRUCache(String, String).new(max_size: 10_000)
cache.set("hello", "Hello Crystal!")
puts cache.get("hello") # => "Hello Crystal!"
# or
puts cache["hello"] # => "Hello Crystal!"
puts cache.has?("hello") # => true
# Time limit
cache.set("hello", "Hello Crystal!", Time.utc + 1.hour)
puts cache.expire_at "hello" # => Time.utc + 1.hour
# Deletes "hello" item
cache.delete "hello"
# Empties the cache
cache.clear
```
Lifecycle:
```crystal
require "lru-cache"
class Cache(K, V) < LRUCache(K, V)
# Optional lifecycle method to be executed after setting an item (`add!` and `set`).
private def after_set(key : K, item : Tuple(V, Time?))
puts "after_set: #{key}"
pp item
end
# Optional lifecycle method to be executed after deleting an item (`delete`).
private def after_delete(key : K, item : Tuple(V, Time?)?)
puts "after_delete: #{key}"
pp item
end
# Optional lifecycle method to be executed after clearing all the cache (`clear`).
private def after_clear
puts "after_clear"
end
end
cache = Cache(String, String).new(max_size: 10_000)
cache.set("hello", "Hello Crystal!")
cache.set("foo", "bar")
cache.delete("foo")
cache.clear
```
📘 [API doc](https://nicolab.github.io/crystal-lru-cache/)
## Development
Install dev dependencies:
```sh
shards install
```
Run:
```sh
crystal spec
```
Clean before commit:
```sh
crystal tool format
./bin/ameba
```
## Contributing
1. Fork it (https://github.com/Nicolab/crystal-lru-cache/fork)
2. Create your feature branch (`git checkout -b my-new-feature`)
3. Commit your changes (`git commit -am 'Add some feature'`)
4. Push to the branch (`git push origin my-new-feature`)
5. Create a new Pull Request
## LICENSE
[MIT](https://github.com/Nicolab/crystal-lru-cache/blob/master/LICENSE) (c) 2021, Nicolas Talle.
## Author
| [](https://github.com/sponsors/Nicolab) |
|---|
| [Nicolas Talle](https://github.com/sponsors/Nicolab) |
| [](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=PGRH4ZXP36GUC) |
Documentation
Built from the current release. The first visit to a release nobody has asked for starts its build.
Links
This release
- Version
1.0.3- Tagged
- Mar 26, 2021
- Commit
3240cf844938- Crystal
>= 0.36.1- Indexed
- yes
Dependents
No indexed shard depends on this one yet.
Repository
github.com/Nicolab/crystal-lru-cache
Metadata
- Created
- Aug 12, 2026
- Updated
- Aug 13, 2026
- Synced
- Aug 13, 2026
- Versions
- 4