node-redis is a free, open source databases project written in TypeScript and released under MIT. It has 17,584 GitHub stars, 1,976 forks and 159 open issues, and was last pushed 12 hours ago. On this registry it ranks #33 of 81 tracked projects in Databases, with 5 head-to-head comparisons available. It gained 2 stars over the last 3 tracked days.

What is node-redis?

What it is

Node-Redis is the official Redis client for Node.js, published by the Redis organization on GitHub under the redis npm package name. It is a modern, high-performance client written in TypeScript and released under the MIT license, and it lives in the Node.js ecosystem, where it serves as the standard way for JavaScript and TypeScript applications to talk to a Redis server. The project has accumulated 17,581 stars and 1,974 forks over roughly sixteen years, and it remains actively maintained, with the most recent push dated 14 September 2026.

The concrete problem it solves is the gap between a Node.js application and a Redis instance. Without a client, an application has no supported way to open a connection, issue commands such as SET and GET, handle connection errors, or manage the lifecycle of that connection. Node-Redis supplies that layer directly, including connection strings in the form redis[s]://[[username][:password]@][host][:port][/db-number], and it covers both standalone servers and Redis Cluster through the base clients exposed by @redis/client.

Key capabilities

  • Provides base clients such as RedisClient and RedisCluster from the @redis/client package.
  • Ships the redis meta-package, described as the whole-in-one client that includes all redis-stack modules.
  • Exposes Redis Bloom probabilistic data type commands through @redis/bloom.
  • Exposes Redis JSON commands through @redis/json.
  • Exposes RediSearch query and interaction commands through @redis/search.
  • Exposes Redis Time-Series commands through @redis/time-series.
  • Provides token-based authentication using Microsoft Entra ID through @redis/entraid.
  • Supports installation of individual packages when only a subset of commands is needed.

Who uses it and how

  • Node.js applications connect with createClient(), attach an error handler, and call connect() before issuing commands.
  • TypeScript projects import createClient directly from "redis" and use the async client with top-level await.
  • CommonJS projects use require("redis") and call the same client inside an async main() function.
  • Applications targeting standalone Redis pass a URL such as redis://alice:[email protected]:6380 to reach a non-default host or port.
  • Teams needing object mapping instead of raw commands are pointed toward the separate redis-om-node library.

Getting started

Install with npm install redis, or install individual packages if only a subset of commands is required. A local Redis server can be started with docker run -p 6379:6379 -d redis:8.0-rc1; the README also links to Redis Cloud, Redis University, and the Redis Launchpad for hosted

project readme (upstream, from github) — read inline

Node-Redis

Tests Coverage License

Discord Twitch YouTube Twitter

node-redis is a modern, high performance Redis client for Node.js.

How do I Redis?

Learn for free at Redis University

Build faster with the Redis Launchpad

Try the Redis Cloud

Dive in developer tutorials

Join the Redis community

Work at Redis

Installation

Start a redis via docker:

docker run -p 6379:6379 -d redis:8.0-rc1

To install node-redis, simply:

npm install redis

"redis" is the "whole in one" package that includes all the other packages. If you only need a subset of the commands, you can install the individual packages. See the list below.

Packages

Name Description
redis The client with all the "redis-stack" modules
@redis/client The base clients (i.e RedisClient, RedisCluster, etc.)
@redis/bloom Redis Bloom commands
@redis/json Redis JSON commands
@redis/search RediSearch commands
@redis/time-series Redis Time-Series commands
@redis/entraid Secure token-based authentication for Redis clients using Microsoft Entra ID

Looking for a high-level library to handle object mapping? See redis-om-node!

Usage

Basic Example

import { createClient } from "redis";

const client = await createClient()
  .on("error", (err) => console.log("Redis Client Error", err))
  .connect();

await client.set("key", "value");
const value = await client.get("key");
console.log(value); // 'value'
client.destroy();

The same example in CommonJS (for example node example.js without "type": "module" in package.json):

const { createClient } = require("redis");

async function main() {
  const client = await createClient()
    .on("error", (err) => console.log("Redis Client Error", err))
    .connect();

  await client.set("key", "value");
  const value = await client.get("key");
  console.log(value); // 'value'
  client.destroy();
}

