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 |