@extensionengine/tapster
v1.0.1
Published
Cache adapter module for NodeJs
Downloads
5
Readme
Tapster
Cache adapter module for NodeJs.
Installation:
npm install @extensionengine/tapster
const { CacheManager } = require('@extensionengine/tapster');
const cache = new CacheManager({ /* ... */ });
Store providers
memory
(uses LRU)redis
(uses ioredis)- custom - use any store you want, as long as it has the same API
Usage
See examples below and in the examples directory.
Memory store
const client = new CacheManager({ store: 'memory', ttl: 10 /* seconds */ });
// If the set method is called without ttl, the default ttl will be used
await client.set('foo', 'bar');
await client.get('foo'); // bar
await client.has('foo') // true
await client.has('baz'); // false
await sleep('10s');
await client.get('foo'); // undefined
await client.has('foo') // false
// When ttl is defined, it will overwrite the default one
await client.set('foo', 'bar', 5);
await client.has('foo') // true
await sleep('5s');
await client.has('foo') // false
// ttl = 0 means no expiration time
await client.set('foo', 'bar', 0);
Redis store
const client = new CacheManager({
store: 'redis',
host: 'localhost',
port: 6379,
ttl: 10 /* seconds */
});
await client.set('foo', 'bar');
await client.get('foo'); // bar
Custom store
You can use your own custom store by creating one with the same API as the built-in memory stores (such as a memory or redis). See example.
class CustomStore { /* ... */ }
const client = new CacheManager({ store: CustomStore });
await client.set('foo', 'bar');
await client.get('foo'); // bar
Serialization
Tapster uses JSON.stringify
and JSON.parse
for data serialization.
You can optionally provide your own serialization functions to support extra data types or to serialize to something other than JSON.
const cache = new CacheManager({ serialize: JSON.stringify, deserialize: JSON.parse });
Namespaces
Namespacing cache instance enables avoiding key collisions and allows clearing only a certain namespace while using the same database.
const users = new CacheManager({ namespace: 'users' });
const cars = new CacheManager({ namespace: 'cars' });
await users.set('record-1', 'John');
await cars.set('record-1', 'Honda');
console.log('User keys: ', await users.getKeys()); // ['record-1'];
console.log(await users.get('record-1')); // John
console.log('Car keys: ', await cars.getKeys()); // ['record-1']
console.log(await cars.get('record-1')); // Honda
await users.clear();
console.log('User keys: ', await users.getKeys()); // []
console.log(await users.get('record-1')); // undefined
console.log('Car keys: ', await cars.getKeys()); // ['record-1']
console.log(await cars.get('record-1')); // Honda
Options
Common
store
(optional) - built-in store (memory
,redis
) or custom store. Default ismemory
.ttl
(optional) - time to live in seconds. Default is0
.namespace
(optional) - namespace cache instance to avoid key collisions. Default isdefault
.
Redis store
host
(required) - redis host.port
(required) - redis port.password
(optional) - redis password.
API
set(key, value, ttl)
- TTL is optional. The cache manager instance's TTL will be used if the set method is called without a ttl parameter.get(key) => value
delete(key)
has(key)
clear
- Clear all records under the certain namespacegetKeys(pattern) => keys
Supported glob-style patterns:
- h?llo matches hello, hallo and hxllo
- h*llo matches hllo and heeeello
- h[ae]llo matches hello and hallo, but not hillo
- h[^e]llo matches hallo, hbllo, ... but not hello
- h[a-b]llo matches hallo and hbllo
Tests
To run tests run:
npm t
License
Tapster is licensed under the MIT license.