
Company News
/Security News
Socket Selected for OpenAI's Cybersecurity Grant Program
Socket is an initial recipient of OpenAI's Cybersecurity Grant Program, which commits $10M in API credits to defenders securing open source software.
@cacheable/node-cache
Advanced tools
Simple and Maintained fast Node.js caching
@cacheable/node-cache is compatible with the node-cache package with regular maintenance and additional functionality (async/await and storage adapters). The only thing not implemented is the enableLegacyCallbacks option and functions. If you need them we are happy to take a PR to add them.
node-cache using {NodeCache}{NodeCacheStore}{NodeCacheStore}Note: NodeCache is ready and available for use. NodeCacheStore is in progress and will be available soon. Please do not use it until it is released.
npm install @cacheable/node-cache --save
import {NodeCache} from '@cacheable/node-cache';
const cache = new NodeCache();
cache.set('foo', 'bar');
cache.get('foo'); // 'bar'
import {NodeStorageCache} from '@cacheable/node-cache';
import {Keyv} from 'keyv';
import {KeyvRedis} from '@keyv/redis';
const storage = new Keyv({store: new KeyvRedis('redis://user:pass@localhost:6379')});
const cache = new NodeStorageCache(storage);
// with storage you have the same functionality as the NodeCache but will be using async/await
await cache.set('foo', 'bar');
await cache.get('foo'); // 'bar'
// if you call getStats() this will now only be for the single instance of the adapter as it is in memory
cache.getStats(); // {hits: 1, misses: 1, keys: 1, ksize: 2, vsize: 3}
The NodeCacheStore is a class that extends the NodeCache and adds the ability to use storage adapters. This is based on the cacheable engine and allows you to do layer 1 and layer 2 caching. The storage adapters are based on the Keyv package. This allows you to use any of the storage adapters that are available.
import {NodeCacheStore} from '@cacheable/node-cache';
const cache = new NodeCacheStore();
cache.set('foo', 'bar');
cache.get('foo'); // 'bar'
When initializing the cache you can pass in the options below:
export type NodeCacheStoreOptions = {
ttl?: number; // The standard ttl as number in milliseconds for every generated cache element. 0 = unlimited
primary?: Keyv; // The primary storage adapter
secondary?: Keyv; // The secondary storage adapter
maxKeys?: number; // Default is 0 (unlimited). If this is set it will throw and error if you try to set more keys than the max.
};
Note: the ttl is now in milliseconds and not seconds like stdTTL in NodeCache. You can learn more about using shorthand also in the cacheable documentation. as it is fulling supported. Here is an example:
const cache = new NodeCacheStore({ttl: 60000 }); // 1 minute as it defaults to milliseconds
cache.set('foo', 'bar', '1h'); // 1 hour
cache.set('longfoo', 'bar', '1d'); // 1 day
set(key: string | number, value: any, ttl?: number): Promise<boolean> - Set a key value pair with an optional ttl (in milliseconds). Will return true on success. If the ttl is not set it will default to 0 (no ttl)mset(data: Array<NodeCacheItem>): Promise<boolean> - Set multiple key value pairs at onceget<T>(key: string | number): Promise<T> - Get a value from the cache by keymget(keys: Array<string | number>): Promise<Record<string, unknown>> - Get multiple values from the cache by keystake<T>(key: string | number): Promise<T> - Get a value from the cache by key and delete itdel(key: string | number): Promise<boolean> - Delete a keymdel(keys: Array<string | number>): Promise<boolean> - Delete multiple keysclear(): Promise<void> - Clear the cachesetTtl(key: string | number, ttl: number): Promise<boolean> - Set the ttl of a keydisconnect(): Promise<void> - Disconnect the storage adaptersstats: NodeCacheStats - Get the stats of the cachettl: number | string - The standard ttl as number in seconds for every generated cache element. < 0 or undefined = unlimitedprimary: Keyv - The primary storage adaptersecondary: Keyv - The secondary storage adaptermaxKeys: number - If this is set it will throw and error if you try to set more keys than the maxconstructor(options?: NodeCacheOptions)Create a new cache instance. You can pass in options to set the configuration:
export type NodeCacheOptions = {
stdTTL?: number; // The standard ttl as number in seconds for every generated cache element. 0 = unlimited
checkperiod?: number; // Default is 600, 0 means no periodic check
useClones?: boolean; // Default is true
deleteOnExpire?: boolean; // Default is true, if this is set to true it will delete the key when it expires.
maxKeys?: number; // Default is -1 (unlimited). If this is set it will throw and error if you try to set more keys than the max.
};
When initializing the cache you can pass in the options to set the configuration like the example below where we set the stdTTL to 10 seconds and checkperiod to 5 seconds.:
const cache = new NodeCache({stdTTL: 10, checkperiod: 5});
When setting deleteOnExpire to true it will delete the key when it expires. If you set it to false it will keep the key but the value on get() will be undefined. You can manage the key with on('expired') event.
const cache = new NodeCache({deleteOnExpire: false});
cache.on('expired', (key, value) => {
console.log(`Key ${key} has expired with value ${value}`);
});
.set(key: string | number, value: any, ttl?: number): booleanSet a key value pair with an optional ttl (in seconds). Will return true on success. If the ttl is not set it will default to 0 (no ttl).
cache.set('foo', 'bar', 10); // true
.mset(data: Array<NodeCacheItem>): booleanSet multiple key value pairs at once. This will take an array of objects with the key, value, and optional ttl.
cache.mset([{key: 'foo', value: 'bar', ttl: 10}, {key: 'bar', value: 'baz'}]); // true
the NodeCacheItem is defined as:
export type NodeCacheItem = {
key: string;
value: any;
ttl?: number;
};
.get(key: string | number): anyGet a value from the cache by key. If the key does not exist it will return undefined.
cache.get('foo'); // 'bar'
mget(keys: Array<string | number>): Record<string, unknown>Get multiple values from the cache by keys. This will return an object with the keys and values.
const obj = { my: 'value', my2: 'value2' };
const obj2 = { special: 'value3', life: 'value4' };
cache.set('my', obj);
cache.set('my2', obj2);
cache.mget(['my', 'my2']); // { my: { my: 'value', my2: 'value2' }, my2: { special: 'value3', life: 'value4' } }
take(key: string | number): anyGet a value from the cache by key and delete it. If the key does not exist it will return undefined.
cache.set('foo', 'bar');
cache.take('foo'); // 'bar'
cache.get('foo'); // undefined
del(key: string | number | Array<string | number>): numberDelete a key from the cache. Will return the number of deleted entries and never fail. You can also pass in an array of keys to delete multiple keys. All examples assume that you have initialized the cache like const cache = new NodeCache();.
cache.del('foo'); // true
passing in an array of keys:
cache.del(['foo', 'bar']); // true
.mdel(keys: Array<string | number>): numberDelete multiple keys from the cache. Will return the number of deleted entries and never fail.
cache.mdel(['foo', 'bar']); // true
.ttl(key: string | number, ttl?: number): booleanRedefine the ttl of a key. Returns true if the key has been found and changed. Otherwise returns false. If the ttl-argument isn't passed the default-TTL will be used.
cache.ttl('foo', 10); // true
getTtl(key: string | number): number | undefinedGet the ttl expiration from Date.now() of a key. If the key does not exist it will return undefined.
cache.getTtl('foo'); // 1725993344859
has(key: string | number): booleanCheck if a key exists in the cache.
cache.set('foo', 'bar');
cache.has('foo'); // true
keys(): Array<string>Get all keys from the cache.
cache.keys(); // ['foo', 'bar']
getStats(): NodeCacheStatsGet the stats of the cache.
cache.getStats(); // {hits: 1, misses: 1, keys: 1, ksize: 2, vsize: 3}
flushAll(): voidFlush the cache. Will remove all keys and reset the stats.
cache.flushAll();
cache.keys(); // []
cache.getStats(); // {hits: 0, misses: 0, keys: 0, ksize: 0, vsize: 0}
flushStats(): voidFlush the stats. Will reset the stats but keep the keys.
cache.set('foo', 'bar');
cache.flushStats();
cache.getStats(); // {hits: 0, misses: 0, keys: 0, ksize: 0, vsize: 0}
cache.keys(); // ['foo']
close(): voidthis will stop the interval that is running for the checkperiod and deleteOnExpire options.
cache.close();
on(event: string, callback: Function): voidListen to events. Here are the events that you can listen to:
set - when a key is set and it will pass in the key and value.expired - when a key is expired and it will pass in the key and value.flush - when the cache is flushedflush_stats - when the stats are flusheddel - when a key is deleted and it will pass in the key and value.cache.on('set', (key, value) => {
console.log(`Key ${key} has been set with value ${value}`);
});
You can contribute by forking the repo and submitting a pull request. Please make sure to add tests and update the documentation. To learn more about how to contribute go to our main README https://github.com/jaredwray/cacheable. This will talk about how to Open a Pull Request, Ask a Question, or Post an Issue.
FAQs
Simple and Maintained fast NodeJS internal caching
The npm package @cacheable/node-cache receives a total of 1,432,541 weekly downloads. As such, @cacheable/node-cache popularity was classified as popular.
We found that @cacheable/node-cache demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Company News
/Security News
Socket is an initial recipient of OpenAI's Cybersecurity Grant Program, which commits $10M in API credits to defenders securing open source software.

Security News
Socket CEO Feross Aboukhadijeh joins 10 Minutes or Less, a podcast by Ali Rohde, to discuss the recent surge in open source supply chain attacks.

Research
/Security News
Campaign of 108 extensions harvests identities, steals sessions, and adds backdoors to browsers, all tied to the same C2 infrastructure.