Skip to content

dabroek/node-cache-manager-ioredis

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

22 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

build status coverage status dependencies status npm version GitHub issues

IORedis store for node cache manager

Redis cache store for node-cache-manager.

This package is a almost identical to node-cache-manager-redis-store, but uses ioredis instead of node_redis. It aims to provide the most simple wrapper possible by just passing the configuration to the underlying ioredis package.

Installation

npm install cache-manager-ioredis --save

or

yarn add cache-manager-ioredis

Usage Examples

See examples below on how to implement the IORedis cache store.

Single store

var cacheManager = require('cache-manager');
var redisStore = require('cache-manager-ioredis');

var redisCache = cacheManager.caching({
  store: redisStore,
  host: 'localhost', // default value
  port: 6379, // default value
  password: 'XXXXX',
  db: 0,
  ttl: 600
});

// listen for redis connection error event
var redisClient = redisCache.store.getClient();

redisClient.on('error', (error) => {
  // handle error here
  console.log(error);
});

var ttl = 5;

redisCache.set('foo', 'bar', { ttl: ttl }, (err) => {
  if (err) {
    throw err;
  }

  redisCache.get('foo', (err, result) => {
    console.log(result);
    // >> 'bar'
    redisCache.del('foo', (err) => {
    });
  });
});

function getUser(id, cb) {
  setTimeout(() => {
    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, (cb) => {
  getUser(userId, cb);
}, { ttl: ttl }, (err, user) => {
  console.log(user);

  // Second time fetches user from redisCache
  redisCache
    .wrap(key, () => getUser(userId))
    .then(console.log)
    .catch(err => {
      // handle error
    });
});

Multi-store

var cacheManager = require('cache-manager');
var redisStore = require('cache-manager-ioredis');

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]);

var userId2 = 456;
var key2 = `user_${userId2}`;

// Set value in all caches
multiCache.set('foo2', 'bar2', { ttl: ttl }, (err) => {
  if (err) {
    throw err;
  }

  // Fetches from highest priority cache that has the key
  multiCache.get('foo2', (err, result) => {
    console.log(result);

    // Delete from all caches
    multiCache.del('foo2');
  });
});

// Note: ttl is optional in wrap
multiCache.wrap(key2, (cb) => {
  getUser(userId2, cb);
}, (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, (cb) => {
    getUser(userId2, cb);
  }, (err, user) => {
    console.log(user);
  });
});

Use Clustering (eg Amazon elasticache)

var cacheManager = require('cache-manager');
var redisStore = require('cache-manager-ioredis');

// https://github.com/luin/ioredis#cluster
var redisCache = cacheManager.caching({
  store: redisStore,
  clusterConfig: {
    nodes: [
      {
        port: 6380,
        host: '127.0.0.1'
      }, 
      {
        port: 6381,
        host: '127.0.0.1'
      }
    ],
    options: {
      maxRedirections: 16
    }
  }
});

Use an external Redis Instance

var cacheManager = require('cache-manager');
var redisStore = require('cache-manager-ioredis');
var Redis = require('ioredis');

var redisInstance = new Redis({
  host: 'localhost',
  port: 6379,
  db: 0,
});

var redisCache = cacheManager.caching({
  store: redisStore,
  redisInstance: redisInstance
});

Contribution

Want to help improve this package? We take pull requests.

License

The node-cache-manager-ioredis is licensed under the MIT license.