main().catch(console.error);

The above code connects to localhost on port 6379. To connect to a different host or port, use a connection string in the format redis[s]://[[username][:password]@][host][:port][/db-number]:

createClient({
  url: "redis://alice:[email protected]:6380",
});

You can also use discrete parameters, UNIX sockets, and even TLS to connect. Details can be found in the client configuration guide.

To check if the client is connected and ready to send commands, use client.isReady which returns a boolean. client.isOpen is also available. This returns true when the client's underlying socket is open, and false when it isn't (for example when the client is still connecting or reconnecting after a network error).

Redis Commands

There is built-in support for all of the out-of-the-box Redis commands. They are exposed using the raw Redis command names (HSET, HGETALL, etc.) and a friendlier camel-cased version (hSet, hGetAll, etc.):

// raw Redis commands
await client.HSET("key", "field", "value");
await client.HGETALL("key");

// friendly JavaScript commands
await client.hSet("key", "field", "value");
await client.hGetAll("key");

Modifiers to commands are specified using a JavaScript object:

await client.set("key", "value", {
  EX: 10,
  NX: true,
});

Replies will be transformed into useful data structures:

await client.hGetAll("key"); // { field1: 'value1', field2: 'value2' }
await client.hVals("key"); // ['value1', 'value2']

Buffers are supported as well:

const client = createClient().withTypeMapping({
  [RESP_TYPES.BLOB_STRING]: Buffer
});

await client.hSet("key", "field", Buffer.from("value")); // 'OK'
await client.hGet("key", "field"); // { field: <Buffer 76 61 6c 75 65> }

For commands that return serialized binary payloads, such as DUMP, map blob strings to Buffer before using the result with commands like RESTORE:

const binaryClient = createClient().withTypeMapping({
  [RESP_TYPES.BLOB_STRING]: Buffer
});

const dump = await binaryClient.dump("source");
await binaryClient.restore("destination", 0, dump);

Unsupported Redis Commands

If you want to run commands and/or use arguments that Node Redis doesn't know about (yet!) use .sendCommand():

await client.sendCommand(["SET", "key", "value", "NX"]); // 'OK'

await client.sendCommand(["HGETALL", "key"]); // ['key1', 'field1', 'key2', 'field2']

Note: the API is different when using a cluster.

Transactions (Multi/Exec)

Start a transaction by calling .multi(), then chaining your commands. When you're done, call .exec() and you'll get an array back with your results:

await client.set("another-key", "another-value");

const [setKeyReply, otherKeyValue] = await client
  .multi()
  .set("key", "value")
  .get("another-key")
  .exec(); // ['OK', 'another-value']

You can also watch keys by calling .watch(). Your transaction will abort if any of the watched keys change.

Blocking Commands

In v4, RedisClient had the ability to create a pool of connections using an "Isolation Pool" on top of the "main" connection. However, there was no way to use the pool without a "main" connection:

const client = await createClient()
  .on("error", (err) => console.error(err))
  .connect();

await client.ping(client.commandOptions({ isolated: true }));

In v5 we've extracted this pool logic into its own class—RedisClientPool:

const pool = await createClientPool()
  .on("error", (err) => console.error(err))
  .connect();

await pool.ping();

Pub/Sub

See the Pub/Sub overview.

Scan Iterator

SCAN results can be looped over using async iterators:

for await (const keys of client.scanIterator()) {
  console.log(keys, await client.mGet(keys));
}

This works with HSCAN, SSCAN, and ZSCAN too:

for await (const { field, value } of client.hScanIterator("hash")) {
}
for await (const member of client.sScanIterator("set")) {
}
for await (const { score, value } of client.zScanIt

readme truncated — read the full docs on github

Frequently asked questions

Is node-redis free to use?

node-redis is open source under the MIT licence. There is no licence fee and no seat count — you can self-host it or, where the project offers one, pay a vendor for a managed version instead.

What does node-redis do?

Redis Node.js client

What is node-redis written in?

node-redis is primarily written in TypeScript. Its source is publicly available at https://github.com/redis/node-redis, and it has 17,584 GitHub stars.