# @casual-simulation/rate-limit-redis

> A Redis store for the `express-rate-limit` middleware

Latest version **4.0.0** (published 2026-01-27) · MIT license · 0 weekly downloads

## Install

```sh
npm install @casual-simulation/rate-limit-redis
pnpm add @casual-simulation/rate-limit-redis
yarn add @casual-simulation/rate-limit-redis
bun add @casual-simulation/rate-limit-redis
```

## Health

**Score 65/100 (B)** — status: stable.

Positive: has types; esm support; no vulnerabilities; has provenance; high quality score.

Warnings: low downloads.

## Facts

| | |
|---|---|
| Version | 4.0.0 |
| Published | 2026-01-27 |
| First published | 2023-04-25 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | bundled |
| Module format | ESM + CommonJS |
| Dependencies | 0 |
| Unpacked size | 24 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| Provenance | attested (GitHub Actions) |
| Author | Wyatt Johnson |
| Maintainers | kallyngowdyyeti, casualsimulation |

## Links

- npm: https://www.npmjs.com/package/@casual-simulation/rate-limit-redis
- Repository: https://github.com/casual-simulation/casualos
- Issues: https://github.com/casual-simulation/casualos/issues
- npm.io page: https://npm.io/package/@casual-simulation/rate-limit-redis

## Recent versions

- 4.0.0 (latest) — 2026-01-27
- 4.0.1-alpha.21448844597 (alpha) — 2026-01-28
- 3.4.1-alpha.14318904853 (canary) — 2025-04-07
- 3.4.1-alpha.14316240392 — 2025-04-07
- 3.4.0 — 2025-04-05
- 3.4.0-alpha.14204808910 — 2025-04-01
- 3.4.0-alpha.14070378151 — 2025-03-25
- 3.4.0-alpha.13932534773 — 2025-03-18
- 3.3.13 — 2024-11-08
- 3.2.7 — 2023-12-22
- 3.2.7-alpha.7293404763 — 2023-12-21
- 3.2.7-alpha.7280400706 — 2023-12-20
- 3.2.7-alpha.7278679536 — 2023-12-20
- 3.2.7-alpha.7203795135 — 2023-12-14
- 3.2.7-alpha.7120895964 — 2023-12-06
- … 24 more at https://npm.io/package/@casual-simulation/rate-limit-redis/versions

## README

# <div align="center"> `rate-limit-redis` </div>

<div align="center">
	<img alt="Github Workflow Status" src="https://img.shields.io/github/workflow/status/wyattjoh/rate-limit-redis/CI"/>
	<img alt="npm version" src="https://img.shields.io/npm/v/rate-limit-redis.svg"/>
	<img alt="GitHub Stars" src="https://img.shields.io/github/stars/wyattjoh/rate-limit-redis"/>
	<img alt="npm downloads" src="https://img.shields.io/npm/dm/rate-limit-redis"/>
</div>

<br>

<div align="center">

