dabroek / node-cache-manager-ioredis

Redis store for node-cache-manager using IORedis.
MIT License
59 stars 29 forks source link

ttl option is ignored when constructed with an external redis instance #14

Open wbk opened 3 years ago

wbk commented 3 years ago

Example

Source

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

const redis = new Redis();

const cache = cacheManager.caching({
    store: redisStore,
    redisInstance: redis,
    ttl: 123
});

async function test() {
    await cache.set('foo', 'bar');
    console.log(await cache.ttl('foo'));
} 

test().then(process.exit);

Output (Actual)

-1

Output (Expected)

123
kodeine commented 3 years ago

Even if i set the TTL to 10 it does not expire. I had to set it like below to make it work.

cacheManager.caching({
  store: redisStore,
  host: process.env.REDIS_HOST,
  port: process.env.REDIS_PORT,
  password: process.env.REDIS_PASSWORD,
  db: 0,
  ttl: +process.env.REDIS_TTL || 10,
});
await REDIS_CACHE.set(`key`, value, 10); // setting it here does not work.
natesilva commented 3 years ago

We're seeing the same issue. As a workaround, we were able to set a default cache value like this for cluster mode:

var redisCache = cacheManager.caching({
  store: redisStore,
  clusterConfig: {
    … (various config settings) …
    options: {
      ttl: 600
    }  
  }
});

For non-cluster mode you'd add an options object to the redisInstance value instead of clusterConfig.

But ultimately I hope this gets fixed. We would prefer to set the TTL at the top level so it remains compatible with other cache stores.

Tirke commented 2 years ago

Did a rewrite of this package with top level ttl used by external Redis instance here: https://www.npmjs.com/package/@tirke/node-cache-manager-ioredis