Skip to content

Releases: redis/node-redis

redis@6.2.1

Choose a tag to compare

@nkaradzhov nkaradzhov released this 11 Aug 12:09

What's Changed

  • fix(sentinel): cap post-connect rediscovery retries by @DebadityaHait in #3388
  • chore(deps): bump ip-address and socks by @dependabot[bot] in #3389
  • feat(client): add MaxCommandRedirectionsError for cluster redirections by @Piyush0049 in #3386
  • fix: remove stale data listener explicitly on socket error by @Chrisp1tv in #3209
  • fix(client): dispose credentials subscription on every close() path by @lazerg in #3391
  • fix(cluster): keep batch commands routed by slot during migration by @GiHoon1123 in #3377
  • fix(client): decode RESP3 doubles to the value the server sent by @Jaybhade in #3393
  • fix(cluster): handle MOVED and ASK redirects for atomic MULTI by @konovalovsergey in #3395

New Contributors

Full Changelog: https://github.com/redis/node-redis/compare/redis@6.2.0...redis@6.2.1

redis@6.2.0

Choose a tag to compare

@nkaradzhov nkaradzhov released this 31 Jul 20:19

6.2.0

✨ Highlights

Cluster commands now follow the server's request/response policies. node-redis reads each command's routing policy from the server's COMMAND metadata and routes and aggregates accordingly, so the cluster client behaves much more like a single server. Multi-key commands that span hash slots — MGET, MSET, DEL, EXISTS, TOUCH, UNLINK — are transparently split per slot and their replies reassembled in caller order, so cross-slot calls that previously failed with CROSSSLOT now just work. Fan-out commands such as KEYS, DBSIZE, FLUSHALL, PING, WAIT, SCRIPT EXISTS and CONFIG SET run across every shard (or every node) and their replies are aggregated per the server's policy, SCAN walks the whole cluster behind a per-client virtual cursor, and RANDOMKEY / FT.CURSOR get correct cluster-aware routing. Replica read-scaling was also aligned with the server flags, so read-only keyless commands (DBSIZE, KEYS, SCAN, RANDOMKEY, and the RediSearch / time-series reads) can be served from replicas again.

⚠️ Behavior change for the raw sendCommand path: a table-recognized command sent raw — e.g. cluster.sendCommand(['DBSIZE']) — now follows its policy (fan-out and aggregate) instead of hitting a single node. Callers who relied on raw commands for per-node operations should target a specific node with cluster.nodeClient(node).sendCommand(...).

This release also brings a broad wave of new command coverage across the client and modules. The time-series package gains the most: new TS.NRANGE/TS.NREVRANGE multi-key pivot commands, a TS.READ cursor reader, TS.QUERYLABELS, EXCLUDEEMPTY on MRANGE/MREVRANGE, and multi-aggregator support. RediSearch adds FT.ALIASLIST, a COLLECT reducer for FT.AGGREGATE, HNSW RERANK, timeout warnings on the FT.SEARCH family, and the full set of stemmer languages. The core client adds SUNIONCARD/SDIFFCARD, LMOVEM/BLMOVEM, ZREVRANK WITHSCORE, COMMAND DOCS, and XREAD MAXCOUNT/MAXSIZE. A large batch of correctness fixes lands for zero-valued optional arguments (LIMIT 0, DB 0, SAMPLES 0, ENTRIESREAD 0, IDLETIME/FREQ 0, ENTRIESADDED 0) that were previously dropped from the wire, alongside several cluster and sentinel connection-lifecycle fixes.

The new HIMPORT command family (managed fieldset lifecycle) ships as experimental — see the warning below.

