https://github.com/dial-once/node-cache-manager-redis
Node cache store for Redis
https://github.com/dial-once/node-cache-manager-redis
javascript nodejs redis redis-store
Last synced: about 1 month ago
JSON representation
Node cache store for Redis
- Host: GitHub
- URL: https://github.com/dial-once/node-cache-manager-redis
- Owner: dial-once
- License: mit
- Created: 2014-12-19T15:41:14.000Z (over 10 years ago)
- Default Branch: develop
- Last Pushed: 2019-01-16T01:40:35.000Z (over 6 years ago)
- Last Synced: 2025-04-10T03:55:23.928Z (about 1 month ago)
- Topics: javascript, nodejs, redis, redis-store
- Language: JavaScript
- Homepage:
- Size: 150 KB
- Stars: 68
- Watchers: 6
- Forks: 29
- Open Issues: 13
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
Node Cache Manager store for Redis
==================================(https://david-dm.org/dial-once/node-cache-manager-redis.svg)](https://david-dm.org/dial-once/node-cache-manager-redis)
[](http://sonar.dialonce.net/dashboard?id=node-cache-manager-redis)
[](http://sonar.dialonce.net/dashboard?id=node-cache-manager-redis)
[](http://sonar.dialonce.net/dashboard?id=node-cache-manager-redis)
[](http://proxy.dialonce.net/sonar/api/badges/measure?key=node-cache-manager-redis&metric=coverage)
[](http://sonar.dialonce.net/dashboard?id=node-cache-manager-redis)
[](http://sonar.dialonce.net/dashboard?id=node-cache-manager-redis)The Redis store for the [node-cache-manager](https://github.com/BryanDonovan/node-cache-manager) module.
Installation
------------```sh
npm install cache-manager-redis --save
```Usage examples
--------------Here are examples that demonstrate how to implement the Redis cache store.
### Single store
```js
var cacheManager = require('cache-manager');
var redisStore = require('cache-manager-redis');var redisCache = cacheManager.caching({
store: redisStore,
host: 'localhost', // default value
port: 6379, // default value
auth_pass: 'XXXXX',
db: 0,
ttl: 600
});var ttl = 5;
// listen for redis connection error event
redisCache.store.events.on('redisError', function(error) {
// handle error here
console.log(error);
});redisCache.set('foo', 'bar', { ttl: ttl }, function(err) {
if (err) {
throw err;
}redisCache.get('foo', function(err, result) {
console.log(result);
// >> 'bar'
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;// Note: ttl is optional in wrap()
redisCache.wrap(key, function (cb) {
getUser(userId, cb);
}, { ttl: ttl }, function (err, user) {
console.log(user);// Second time fetches user from redisCache
redisCache.wrap(key, function (cb) {
getUser(userId, cb);
}, function (err, user) {
console.log(user);
});
});// The del() method accepts a single key or array of keys,
// with or without a callback.
redisCache.set('foo', 'bar', function () {
redisCache.set('bar', 'baz', function() {
redisCache.set('baz', 'foo', function() {
redisCache.del('foo');
redisCache.del(['bar', 'baz'], function() { });
});
});
});// The keys() method uses the Redis SCAN command and accepts
// optional `pattern` and `options` arguments. The `pattern`
// must be a Redis glob-style string and defaults to '*'. The
// options argument must be an object and accepts a single
// `scanCount` property, which determines the number of elements
// returned internally per call to SCAN. The default `scanCount`
// is 100.
redisCache.set('foo', 'bar', function () {
redisCache.set('far', 'boo', function () {
redisCache.keys('fo*', function (err, arrayOfKeys) {
// arrayOfKeys: ['foo']
});redisCache.keys(function (err, arrayOfKeys) {
// arrayOfKeys: ['foo', 'far']
});redisCache.keys('fa*', { scanCount: 10 }, function (err, arrayOfKeys) {
// arrayOfKeys: ['far']
});
});
});```
### Multi-store
```js
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;// Sets in all caches.
multiCache.set('foo2', 'bar2', { ttl: ttl }, function(err) {
if (err) { throw err; }// Fetches from highest priority cache that has the key.
multiCache.get('foo2', function(err, result) {
console.log(result);
// >> 'bar2'// Delete from all caches
multiCache.del('foo2');
});
});// Note: ttl is optional in wrap()
multiCache.wrap(key2, function (cb) {
getUser(userId2, cb);
}, { ttl: ttl }, function (err, user) {
console.log(user);// Second time fetches user from memoryCache, since it's highest priority.
// If the data expires in the memory cache, the next fetch would pull it from
// the 'someOtherCache', and set the data in memory again.
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]`
```js
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'
});// proceed with redisCache
```### Seamless compression (currently only supports Node's built-in zlib / gzip implementation)
```js
// Compression can be configured for the entire cache.
var redisCache = cacheManager.caching({
store: redisStore,
host: 'localhost', // default value
port: 6379, // default value
auth_pass: 'XXXXX',
db: 0,
ttl: 600,
compress: true
});// Or on a per command basis. (only applies to get / set / wrap)
redisCache.set('foo', 'bar', { compress: false }, function(err) {
if (err) {
throw err;
}redisCache.get('foo', { compress: false }, function(err, result) {
console.log(result);
// >> 'bar'
redisCache.del('foo', function(err) {});
});
});// Setting the compress option to true will enable a default configuration
// for best speed using gzip. For advanced use, a configuration object may
// also be passed with implementation-specific parameters. Currently, only
// the built-in zlib/gzip implementation is supported.
var zlib = require('zlib');
var redisCache = cacheManager.caching({
store: redisStore,
host: 'localhost', // default value
port: 6379, // default value
auth_pass: 'XXXXX',
db: 0,
ttl: 600,
compress: {
type: 'gzip',
params: {
level: zlib.Z_BEST_COMPRESSION
}
}
});
```
Currently, all implementation-specific configuration parameters are passed directly to the `zlib.gzip` and `zlib.gunzip` methods. Please see the [Node Zlib documentation](https://nodejs.org/dist/latest-v6.x/docs/api/zlib.html#zlib_class_options) for available options.Tests
-----1. Run a Redis server
2. 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.