Frameworkstein's Node Cache Manager store for Redis
An alternate Redis store for the node-cache-manager module.
This module is a fork of node-cache-manager-redis. It has been altered to allow storing keys in hash sets rather than on their own to allow simpler deletion of grouped keys.
Why do this? When we're caching the results of some calls to a REST API and someone updates a model we'd like to wipe the caches for that model type and its relations. Boom!
Installation
npm install cache-manager-redis --save
Usage examples
Here are examples that demonstrate how to implement the Redis cache store.
Single store
var cacheManager = require('cache-manager');
var redisStore = require('cache-manager-redis');
var redisCache = cacheManager.caching({
store: redisStore,
host: 'localhost',
port: 6379,
auth_pass: 'XXXXX',
db: 0,
ttl: 600
});
var ttl = 5;
redisCache.store.events.on('redisError', function(error) {
console.log(error);
});
redisCache.set('foo', 'bar', ttl, function(err) {
if (err) {
throw err;
}
redisCache.get('foo', function(err, result) {
console.log(result);
redisCache.del('foo', function(err) {});
});
});
function getUser(id, cb) {
setTimeout(function () {
console.log("Returning user from slow database.");
cb(null, {id: id, name: 'Bob'});
}, 100);
}
var userId = 123;
var key = 'user_' + userId;
redisCache.wrap(key, function (cb) {
getUser(userId, cb);
}, ttl, function (err, user) {
console.log(user);
redisCache.wrap(key, function (cb) {
getUser(userId, cb);
}, function (err, user) {
console.log(user);
});
});
Multi-store
var cacheManager = require('cache-manager');
var redisStore = require('cache-manager-redis');
var redisCache = cacheManager.caching({store: redisStore, db: 0, ttl: 600});
var memoryCache = cacheManager.caching({store: 'memory', max: 100, ttl: 60});
var multiCache = cacheManager.multiCaching([memoryCache, redisCache]);
userId2 = 456;
key2 = 'user_' + userId;
ttl = 5;
multiCache.set('foo2', 'bar2', ttl, function(err) {
if (err) { throw err; }
multiCache.get('foo2', function(err, result) {
console.log(result);
multiCache.del('foo2');
});
});
multiCache.wrap(key2, function (cb) {
getUser(userId2, cb);
}, ttl, function (err, user) {
console.log(user);
multiCache.wrap(key2, function (cb) {
getUser(userId2, cb);
}, function (err, user) {
console.log(user);
});
});
Using a URL instead of options (if url is correct it overrides options host, port, db, auth_pass and ttl)
Urls should be in this format redis://[:password@]host[:port][/db-number][?ttl=value]
var cacheManager = require('cache-manager');
var redisStore = require('cache-manager-redis');
var redisCache = cacheManager.caching({
store: redisStore,
url: 'redis://:XXXX@localhost:6379/0?ttl=600'
});
Tests
- Run a Redis server
- Run tests
npm test
or npm run coverage
Contribution
If you would like to contribute to the project, please fork it and send us a pull request. Please add tests for any new features or bug fixes. Also make sure the code coverage is not impacted.
License
node-cache-manager-redis
is licensed under the MIT license.