@nestjs-redis/throttler-storage
v1.0.0
Published
Redis storage for NestJS Throttler enabling distributed rate limiting across multiple application instances
Downloads
20,607
Maintainers
Readme
@nestjs-redis/throttler-storage
Redis-backed storage for NestJS Throttler enabling distributed rate limiting across instances.
Features
- Distributed rate limiting with Redis
- Drop-in replacement for in-memory storage
- Works with existing
@nestjs-redis/clientconnections - Client, Cluster, and Sentinel support
- Does not manage Redis connection lifecycle — pass an existing, managed client
Installation
npm install @nestjs-redis/throttler-storage @nestjs-redis/client redisThe recommended approach is to use RedisModule from @nestjs-redis/client so Redis connections are lifecycle-managed by Nest (connect/disconnect with your app). Alternatively, you can pass your own Redis client (e.g. created with createClient() from redis) and manage its lifecycle yourself.
Quick Start
With existing Redis connection (Recommended)
import { Module } from '@nestjs/common';
import { ThrottlerModule, seconds } from '@nestjs/throttler';
import { RedisModule, RedisToken } from '@nestjs-redis/client';
import { RedisThrottlerStorage } from '@nestjs-redis/throttler-storage';
@Module({
imports: [
RedisModule.forRoot({ options: { url: 'redis://localhost:6379' } }),
ThrottlerModule.forRootAsync({
inject: [RedisToken()],
useFactory: (redis) => ({
throttlers: [{ limit: 5, ttl: seconds(60) }],
storage: new RedisThrottlerStorage(redis),
}),
}),
],
})
export class AppModule {}Without existing Redis connection (Recommended)
If you do not otherwise use Redis in your application and want it only for throttler storage, you can declare the connection within the ThrottlerModule scope by importing RedisModule inside forRootAsync.
@Module({
imports: [
ThrottlerModule.forRootAsync({
imports: [
RedisModule.forRoot({ options: { url: 'redis://localhost:6379' } }),
],
inject: [RedisToken()],
useFactory: (redis) => ({
throttlers: [{ limit: 5, ttl: seconds(60) }],
storage: new RedisThrottlerStorage(redis),
}),
}),
],
})
export class AppModule {}Without existing Redis connection and without RedisModule
If you do not want to use RedisModule, create a client yourself and manage its lifecycle (connect/disconnect). RedisThrottlerStorage does not manage the lifecycle of the provided client.
@Module({
imports: [
ThrottlerModule.forRootAsync({
useFactory: async () => {
const redis = createClient({ url: 'redis://localhost:6379' });
await redis.connect();
return {
throttlers: [{ limit: 5, ttl: seconds(60) }],
storage: new RedisThrottlerStorage(redis),
};
},
}),
],
})
export class AppModule {}Links
- Root repo: CSenshi/nestjs-redis
- Issues: GitHub Issues
- Discussions: GitHub Discussions
Contributing
Please see the root contributing guidelines.
License
MIT © CSenshi