A [`redis`](https://github.com/redis/redis) store for the
[`express-rate-limit`](https://github.com/nfriedly/express-rate-limit)
middleware.

</div>

## Installation

From the npm registry:

```sh
# Using npm
> npm install rate-limit-redis
# Using yarn or pnpm
> yarn/pnpm add rate-limit-redis
```

From Github Releases:

```sh
# Using npm
> npm install https://github.com/wyattjoh/rate-limit-redis/releases/download/v{version}/rate-limit-redis.tgz
# Using yarn or pnpm
> yarn/pnpm add https://github.com/wyattjoh/rate-limit-redis/releases/download/v{version}/rate-limit-redis.tgz
```

Replace `{version}` with the version of the package that you want to your, e.g.:
`3.0.0`.

## Usage

### Importing

This library is provided in ESM as well as CJS forms, and works with both
Javascript and Typescript projects.

**This package requires you to use Node 14 or above.**

Import it in a CommonJS project (`type: commonjs` or no `type` field in
`package.json`) as follows:

```ts
const RedisStore = require('rate-limit-redis');
```

Import it in a ESM project (`type: module` in `package.json`) as follows:

```ts
import RedisStore from 'rate-limit-redis';
```

### Examples

To use it with a [`node-redis`](https://github.com/redis/node-redis) client:

```ts
import rateLimit from 'express-rate-limit';
import RedisStore from 'rate-limit-redis';
import { createClient } from 'redis';

// Create a `node-redis` client
const client = createClient({
    // ... (see https://github.com/redis/node-redis/blob/master/docs/client-configuration.md)
});
// Then connect to the Redis server
await client.connect();

// Create and use the rate limiter
const limiter = rateLimit({
    // Rate limiter configuration
    windowMs: 15 * 60 * 1000, // 15 minutes
    max: 100, // Limit each IP to 100 requests per `window` (here, per 15 minutes)
    standardHeaders: true, // Return rate limit info in the `RateLimit-*` headers
    legacyHeaders: false, // Disable the `X-RateLimit-*` headers

    // Redis store configuration
    store: new RedisStore({
        sendCommand: (...args: string[]) => client.sendCommand(args),
    }),
});
app.use(limiter);
```

To use it with a [`ioredis`](https://github.com/luin/ioredis) client:

```ts
import rateLimit from 'express-rate-limit';
import RedisStore from 'rate-limit-redis';
import RedisClient from 'ioredis';

// Create a `ioredis` client
const client = new RedisClient();
// ... (see https://github.com/luin/ioredis#connect-to-redis)

// Create and use the rate limiter
const limiter = rateLimit({
    // Rate limiter configuration
    windowMs: 15 * 60 * 1000, // 15 minutes
    max: 100, // Limit each IP to 100 requests per `window` (here, per 15 minutes)
    standardHeaders: true, // Return rate limit info in the `RateLimit-*` headers
    legacyHeaders: false, // Disable the `X-RateLimit-*` headers

    // Redis store configuration
    store: new RedisStore({
        // @ts-expect-error - Known issue: the `call` function is not present in @types/ioredis
        sendCommand: (...args: string[]) => client.call(...args),
    }),
});
app.use(limiter);
```

### Configuration

#### `sendCommand`

The function used to send commands to Redis. The function signature is as
follows:

```ts
(...args: string[]) => Promise<number> | number
```

The raw command sending function varies from library to library; some are given
below:

| Library                                                            | Function                                                          |
| ------------------------------------------------------------------ | ----------------------------------------------------------------- |
| [`node-redis`](https://github.com/redis/node-redis)                | `async (...args: string[]) => client.sendCommand(args)`           |
| [`ioredis`](https://github.com/luin/ioredis)                       | `async (...args: string[]) => client.call(...args)`               |
| [`handy-redis`](https://github.com/mmkal/handy-redis)              | `async (...args: string[]) => client.nodeRedis.sendCommand(args)` |
| [`tedis`](https://github.com/silkjs/tedis)                         | `async (...args: string[]) => client.command(...args)`            |
| [`redis-fast-driver`](https://github.com/h0x91b/redis-fast-driver) | `async (...args: string[]) => client.rawCallAsync(args)`          |
| [`yoredis`](https://github.com/djanowski/yoredis)                  | `async (...args: string[]) => (await client.callMany([args]))[0]` |
| [`noderis`](https://github.com/wallneradam/noderis)                | `async (...args: string[]) => client.callRedis(...args)`          |

#### `prefix`

The text to prepend to the key in Redis.

Defaults to `rl:`.

#### `resetExpiryOnChange`

Whether to reset the expiry for a particular key whenever its hit count changes.

Defaults to `false`.

## License

MIT © [Wyatt Johnson](https://github.com/wyattjoh)

---
_Source: https://npm.io/package/@casual-simulation/rate-limit-redis · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
