Reusable Cache Service and strategies
npm install cache-service-libPresenting a reusable cache library to Node.Js. This library uses well defined cache solutions such as redis and node-cache to deliver scalable and reusable cache services.
An abstraction layer is provided through Adapter and Strategy design patterns, allowing also to simplify multilevel cache solutions.
``typescript
import { createCacheService } from 'cache-service-lib';
import { RedisCacheStrategy } from 'cache-service-lib/lib/strategies/RedisCacheStrategy';
const cacheService = createCacheService();
cacheService.registerStrategy(
'redis',
new RedisCacheStrategy({
host: 'localhost',
port: 6379,
})
);
cacheService.set('key', 'value', 30); // Will expire cache entry in 30s
`
`typescript
import { createCacheService } from 'cache-service-lib';
import { RedisCacheStrategy } from 'cache-service-lib/lib/strategies/RedisCacheStrategy';
import { MemCacheStrategy } from 'cache-service-lib/lib/strategies/MemCacheStrategy';
const cacheService = createCacheService();
cacheService.registerStrategy('mem', new MemCacheStrategy());
cacheService.registerStrategy(
'redis',
new RedisCacheStrategy({
host: 'localhost',
port: 6379,
})
);
cacheService.chooseStrategy('redis').set('key', 'value', 30); // Will expire cache entry in 30s
`
In async scenarios, in order to ensure the correct strategy at each call is recommended to pass the parameter \_strategyStorage_:'async'\ to createCacheService.
This parameter enables the usage of the async_hooks Node.Js api to store and retrieve the current strategy. Please make sure the client node version supports this feature.
`typescript
import { createCacheService } from 'cache-service-lib';
import { RedisCacheStrategy } from 'cache-service-lib/lib/strategies/RedisCacheStrategy';
import { MemCacheStrategy } from 'cache-service-lib/lib/strategies/MemCacheStrategy';
const cacheService = createCacheService({ strategyStorage: 'async' });
cacheService.registerStrategy('mem', new MemCacheStrategy());
cacheService.registerStrategy(
'redis',
new RedisCacheStrategy({
host: 'localhost',
port: 6379,
})
);
cacheService.chooseStrategy('redis').set('key', 'value', 30); // Will expire cache entry in 30s
`
> The first strategy registered will be automatically marked as the currentStrategy.
- registerStrategy(name: string, strategy: CacheStrategy): void
- chooseStrategy(name: string) : void
- listStrategies() : Array\
- call\
- get\
- set(key: string, value: unknown, expiresIn?: number): Promise\
- del(key: string): Promise\
- delByPrefix(prefix: string): Promise\
- flush(): Promise\
There are some modifiers available to enable functionalities on top of the default CacheService. This plugins can be used as decorators of CacheServiceProtocols.
Enable auto refresh functionality at call function.
- call\
`typescript
import { createCacheService, MemcacheStrategy, plugins } from 'cache-service-lib';
const cacheService = plugins.autoRefresh(createCacheService());
cacheService.registerStrategy('mem', new MemCacheStrategy());
const fn = async () => ['value'];
cacheService.call(fn, 'key', 30); // Will autorefresh cache entry every 30s
`
Conflicting set operations will cancel auto refresh schedules.
Commands to create test dynamodb table:
`bash
aws dynamodb --region us-east-1 --endpoint-url http://localhost:8000 create-table --table-name table-1 \
--attribute-definitions AttributeName=kind,AttributeType=S AttributeName=key,AttributeType=S --key-schema AttributeName=kind,KeyType=HASH AttributeName=key,KeyType=RANGE \
--provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5
aws dynamodb --region us-east-1 --endpoint-url http://localhost:8000 update-time-to-live --table-name table-1 --time-to-live-specification "Enabled=true, AttributeName=ttl"
``