🚀 New Features

  • feat(client): request/response policy routing for cluster commands (multi_shard split, fan-out aggregation, special SCAN/RANDOMKEY/FT.CURSOR) (#2996) — @nkaradzhov
  • feat: add COMMAND DOCS support (#3362) — @Hashim1999164
  • feat(client): add LMOVEM and BLMOVEM commands (#3340) — @nkaradzhov
  • feat(client): add SUNIONCARD and SDIFFCARD set-cardinality commands (#3336) — @nkaradzhov
  • feat(client): add zRevRankWithScore (#3279) — @raashish1601
  • feat(xread): add MAXCOUNT / MAXSIZE options (#3335) — @nkaradzhov
  • feat(search): expose timeout warnings on the FT.SEARCH family (#3338) — @nkaradzhov
  • feat(search): add missing RediSearch stemmer languages (#3350) — @nkaradzhov
  • feat(search): add FT.ALIASLIST (#3351) — @nkaradzhov
  • feat(search): add RERANK parameter for HNSW vector fields (#3356) — @nkaradzhov
  • feat(search): add COLLECT reducer to FT.AGGREGATE (#3310) — @nkaradzhov
  • feat(time-series): add TS.NRANGE / TS.NREVRANGE multi-key pivot commands (#3337) — @nkaradzhov
  • feat(time-series): support multiple aggregators per key in TS.NRANGE / TS.NREVRANGE (#3360) — @nkaradzhov
  • feat(time-series): add TS.QUERYLABELS (LABELS and VALUES forms) (#3354) — @nkaradzhov
  • feat(time-series): add EXCLUDEEMPTY to TS.MRANGE / TS.MREVRANGE (#3352) — @nkaradzhov
  • feat(time-series): add TS.READ cursor-read command (#3322) — @nkaradzhov
  • feat(json): add reviver support to GET, MGET, and ARRPOP (#3205) — @JeanSamGirard

⚠️ Experimental

  • feat(client): add HIMPORT command family with managed fieldset lifecycle (#3381) — @nkaradzhov. The HIMPORT family and its FieldsetRegistry/PreparedFieldsets API are experimental and unstable; the surface may change or be removed in a future release. Do not depend on it in production.

🐛 Bug Fixes

  • fix(cluster): reject commands before the cluster topology is ready (#3321) — @GiHoon1123
  • fix(cluster): rebind abort/timeout listeners when a command moves to another queue (#3367) — @GiHoon1123
  • fix(cluster): make extractAllCommands drain the write queue (#3364) — @GiHoon1123
  • fix(sentinel): reject connect() instead of hanging when the resolved master is unreachable (#3331) — @GiHoon1123
  • fix(client): include the acquire-timeout duration in the pool timeout error message (#3382) — @Piyush0049
  • fix(client): reject the in-flight connect attempt when the socket dies during the initiator (#3374) — @nkaradzhov
  • fix(client): correct DoublyLinkedList head removal (#3320) — @abhijeet117
  • fix(client): XADD/XTRIM with LIMIT 0 must emit the argument (#3342) — @Develop-KIM
  • fix(client): XGROUP CREATE/SETID with ENTRIESREAD 0 must emit the argument (#3333) — @Develop-KIM
  • fix(client): XSETID with ENTRIESADDED 0 must emit the argument (#3324) — @spokodev
  • fix(client): MEMORY USAGE must emit SAMPLES when 0 (#3328) — @Develop-KIM
  • fix(client): RESTORE with IDLETIME/FREQ 0 must emit the argument (#3323) — @spokodev
  • fix(client): GETEX PXAT with a Date must encode milliseconds (#3317) — @spokodev
  • fix(client): COPY with DB 0 must emit the DB argument (#3318) — @spokodev
  • fix(search): preserve zero FT.CREATE scores (#3355) — @alencristen
  • fix: hScanValuesIterator now yields values instead of field names (#3344) — @winklemad

🧰 Maintenance

  • ci(release): skip the throwaway workspace update during the staggered release (#3384) — @nkaradzhov
  • ci: fix the release-drafter Maintenance category key (#3358) — @nkaradzhov
  • ci(documentation): cap GITHUB_TOKEN to contents: read (#3291) — @arpitjain099
  • chore(tests): bump the default docker test image to 8.10 (#3319, #3348, #3383) — @nkaradzhov
  • refactor(test-utils): single source for the default docker test image config (#3349) — @nkaradzhov
  • test: run the client command specs against an external Redis Enterprise database (#3341) — @kiryazovi-redis
  • test(scenario): tolerate at-least-once duplicate delivery during sharded pub/sub handoff (#3345) — @kiryazovi-redis
  • test(search): add non-English language coverage for FT.SEARCH (#3339) — @nkaradzhov
  • test(client): add a message-assertion test for XCLAIM JUSTID (#3376) — @Piyush0049
  • test/fix: stabilize the flaky cluster PubSub listener-move test (#3347, #3357) — @nkaradzhov
  • fix(client): stabilize the flaky LATENCY LATEST test (#3326) — @nkaradzhov
  • fix: remove dangling agent symlinks that break checkout (#3334) — @nkaradzhov
  • docs: add a CommonJS basic example to the README (#3359) — @Hashim1999164
  • docs(cluster): document that rootNodes config is not inherited by node connections (#3327) — @nkaradzhov
  • docs: update the end event description to reference close() and destroy() (#3332) — @Wnayar
  • docs(contributing): document the Docker Desktop host-networking requirement for tests on macOS/Windows (#3330) — @nkaradzhov
  • chore(docs): update the secur...
Read more

redis@6.2.0-beta.0

redis@6.2.0-beta.0 Pre-release
Pre-release

Choose a tag to compare

@nkaradzhov nkaradzhov released this 30 Jul 08:32

6.2.0-beta.0

✨ Highlights

This release brings a broad wave of new command coverage across the client and modules. The time-series package gains the most: new TS.NRANGE/TS.NREVRANGE multi-key pivot commands, a TS.READ cursor reader, TS.QUERYLABELS, EXCLUDEEMPTY on MRANGE/MREVRANGE, and multi-aggregator support. RediSearch adds FT.ALIASLIST, a COLLECT reducer for FT.AGGREGATE, HNSW RERANK, timeout warnings on the FT.SEARCH family, and the full set of stemmer languages. The core client adds SUNIONCARD/SDIFFCARD, LMOVEM/BLMOVEM, ZREVRANK WITHSCORE, COMMAND DOCS, and XREAD MAXCOUNT/MAXSIZE. A large batch of correctness fixes lands for zero-valued optional arguments (LIMIT 0, DB 0, SAMPLES 0, ENTRIESREAD 0, IDLETIME/FREQ 0, ENTRIESADDED 0) that were previously dropped from the wire, alongside several cluster and sentinel connection-lifecycle fixes.

The new HIMPORT command family (managed fieldset lifecycle) ships as experimental — see the warning below.

🚀 New Features

⚠️ Experimental

  • feat(client): add HIMPORT command family with managed fieldset lifecycle (#3381) — @nkaradzhov. The HIMPORT family and its FieldsetRegistry/PreparedFieldsets API are experimental and unstable; the surface may change or be removed in a future release. Do not depend on it in production.

🐛 Bug Fixes

  • fix(client): include acquire timeout duration in pool timeout error message (#3382) — @Piyush0049
  • fix(client): reject in-flight connect attempt when socket dies during initiator (#3374) — @nkaradzhov
  • fix(client): clear neighbor pointers when removing the head node (#3320) — @abhijeetkumarsah92
  • fix(client): XADD/XTRIM with LIMIT 0 must emit the argument (#3342) — @Develop-KIM
  • fix(client): XGROUP CREATE/SETID with ENTRIESREAD 0 must emit the argument (#3333) — @Develop-KIM
  • fix(client): XSETID with ENTRIESADDED 0 must emit the argument (#3324) — @spokodev
  • fix(client): MEMORY USAGE must emit SAMPLES when 0 (#3328) — @Develop-KIM
  • fix(client): RESTORE with IDLETIME/FREQ 0 must emit the argument (#3323) — @spokodev
  • fix(client): GETEX PXAT with Date must encode milliseconds (#3317) — @spokodev
  • fix(client): COPY with DB 0 must emit the DB argument (#3318) — @spokodev
  • fix(cluster): rebind abort/timeout listeners when a command moves to another queue (#3367) — @GiHoon1123
  • fix(cluster): extractAllCommands only returned the first queued command (#3364) — @GiHoon1123
  • fix(cluster): reject commands before cluster topology is ready (#3321) — @GiHoon1123
  • fix(sentinel): reject connect() instead of hanging when the resolved master is unreachable (#3331) — @GiHoon1123
  • fix(search): preserve zero FT.CREATE scores (#3355) — @alencristen
  • fix: hScanValuesIterator yields values instead of field names (#3344) — @winklemad
  • fix: remove dangling agent symlinks that break checkout (#3334) — @nkaradzhov

🧰 Maintenance

  • Staggered 6.2.0-beta.0 releases across all workspaces (client, bloom, json, search, time-series, entraid, redis)
  • ci(release): skip throwaway workspace update during staggered release (#3384) — @nkaradzhov
  • ci: fix release-drafter Maintenance category key (#3358) — @nkaradzhov
  • ci(documentation): cap GITHUB_TOKEN to contents: read (#3291) — @arpitjain099
  • chore(tests): bump default docker test image to 8.10 (#3383, #3319, #3348) — @nkaradzhov
  • chore(docs): update security email (#3379) — @nkaradzhov
  • chore: bump metrics exporter (#3375) — @bobymicroby
  • chore(skills): emit maintainer comments without blockquote markers (#3373) — @nkaradzhov
  • chore: add agent skills and tooling configs (#3316) — @nkaradzhov
  • chore(deps): bump jws from 3.2.2 to 3.2.3 (#3372) — @dependabot
  • chore(deps): bump on-headers and express-session (#3371) — @dependabot
  • chore(deps): bump uuid and nyc (#3370) — @dependabot
  • chore(deps): bump esbuild and tsx (#3309) — @dependabot
  • refactor(test-utils): single source for default docker test image config (#3349) — @nkaradzhov
  • test: run client command specs against an external Redis Enterprise database (#3341) — @kiryazovi-redis
  • test(scenario): tolerate at-least-once duplicates during pub/sub migrate handoff (#3345) — @kiryazovi-redis
  • test(search): add non-English language coverage for FT.SEARCH (#3339) — @nkaradzhov
  • test(client): add message assertion test for XCLAIM JUSTID (#3376) — @Piyush0049
  • test(client): fix flaky cluster PubSub listener-move test (#3347, #3357) — @nkaradzhov
  • fix(client): stabilize flaky LATENCY LATEST test (#3326) — @nkaradzhov
  • docs: add CommonJS basic example to README (#3359) — @Hashim1999164
  • docs: update end event description to reference close() and destroy() (#3332) — @Wnayar
  • docs(cluster): document that rootNodes config is not inherited by node connections (#3327) — @nkaradzhov
  • docs(contributing): document Docker Desktop host networking requirement for tests on macOS/Windows (#3330) — @nkaradzhov
  • docs(skills): improve implement-command guidance (#3353) — @nkaradzhov

New Contributors

Read more

redis@6.1.0

Choose a tag to compare

@nkaradzhov nkaradzhov released this 01 Jul 09:54

What's Changed

New Contributors

Full Changelog: https://github.com/redis/node-redis/compare/redis@6.0.1...redis@6.1.0

redis@6.0.1

Choose a tag to compare

@nkaradzhov nkaradzhov released this 25 Jun 09:28

What's Changed

New Contributors

Full Changelog: https://github.com/redis/node-redis/compare/redis@6.0.0...redis@6.0.1

redis@6.0.0

Choose a tag to compare

@nkaradzhov nkaradzhov released this 28 May 16:30

Changes

This is the first major release of node-redis since 5.x. The headline change is RESP3 by default, alongside broader Redis 8.8 command coverage, pubsub/cluster reliability fixes, and a bumped minimum Node.js version.

Key changes

  • RESP3 is the default protocol — opt back into RESP2 explicitly if you need the old wire format
  • Node.js 20 is the new minimum supported runtime
  • Redis 8.8 coverage — new array commands, INCREX / INCREXBYFLOAT, ZINTER/ZUNION COUNT aggregator, XNACK, CLIENT UNBLOCK
  • Sentinel & cluster pubsub fixes for failover-moved connections and sharded topology recovery
  • Stack modules exposed on pool type and the core client classes are now publicly re-exported

🔥 Breaking Changes

See the v5 → v6 migration guide for migration steps.

  • RESP3 is now the default protocol (#3215)
  • Node.js 20 is now the minimum supported version (#3293)
  • New default values for keepAliveInitialDelay (30s) and commandTimeout (5s) (#3292)

🔒 Security

  • entraid: bump @azure/msal-node to 5.x to drop vulnerable transitive uuid (CVE-2026-41907) (#3269)

🚀 New Features

  • Add CLIENT UNBLOCK command (#3266)
  • Add XNACK command with options (#3238)
  • Add Redis 8.8 array commands (#3285)
  • Add INCREX and INCREXBYFLOAT commands (#3288)
  • Add COUNT aggregator to ZINTER / ZINTERSTORE / ZUNION / ZUNIONSTORE (#3243)
  • Add FPHA option to JSON.SET (#3235)
  • time-series: add multi-aggregation range APIs (#3249)
  • Add duplicate() method to RedisSentinel (#3212)
  • Parse unix:// URLs in parseURL (#3271)
  • Expose RedisClient, RedisCluster, RedisSentinel and pool classes (#3251)
  • Expose stack modules on the pool type (#3267)

🐛 Bug Fixes

  • sentinel: use mapped address when failover moves pubsub connections (#3190)
  • cluster: recover sharded pubsub topology after node reconnects (#3223)
  • client: swallow synchronous EPIPE from writeAfterFIN (#3283)
  • search: allow LOAD * in FT.AGGREGATE (#3241)
  • otel: record client connection errors (#3259)
  • entraid: bump @azure/msal-node to 5.x to drop vulnerable uuid transitive (#3269)
  • Fix wrapper command options handling (#3295)
  • Non-functional typo fixes (#3244)

📚 Documentation

🧰 Maintenance

  • Add changed-file lint gate (#3257)
  • CI: lint changed files against PR merge base (#3265)
  • CI: build monorepo before documentation generation (#3233)
  • Add min-release-age cooldown to .npmrc (#3286)
  • Allow empty object types in lint config (#3263)
  • Add hash field subkey notifications test (#3264)
  • Restore generic-transformers spec on current APIs (#3214)
  • Bump default docker test image through 8.8 milestones to 8.8-rc1 (#3234, #3236, #3260, #3284)
  • chore(deps): bump basic-ftp (#3225), tmp and @inquirer/editor (#3294)

👥 New Contributors

We'd like to thank all the contributors who worked on this release!
@Rohan5commit, @opensourcezeal, @aarond-sp, @claygeo, @raashish1601, @watersRand, @PavelPashov, @elimelt, @nkaradzhov

Full Changelog: https://github.com/redis/node-redis/compare/redis@5.12.1...redis@6.0.0

redis@5.12.0

Choose a tag to compare

@nkaradzhov nkaradzhov released this 14 Apr 10:47

✨ What's Changed

🚀 Features

  • feat: expose sendCommand on multi for all clients by @nkaradzhov in #3181
  • feat(sentinel): add sSubscribe/sUnsubscribe methods to Sentinel client by @nkaradzhov in #3178

🐛 Fixes

🔭 Observability (OTEL + Diagnostics)

Node Redis now ships with first-class observability via OpenTelemetry metrics and Node.js diagnostics_channel. Initialize OpenTelemetry before creating clients (OpenTelemetry.init({ metrics: { enabled: true } })) and you can plug Redis client telemetry into your existing OTel SDK/exporter pipeline.

This enables visibility into command latency, connection lifecycle, resiliency/errors, Pub/Sub traffic, streaming behavior, and client-side caching activity. On top of metrics, diagnostics channels provide a more abstract, higher-level way to track runtime behavior through low-overhead event streams (commands, batches, connection events, maintenance notifications, pub/sub, cache, and pool wait timing), so APM tools or custom subscribers can observe the system without changing application code.

🧪 Tests & CI

📚 Docs

🙌 New Contributors

Full Changelog: https://github.com/redis/node-redis/compare/redis@5.11.0...redis@5.12.0

redis@5.11.0

Choose a tag to compare

@nkaradzhov nkaradzhov released this 16 Feb 14:57

5.11.0 Release Changelog

🌟 Highlights

Smart Client Handoffs for Enterprise OSS API (Pending a Redis Enterprise version release)

This release introduces support for Redis Enterprise Cluster maintenance notifications via SMIGRATING/SMIGRATED push notifications. The client now automatically handles slot migrations by:

  • Relaxing timeouts during migration (SMIGRATING) to prevent false failures
  • Automatic slot handoff when completed (SMIGRATED)
  • Enabling seamless operations during Redis Enterprise maintenance windows

Redis 8.6 Support

This release adds support for Redis 8.6 features:

  • XADD idempotency options (IDMPAUTO, IDMP, and policy) - Prevent duplicate entries by tracking producer and message IDs
  • XCFGSET command - Configure per-stream idempotency parameters (IDMP_DURATION, IDMP_MAXSIZE)
  • XINFO STREAM enhancements - New idempotency tracking fields (idmp-duration, idmp-maxsize, pids-tracked, iids-tracked, iids-added, iids-duplicates)
  • HOTKEYS command family (START, STOP, GET, RESET) - Track and identify hot keys by CPU time and network bytes

🚀 New Features

  • feat(cluster): smart client handoffs OSS (hitless upgrades) by @nkaradzhov in #3142
  • feat(client): add VRANGE command for vector sets by @nkaradzhov in #3158
  • feat(client): add HOTKEYS command for hotkey tracking by @nkaradzhov in #3164
  • feat(client): add XCFGSET command for stream idempotency configuration by @nkaradzhov in #3163
  • feat(client): add XADD idempotency options (IDMPAUTO, IDMP) and policy by @nkaradzhov in #3161
  • feat(client): add idempotency fields to XINFO STREAM response by @nkaradzhov in #3162
  • feat(time-series): add NaN support and new aggregation types by @PavelPashov in #3167
  • feat(client): add local digest helper for CAS/CAD operations by @PavelPashov in #3154
  • feat(search): support indexing same field multiple times with different configurations by @nkaradzhov in #3157
  • feat(sentinel): implement nodeAddressMap for sentinel by @elimelt in #3145
  • feat(test-utils): add testAllAuto method for automatic cluster test generation by @bobymicroby in #3148
  • Add socket.servname property to createClient configuration by @itrich in #3165

🐛 Bug Fixes

  • fix(client): Support IPv6 literals in URL by @TimWolla in #3176
  • fix(client): return Promise consistently in cluster functions by @orgads in #3159
  • fix(search): improve FT.HYBRID command implementation by @PavelPashov in #3171
  • fix(pool): cannot read private member by @Eomm in #3151
  • fix: unwrap constructors to primitives in type mapping by @watersRand in #3174

📚 Documentation & Testing

New Contributors

Full Changelog: https://github.com/redis/node-redis/compare/redis@5.10.0...redis@5.11.0

redis@5.10.0

Choose a tag to compare

@nkaradzhov nkaradzhov released this 19 Nov 16:46

Changes

🚀 New Features

  • Add MSETEX command support (#3116)
  • Add CLAIM attribute to XREADGROUP command (#3122)
  • Add index/query doc page examples (#3109)

🧪 Experimental Features

  • Add support for CAS/CAD, DELEX, DIGEST commands (#3123)
  • Add support for HYBRID search (#3119 #3132)
  • Add latency histogram (#3099)

🐛 Bug Fixes

  • Fix dist/package.json version bumping in release process (#3125)
  • Prevent false-ready state when socket errors during handshake (#3128)
  • Don't parse number properties in XREADGROUP (#3133)

🧰 Maintenance

  • Apply proxy improvements (#3121)
  • Mark 8.4 features as experimental (#3134)
  • Extract supported Redis versions into SUPPORTED_REDIS_VERSIONS.md (#3131)
  • Bump test container image to 8.4.0 (#3139)

Contributors

We'd like to thank all the contributors who worked on this release!

Full Changelog: https://github.com/redis/node-redis/compare/redis@5.9.0...redis@5.10.0

redis@5.9.0

Choose a tag to compare

@nkaradzhov nkaradzhov released this 23 Oct 15:09

What's Changed

New Contributors

Full Changelog: https://github.com/redis/node-redis/compare/redis@5.8.3...redis@5.9.0