You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
166 lines
5.8 KiB
166 lines
5.8 KiB
# lru cache |
|
|
|
A cache object that deletes the least-recently-used items. |
|
|
|
[![Build Status](https://travis-ci.org/isaacs/node-lru-cache.svg?branch=master)](https://travis-ci.org/isaacs/node-lru-cache) [![Coverage Status](https://coveralls.io/repos/isaacs/node-lru-cache/badge.svg?service=github)](https://coveralls.io/github/isaacs/node-lru-cache) |
|
|
|
## Installation: |
|
|
|
```javascript |
|
npm install lru-cache --save |
|
``` |
|
|
|
## Usage: |
|
|
|
```javascript |
|
var LRU = require("lru-cache") |
|
, options = { max: 500 |
|
, length: function (n, key) { return n * 2 + key.length } |
|
, dispose: function (key, n) { n.close() } |
|
, maxAge: 1000 * 60 * 60 } |
|
, cache = new LRU(options) |
|
, otherCache = new LRU(50) // sets just the max size |
|
|
|
cache.set("key", "value") |
|
cache.get("key") // "value" |
|
|
|
// non-string keys ARE fully supported |
|
// but note that it must be THE SAME object, not |
|
// just a JSON-equivalent object. |
|
var someObject = { a: 1 } |
|
cache.set(someObject, 'a value') |
|
// Object keys are not toString()-ed |
|
cache.set('[object Object]', 'a different value') |
|
assert.equal(cache.get(someObject), 'a value') |
|
// A similar object with same keys/values won't work, |
|
// because it's a different object identity |
|
assert.equal(cache.get({ a: 1 }), undefined) |
|
|
|
cache.reset() // empty the cache |
|
``` |
|
|
|
If you put more stuff in it, then items will fall out. |
|
|
|
If you try to put an oversized thing in it, then it'll fall out right |
|
away. |
|
|
|
## Options |
|
|
|
* `max` The maximum size of the cache, checked by applying the length |
|
function to all values in the cache. Not setting this is kind of |
|
silly, since that's the whole purpose of this lib, but it defaults |
|
to `Infinity`. Setting it to a non-number or negative number will |
|
throw a `TypeError`. Setting it to 0 makes it be `Infinity`. |
|
* `maxAge` Maximum age in ms. Items are not pro-actively pruned out |
|
as they age, but if you try to get an item that is too old, it'll |
|
drop it and return undefined instead of giving it to you. |
|
Setting this to a negative value will make everything seem old! |
|
Setting it to a non-number will throw a `TypeError`. |
|
* `length` Function that is used to calculate the length of stored |
|
items. If you're storing strings or buffers, then you probably want |
|
to do something like `function(n, key){return n.length}`. The default is |
|
`function(){return 1}`, which is fine if you want to store `max` |
|
like-sized things. The item is passed as the first argument, and |
|
the key is passed as the second argumnet. |
|
* `dispose` Function that is called on items when they are dropped |
|
from the cache. This can be handy if you want to close file |
|
descriptors or do other cleanup tasks when items are no longer |
|
accessible. Called with `key, value`. It's called *before* |
|
actually removing the item from the internal cache, so if you want |
|
to immediately put it back in, you'll have to do that in a |
|
`nextTick` or `setTimeout` callback or it won't do anything. |
|
* `stale` By default, if you set a `maxAge`, it'll only actually pull |
|
stale items out of the cache when you `get(key)`. (That is, it's |
|
not pre-emptively doing a `setTimeout` or anything.) If you set |
|
`stale:true`, it'll return the stale value before deleting it. If |
|
you don't set this, then it'll return `undefined` when you try to |
|
get a stale entry, as if it had already been deleted. |
|
* `noDisposeOnSet` By default, if you set a `dispose()` method, then |
|
it'll be called whenever a `set()` operation overwrites an existing |
|
key. If you set this option, `dispose()` will only be called when a |
|
key falls out of the cache, not when it is overwritten. |
|
* `updateAgeOnGet` When using time-expiring entries with `maxAge`, |
|
setting this to `true` will make each item's effective time update |
|
to the current time whenever it is retrieved from cache, causing it |
|
to not expire. (It can still fall out of cache based on recency of |
|
use, of course.) |
|
|
|
## API |
|
|
|
* `set(key, value, maxAge)` |
|
* `get(key) => value` |
|
|
|
Both of these will update the "recently used"-ness of the key. |
|
They do what you think. `maxAge` is optional and overrides the |
|
cache `maxAge` option if provided. |
|
|
|
If the key is not found, `get()` will return `undefined`. |
|
|
|
The key and val can be any value. |
|
|
|
* `peek(key)` |
|
|
|
Returns the key value (or `undefined` if not found) without |
|
updating the "recently used"-ness of the key. |
|
|
|
(If you find yourself using this a lot, you *might* be using the |
|
wrong sort of data structure, but there are some use cases where |
|
it's handy.) |
|
|
|
* `del(key)` |
|
|
|
Deletes a key out of the cache. |
|
|
|
* `reset()` |
|
|
|
Clear the cache entirely, throwing away all values. |
|
|
|
* `has(key)` |
|
|
|
Check if a key is in the cache, without updating the recent-ness |
|
or deleting it for being stale. |
|
|
|
* `forEach(function(value,key,cache), [thisp])` |
|
|
|
Just like `Array.prototype.forEach`. Iterates over all the keys |
|
in the cache, in order of recent-ness. (Ie, more recently used |
|
items are iterated over first.) |
|
|
|
* `rforEach(function(value,key,cache), [thisp])` |
|
|
|
The same as `cache.forEach(...)` but items are iterated over in |
|
reverse order. (ie, less recently used items are iterated over |
|
first.) |
|
|
|
* `keys()` |
|
|
|
Return an array of the keys in the cache. |
|
|
|
* `values()` |
|
|
|
Return an array of the values in the cache. |
|
|
|
* `length` |
|
|
|
Return total length of objects in cache taking into account |
|
`length` options function. |
|
|
|
* `itemCount` |
|
|
|
Return total quantity of objects currently in cache. Note, that |
|
`stale` (see options) items are returned as part of this item |
|
count. |
|
|
|
* `dump()` |
|
|
|
Return an array of the cache entries ready for serialization and usage |
|
with 'destinationCache.load(arr)`. |
|
|
|
* `load(cacheEntriesArray)` |
|
|
|
Loads another cache entries array, obtained with `sourceCache.dump()`, |
|
into the cache. The destination cache is reset before loading new entries |
|
|
|
* `prune()` |
|
|
|
Manually iterates over the entire cache proactively pruning old entries
|
|
|