2q-cache
Version:
Imlementation of 2Q Cache Algorithm
156 lines (102 loc) • 4.36 kB
Markdown
# 2Q cache
Simple and configurable cache library for Node.js and Browser that implements 2Q Cache algorithm (http://www.vldb.org/conf/1994/P439.PDF)
This algorithm tries to preserve the most used elements, so it demonstrates better cache hit than other caches,for example, LRU (Least Recently Used) cache.
## Installation:
```
npm i 2q-cache
```
## Usage:
```javascript
const Cache2Q = require('2q-cache');
let cache = new Cache2Q(400); //sets max count of cache elems
/*
20% of size will be "in" FIFO bucket,
60% - "out" FIFO bucket,
20% - "main" LRU cache
OR
let cache = new Cache2Q[400, 440, 200] - you also can define manually sizes of each section in cache.
First element of array is size of "in" FIFO bucket,
Second - size of "out" FIFO bucket,
Third - size of "main" LRU cache
*/
```
Example with options
```javascript
const Cache2Q = require('2q-cache');
let options = {
ttl : 1000 * 60 * 60, //default time to delete elements from cache : number
stringKeys : true, // If stringKeys are true, keys of cache elements will be convert to string by JSON.stringify
ttlInMain : false, //you can disable time to delete in 'main' section of cache. It can be useful, because in main //section stored most requested cache elements
mainStorageType : 'lfu' //Type of main storage. It can be 'lru' - Least Recently Used,
//'mru' - Most Recently used,
//'lfu' - Least-Frequently used
}
let cache = new Cache2Q(400, options); //or ([100,200,250], options);
```
By default
* `cache ttl (lifetime) equals 0, so elements will not be removed by timeout`
* `stringKeys are false, so new elements are saving "as is", without using JSON.stringify`
You also can use Typescript version of 2Q cache module:
```typescript
import {Cache2Q, CacheException} from '2q-cache/ts/cache2Q';
let cache : Cache2Q = new Cache2Q(400);
```
## API
* `set(key : any, value : any, ttl : number = 0 (optional))`
Sets new pair (key, value) with lifetime (optional)
if key exists, it updates value and ttl
parameter ttl overrides default ttl settings
* `mset(Array<object {key : any, value : any, ttl : number = 0}>)`
the same as 'set', but for array of new elements
* `get(key) => value`
Returns value by presented key
if key doesn't exists, returns null
* `mget(Array<key : any>) : Array<values : any>`
the same as 'get', but for array of keys
* `has(key) => boolean`
Returns true if key exists, otherwise returns false
* `mhas(Array<key : any>) : Array<boolean>`
the same as 'has', but for array of keys
* `delete(key : any) => boolean`
deletes pair (key, value) from cache.
If element doesn't exists, returns false.
* `mdel(keys : Array<any>) : Array<boolean>`
the same as 'del', but for array of keys
* `resetTtl(key : any, ttl : number)`
resets (overrides) ttl for element by presented key.
* `mresetTtl(keys : Array<object {key : any, ttl : number}>)`
the same as 'resetTtl', but for array of keys
* `setDefaultTtl(ttl : number)`
sets default ttl.
* `setStringifyKeys(param : boolean)`
overrides default setting for stringify keys.
if stringify keys are true, keys will be converted to string by JSON.stringify
* `clear()`
Clears cache
* `alloc(size : number | Array<number>)`
Sets new size for each cache section. Parameter same as constructor parameter. Doesn't allow make max section size smaller
* `allocUnsafe(size : number | Array<number>)`
Sets new size for each cache section. Parameter same as constructor parameter . Allow make max section size smaller.
If new max size smaller than current size on some cache section, older elements will be removed.
* `getSize()`
Returns object like this:
```javascript
{
buckets : {
in : {
currentSize : 10,
maxSize : 20
},
out : {
currentSize : 0,
maxSize : 60
},
},
main : {
currentSize : 0,
maxSize : 20
}
}
```
## ROADMAP
* `Any ideas?`