Least-Recently-Used and First-In-First-Out caches for Client or Server.
import { Lru, Fifo } from 'toad-cache'
const lruCache = new Lru(max, ttl = 0)
const fifoCache = new Fifo(max, ttl = 0)
Clears the contents of the cache
Example
cache.clear()
Removes item from cache
param {String} key Item key
Example
cache.delete('myKey')
Removes items from cache
param {String[]} keys Item keys
Example
cache.deleteMany(['myKey', 'myKey2'])
Evicts the least recently used item from cache
Example
cache.evict()
Gets expiration time for cached item
param {String} key Item key
return {Mixed} Undefined or number (epoch time)
Example
const item = cache.expiresAt('myKey')
Item in "first" or "bottom" position
Example
const cache = new Lru()
cache.first // null - it's a new cache!
Gets cached item and marks it as recently used (pushes to the back of the list of the candidates for the eviction)
param {String} key Item key
return {Mixed} Undefined or Item value
Example
const item = cache.get('myKey')
Gets multiple cached items and marks them as recently used (pushes to the back of the list of the candidates for the eviction)
param {String[]} keys Item keys
return {Mixed[]} Undefined or Item values
Example
const item = cache.getMany(['myKey', 'myKey2'])
Returns an Array
of cache item keys.
return {Array} Array of keys
Example
console.log(cache.keys())
Max items to hold in cache (1000)
Example
const cache = new Lru(500)
cache.max // 500
Item in "last" or "top" position
Example
const cache = new Lru()
cache.last // null - it's a new cache!
Sets item in cache as first
param {String} key Item key
param {Mixed} value Item value
Example
cache.set('myKey', { prop: true })
Number of items in cache
Example
const cache = new Lru()
cache.size // 0 - it's a new cache!
Milliseconds an item will remain in cache; lazy expiration upon next get()
of an item
Example
const cache = new Lru()
cache.ttl = 3e4
In case you want to gather information on cache hit/miss/expiration ratio, as well as cache size and eviction statistics, you can use LruHitStatistics class:
const sharedRecord = new HitStatisticsRecord() // if you want to use single record object for all of caches, create it manually and pass to each cache
const cache = new LruHitStatistics({
cacheId: 'some-cache-id',
globalStatisticsRecord: sharedRecord,
statisticTtlInHours: 24, // how often to reset statistics. On every rotation previously accumulated data is removed
max: 1000,
ttlInMsecs: 0,
})
You can retrieve accumulated statistics from the cache, or from the record directly:
// this is the same
const statistics = sharedRecord.getStatistics()
const alsoStatistics = cache.getStatistics()
/*
{
'some-cache-id': {
'2023-04-06': {
cacheSize: 100, // how many elements does cache currently have
evictions: 5, // how many elements were evicted due to cache being at max capacity
expirations: 0, // how many elements were removed during get due to their ttl being exceeded
hits: 0, // how many times element was successfully retrieved from cache during get
emptyHits: 0, // out of all hits, how many were null, undefined or ''?
falsyHits: 0, // out of all hits, how many were falsy?
misses: 1, // how many times element was not in cache or expired during get
invalidateOne: 1, // how many times element was invalidated individually
invalidateAll: 2, // how many times entire cache was invalidated
sets: 0, // how many times new element was added
},
},
}
Note that date here reflects start of the rotation. If statistics weren't rotated yet, and another day started, it will still be counted against the day of the rotation start
*/
Copyright (c) 2023 Igor Savin
Based on tiny-lru, created by Jason Mulligan
Licensed under the MIT license.