cache-manager-redis

0.6.0 • Public • Published

Node Cache Manager store for Redis

Codacy Badge Codacy Badge Dependency Status

The Redis store for the node-cache-manager module.

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', // 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

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]

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)

// 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 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.

Package Sidebar

Install

npm i cache-manager-redis

Weekly Downloads

4,742

Version

0.6.0

License

MIT

Unpacked Size

74.5 kB

Total Files

10

Last publish

Collaborators

  • dial-once
  • jkernech
  • ky23
  • mrister