UNPKG

lru-native2

Version:
116 lines (76 loc) 3.37 kB
lru-native2 =========== [![Build Status](https://travis-ci.org/d3m3vilurr/node-lru-native.svg?branch=master)](https://travis-ci.org/d3m3vilurr/node-lru-native) This is an implementation of a simple in-memory cache for node.js, supporting LRU (least-recently-used) eviction and TTL expirations. It was developed as an alternative to the (excellent) [node-lru-cache](https://github.com/isaacs/node-lru-cache) library for use with hashes with a very large number of items. V8 normally does a good job of optimizing the in-memory representation of objects, but it isn't optimized for an object that holds a huge amount of data. When you add a very large number of properties (particularly with non-integer keys) to an object, performance begins to suffer. Rather than rely on V8 to figure out what we're trying to do, `node-lru-native` is a light wrapper around `std::unordered_map` from C++11. A `std::list` is used to track accesses so we can evict the least-recently-used item when necessary. Based on the [node-hashtable](https://github.com/isaacbwagner/node-hashtable) library by Issac Wagner. # Usage Install via npm: ``` $ npm install lru-native2 ``` Then: ```javascript var LRUCache = require('lru-native2'); var cache = new LRUCache({ maxElements: 1000 }); cache.set('some-key', 42); var value = cache.get('some-key'); ``` If you'd like to tinker, you can build the extension using [node-gyp](https://github.com/TooTallNate/node-gyp): ``` $ npm install -g node-gyp $ node-gyp configure $ node-gyp build ``` # Configuration To configure the cache, you can pass a hash to the `LRUCache` constructor with the following options: ``` var cache = new LRUCache({ // The maximum number of items to add to the cache before evicting the least-recently-used item. // Default: 0, meaning there is no maximum. maxElements: 10000, // The maximum age (in milliseconds) of an item. // The item will be removed if get() is called and the item is too old. // Default: 0, meaning items will never expire. maxAge: 60000, // The initial number of items for which space should be allocated. // The cache will resize dynamically if necessary. size: 1000, // The maximum load factor for buckets in the unordered_map. // Typically you won't need to change this. maxLoadFactor: 2.0 }); ``` # API ## set(key, value) Adds the specified item to the cache with the specified key. ## get(key) Returns the item with the specified key, or `undefined` if no item exists with that key. ## remove(key) Removes the item with the specified key if it exists. ## clear() Removes all items from the cache. ## size() Returns the number of items in the cache. ## stats() Returns a hash containing internal information about the cache. ## setMaxElements(maxElements) Set the maximum number of items ## setMaxAge(maxAge) Set the maximum age (in milliseconds) of an item # Changelog - 1.2.x -- Support OSX, node 14/16 - 1.0.0 -- Update the timestamp when get a value(like common LRU cache). Added SetMaxAge(), SetMaxElements() - *forked* - 0.4.0 -- Added support for newer versions of Node via NAN - 0.3.0 -- Changed memory allocation strategy, fixed issue where remove() would do a seek through the LRU list, code cleanup - 0.2.0 -- Fixed issue where maxAge-based removal would result in a seek through the LRU list - 0.1.0 -- Initial release