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.
		
		
		
		
		
			
		
			
				
					167 lines
				
				5.8 KiB
			
		
		
			
		
	
	
					167 lines
				
				5.8 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								# lru cache
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								A cache object that deletes the least-recently-used items.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[](https://travis-ci.org/isaacs/node-lru-cache) [](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
							 |