Smart cache manager for caching clients such as:
- @i1k/redis-cache-client
- @i1k/memory-cache-client
- another client with the same interface
Provides features:
- supports one or more cache clients (multi-store);
- interface for building/ignoring keys.
# using pnpm
pnpm i @i1k/smart-cache-manager
# using npm
npm i @i1k/smart-cache-managerAdditionally, you need to install or implement clients with the same interface.
# using pnpm
pnpm i @i1k/redis-cache-client @i1k/memory-cache-client
# using npm
npm i @i1k/redis-cache-client @i1k/memory-cache-clientEach cache client must be wrapped in an object defined according to the following type:
type Manager = {
client: ICacheClient
key?: (key: string) => string | null
}If you provide the key function,
every call to the set or get method will pass the key through this function for handling.
For example, if you want to cache only the keys that include the word 'main' in memory, you can provide a function like the one shown below:
// clients implement the ICacheClient interface
import RedisCacheClient from '@i1k/redis-cache-client'
import MemoryCacheClient from '@i1k/memory-cache-client'
import CacheManager from '@i1k/smart-cache-manager'
const cacheManager = new CacheManager([
{
client: new MemoryCacheClient({ max: 100 }),
key: key => (key.includes('main') ? key : null),
},
{
client: new RedisCacheClient(),
},
])
cacheManager.set('key', 'value')interface ICacheClient {
set: (key: string, value: string) => Promise<'OK'>
get: (key: string) => Promise<string | null>
del: (key: StringOrGlobPattern | StringOrGlobPattern[]) => Promise<string[]>
clear: () => Promise<string[]>
keys: (pattern: StringOrGlobPattern | StringOrGlobPattern[]) => Promise<string[]>
}Remember that every call to the set or get method will pass the key through this function for handling.
To set a key-value pair in all stores.
cacheManager.set('foo', 'bar')
// => Promise<'OK'>
cacheManager.set('foo/main', 'bar')
// => Promise<'OK'>To get a value by key (uses promise race).
cacheManager.get('foo')
// => Promise<'bar'>
cacheManager.get('bar')
// => Promise<null>To delete a key-value pair in all stores by a specific key or a glob pattern.
cacheManager.del('foo')
// => Promise<['RedisCacheClient: foo']>
cacheManager.del('foo*')
// => Promise<['RedisCacheClient: foo', 'RedisCacheClient: foo/main', 'MemoryCacheClient: foo/main']>
cacheManager.del(['foo', 'foo/*'])
// => Promise<['RedisCacheClient: foo', 'RedisCacheClient: foo/main', 'MemoryCacheClient: foo/main']>To clear all stores.
cacheManager.clear()
// => Promise<['RedisCacheClient: foo', 'RedisCacheClient: foo/main', 'MemoryCacheClient: foo/main']>To get keys from all stores by a specific key or a glob pattern.
cacheManager.keys('foo')
// => Promise<['RedisCacheClient: foo']>
cacheManager.keys('foo*')
// => Promise<['RedisCacheClient: foo', 'RedisCacheClient: foo/main', 'MemoryCacheClient: foo/main']>
cacheManager.keys(['foo', 'foo/*'])
// => Promise<['RedisCacheClient: foo', 'RedisCacheClient: foo/main', 'MemoryCacheClient: foo/main']>