Repository navigation
Releases: redis/node-redis
Release list
redis@6.4.0-beta.0
redis@6.4.0-beta.0
✨ Highlights
This beta introduces the multi-database client: createMultiDbClient, createMultiDbClientPool, createMultiDbCluster and createMultiDbSentinel connect to several Redis endpoints and move traffic to a healthy one when the active endpoint fails, using health checks, a circuit breaker and configurable failover. The API is experimental and may change before the stable release. Client-side caching gains OPTIN and OPTOUT tracking modes with per-call control, and the command set grows with the BLESS family, Cuckoo CF.MEXISTS, a Count-Min Sketch cell size, HNSW vector compression and many new FT.SEARCH options.
🚀 New Features
- client: add OPTIN/OPTOUT tracking modes, a
cacheablepredicate and a per-callcacheoption to client-side caching (#3473) — @PavelPashov - client: add the BLESS command family (
BLESS SET,BLESS GET,BLESS CLEAR,BLESS SCAN), withBLESS SCANrouted across all cluster masters (#3483) — @vlady-kotsev - search: add
COMPRESSION(SQ8) andTRAINING_THRESHOLDto HNSW vector fields (#3488) — @PavelPashov - search: support
WITHSCORES,EXPLAINSCORE,WITHPAYLOADS,WITHSORTKEYS,FILTER,GEOFILTERandPAYLOADinFT.SEARCH(#3432) — @watersRand - bloom: add the Cuckoo filter
CF.MEXISTScommand (#3447) — @vlady-kotsev - bloom: add a
cellSizeparameter toCMS.INITBYDIM/CMS.INITBYPROB(#3451) — @vlady-kotsev - sentinel: emit
connect,ready,reconnectingandendlifecycle events (#3430) — @nkaradzhov - client: add
MaxCommandRedirectionsErrorwhen a cluster command exceeds its redirection limit (#3386) — @Piyush0049 - client: give clearer error messages when client options are invalid (#3441) — @AniaMakes
⚠️ Experimental
- Multi-database client with automatic endpoint failover:
createMultiDbClient,createMultiDbClientPool,createMultiDbClusterandcreateMultiDbSentinel. The API, events and configuration are marked@experimentaland may change in a future release (#3435) — @nkaradzhov - Client-side caching
strictoption: acache: truemark on a command that cannot be cached rejects instead of logging a warning. Meant for development and tests; may change (#3473) — @PavelPashov
🐛 Bug Fixes
Connection and reconnection
- Prevent a reconnect loop when the legacy
QUITis used (#3462) — @aartisonigra - Keep the reconnect retry counter sequential after the socket drops once ready (#3465) — @tamil-selvan-k
- Emit a termination event when reconnecting stops (#3433) — @GiHoon1123
- Remove the stale
datalistener on socket error (#3209) — @Chrisp1tv - Dispose of the credentials subscription on every
close()path (#3391) — @lazerg - Settle the
close()drain when the last connect fails (#3400) — @kyungseopk1m - Keep decoding a chunk when a listener throws (#3486) — @maxymlyskov
- Keep
asapcommands out of a partly writtenMULTI(#3496) — @jadhavgaurav - Keep an empty client name in
HELLO(#3468) — @xia-chao
Selected database
- Keep the selected database when a pipelined command fails (#3484) — @maxymlyskov
- Do not
- Keep batch commands routed by slot during slot migration (#3377) — @GiHoon1123
- Recreate a cluster node client after a terminal connect failure (#3403) — @nkaradzhov
- Emit
node-connect/node-readyon every reconnection (#3438) — @consegrado - Unpause destination nodes when the
SMIGRATEDhandler throws (#3445) — @tamil-selvan-k - Clear
pubSubNodeafter destroying it on topology rediscovery (#3481) — @tamil-selvan-k - Vendor
cluster-key-slotto fix the slot of keys with an empty hash tag (#3431) — @mishan
Sentinel
- Cap rediscovery retries after connect (#3388) — @DebadityaHait
- Take one master lease when direct commands start at the same time (#3497) — @maxymlyskov
Pub/Sub
- Settle an argument-less
UNSUBSCRIBEwhile pattern subscriptions remain (#3407) — @kyungseopk1m - Keep the listener for channels already subscribed when a mixed subscribe is rejected (#3467) — @tamil-selvan-k
- Update the active state after clearing maps in
removeAllListeners(#3472) — @tamil-selvan-k - Stop the subscribing counter from going below zero in resubscribe callbacks (#3476) — @tamil-selvan-k
- Restore string replies after leaving RESP2 pub/sub mode (#3492) — @lazerg
RESP and type mapping
- Decode RESP3 doubles to the exact value the server sent (#3393) — @Jaybhade
- Keep
String.prototypein fast mode after definingVerbatimString(#3479) — @Ceereals - Honour
typeMappinginXINFO STREAMand vector set replies (#3470) — @xia-chao - time-series: honour
typeMappingfor labels in RESP2 replies (#3412) — @abhijeet117
Command arguments
- Send an empty message in
PING('')instead of a barePING(#3464) — @xia-chao - Preserve empty
MATCHpatterns in scan commands (#3460) — @jakezwang - Stop scan iterators when the cursor is a
Buffer(#3428) — @UgaTheDev - Forward
XRANGE ... COUNT 0and handle its null reply (#3449) — @xia-chao - Keep the empty consumer filter argument in
XPENDING(#3494) — @wToTw123 - Keep pending stream entries whose message was deleted in
XREADGROUPreplies (#3500) — @maxymlyskov - Require an
XADDTRIMstrategy, as the command grammar does, and always send it (#3418) — @abhijeet117 - Require the approximate (
~) modifier forXTRIMLIMIT(#3425) — @abhijeet117 - Accept sampled events in the
LATENCYcommand argument types (#3421) — @abhijeet117
Reply types
- Handle the
ACL GETUSERnull reply for users that do not exist (#3413) — @abhijeet117 - Type
ACL GETUSERflags as a RESP3 set (#3417) — @abhijeet117 - Type
COMMAND DOCSset containers as RESP3 sets (#3424) — @abhijeet117 - Expose the
watch,rbsandrbpfields inCLIENT INFOandCLIENT LISTreplies (#3415) — @abhijeet117 - Expose the
MEMORY STATSfields added in Redis 7.4 (#3416) — @abhijeet117 - Correct the
HELLOmodules reply type (#3411) — @abhijeet117 - Include all replica states in the
ROLEreply type (#3420) — @abhijeet117 - Correct the
CLUSTER BUMPEPOCHreply type (#3414) — @abhijeet117 - Include
NOKEYin theMIGRATEreply type (#3419) — @abhijeet117 - Correct the
XINFO GROUPSlast-delivered-idreply type (#3410) — @abhijeet117 - Name a
🧰 Maintenance
- ci: use npm trusted publishing for releases (#3480) — @nkaradzhov
- build: replace the deprecated
npm -wsshorthand (#3477) — @nkaradzhov - test-utils: boot cluster test containers on newer Redis builds (#3471) — @nkaradzhov
- test: create the key before
BLESS SET/GET/CLEAR(#3490) — @nkaradzhov - docs: clarify config tables, fix typos and align JSDoc examples (#3452, #3456, #3458) — @codeXsidd
- docs: note that
sendCommanddoes not applykeyPrefix([#3455](https://githu...
redis@6.2.1
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
- @DebadityaHait made their first contribution in #3388
- @Chrisp1tv made their first contribution in #3209
- @lazerg made their first contribution in #3391
- @Jaybhade made their first contribution in #3393
- @konovalovsergey made their first contribution in #3395
Full Changelog: https://github.com/redis/node-redis/compare/redis@6.2.0...redis@6.2.1
redis@6.2.0
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.
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 DOCSsupport (#3362) — @Hashim1999164 - feat(client): add
LMOVEMandBLMOVEMcommands (#3340) — @nkaradzhov - feat(client): add
SUNIONCARDandSDIFFCARDset-cardinality commands (#3336) — @nkaradzhov - feat(client): add
zRevRankWithScore(#3279) — @raashish1601 - feat(xread): add
MAXCOUNT/MAXSIZEoptions (#3335) — @nkaradzhov - feat(search): expose timeout warnings on the
FT.SEARCHfamily (#3338) — @nkaradzhov - feat(search): add missing RediSearch stemmer languages (#3350) — @nkaradzhov
- feat(search): add
FT.ALIASLIST(#3351) — @nkaradzhov - feat(search): add
RERANKparameter for HNSW vector fields (#3356) — @nkaradzhov - feat(search): add
COLLECTreducer toFT.AGGREGATE(#3310) — @nkaradzhov - feat(time-series): add
TS.NRANGE/TS.NREVRANGEmulti-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(LABELSandVALUESforms) (#3354) — @nkaradzhov - feat(time-series): add
EXCLUDEEMPTYtoTS.MRANGE/TS.MREVRANGE(#3352) — @nkaradzhov - feat(time-series): add
TS.READcursor-read command (#3322) — @nkaradzhov - feat(json): add reviver support to
GET,MGET, andARRPOP(#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
extractAllCommandsdrain 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/XTRIMwithLIMIT 0must emit the argument (#3342) — @Develop-KIM - fix(client):
XGROUP CREATE/SETIDwithENTRIESREAD 0must emit the argument (#3333) — @Develop-KIM - fix(client):
XSETIDwithENTRIESADDED 0must emit the argument (#3324) — @spokodev - fix(client):
MEMORY USAGEmust emitSAMPLESwhen 0 (#3328) — @Develop-KIM - fix(client):
RESTOREwithIDLETIME/FREQ 0must emit the argument (#3323) — @spokodev - fix(client):
GETEX PXATwith aDatemust encode milliseconds (#3317) — @spokodev - fix(client):
COPYwithDB 0must emit theDBargument (#3318) — @spokodev - fix(search): preserve zero
FT.CREATEscores (#3355) — @alencristen - fix:
hScanValuesIteratornow 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_TOKENtocontents: 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 LATESTtest (#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
rootNodesconfig is not inherited by node connections (#3327) — @nkaradzhov - docs: update the
endevent description to referenceclose()anddestroy()(#3332) — @Wnayar - docs(contributing): document the Docker Desktop host-networking requirement for tests on macOS/Windows (#3330) — @nkaradzhov
- chore(docs): update the secur...
redis@6.2.0-beta.0
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
- 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 ZREVRANK WITHSCORE command (#3279) — @raashish1601
- feat(xread): add MAXCOUNT and MAXSIZE support (#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 command (#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 and 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 and 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
HIMPORTfamily and itsFieldsetRegistry/PreparedFieldsetsAPI 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.0releases 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
- @Hashim1999164 made their first contribution in #3362
- @Piyush0049 made their first contribution in #3382
- @GiHoon1123 made their first contribution in #3367
- @spokodev made their first contribution in #3324
- @Develop-KIM made their first contribution in #3342
- @alencristen made their first contribution in [#3355](https://github.com/redis/no...
redis@6.1.0
What's Changed
- feat: add key prefixing (fixes #2982) by @gajus in #3312
- feat(cluster): add getNodeClientForKey for WATCH/MULTI/EXEC by @nkaradzhov in #3315
New Contributors
Full Changelog: https://github.com/redis/node-redis/compare/redis@6.0.1...redis@6.1.0
redis@6.0.1
What's Changed
- ci: bump GitHub Actions to Node 24-compatible versions by @nkaradzhov in #3298
- chore(tests): bump default docker test image to 8.8.0 by @nkaradzhov in #3297
- fix(client): align RedisClientOptions RESP default with RedisClientType by @aartisonigra in #3303
- test(client): fix three flaky tests around socket/connect lifecycle by @nkaradzhov in #3299
- fix: embed sources in emitted sourcemaps by @raashish1601 in #3274
- Sentinel scan iterator by @harshrai654 in #3141
- ci: replace brittle Codecov uploader with codecov-action by @nkaradzhov in #3314
- Fix/issue 3311 by @aartisonigra in #3313
- fix(sentinel): preserve seed nodes in sentinelRootNodes after topology update (#3237) by @aartisonigra in #3306
New Contributors
- @aartisonigra made their first contribution in #3303
- @harshrai654 made their first contribution in #3141
Full Changelog: https://github.com/redis/node-redis/compare/redis@6.0.0...redis@6.0.1
redis@6.0.0
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) andcommandTimeout(5s) (#3292)
🔒 Security
- entraid: bump
@azure/msal-nodeto 5.x to drop vulnerable transitiveuuid(CVE-2026-41907) (#3269)
🚀 New Features
- Add
CLIENT UNBLOCKcommand (#3266) - Add
XNACKcommand with options (#3238) - Add Redis 8.8 array commands (#3285)
- Add
INCREXandINCREXBYFLOATcommands (#3288) - Add
COUNTaggregator toZINTER/ZINTERSTORE/ZUNION/ZUNIONSTORE(#3243) - Add
FPHAoption toJSON.SET(#3235) - time-series: add multi-aggregation range APIs (#3249)
- Add
duplicate()method toRedisSentinel(#3212) - Parse
unix://URLs inparseURL(#3271) - Expose
RedisClient,RedisCluster,RedisSentineland 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 *inFT.AGGREGATE(#3241) - otel: record client connection errors (#3259)
- entraid: bump
@azure/msal-nodeto 5.x to drop vulnerableuuidtransitive (#3269) - Fix wrapper command options handling (#3295)
- Non-functional typo fixes (#3244)
📚 Documentation
- Document Node.js 20 minimum version in migration guide (#3293)
- Numerous typo and grammar fixes across docs and comments (#3230, #3231, #3232, #3239, #3240, #3242, #3245, #3246, #3
- Inline JSDoc improvements (#3250)
- Compact receiver hovers via public type aliases (#3248)
🧰 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-agecooldown 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),tmpand@inquirer/editor(#3294)
👥 New Contributors
- @Rohan5commit made their first contribution in #3232
- @opensourcezeal made their first contribution in #3244
- @aarond-sp made their first contribution in #3251
- @claygeo made their first contribution in #3212
- @raashish1601 made their first contribution in #3267
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
✨ What's Changed
🚀 Features
- feat: expose
sendCommandonmultifor all clients by @nkaradzhov in #3181 - feat(sentinel): add
sSubscribe/sUnsubscribemethods to Sentinel client by @nkaradzhov in #3178
🐛 Fixes
- fix(search): correct
INDEXMISSINGplacement by @nkaradzhov in #3179 - Pool fixes by @nkaradzhov in #3182
- fix(search): use
@redis/clientdist imports inCREATEcommand by @PavelPashov in #3187 - fix(sentinel): preserve root seeds for outage recovery by @nkaradzhov in #3188
- fix: fallthrough bug in
transformDoubleReplyby @rhymincymon in #3213
🔭 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.
- add OpenTelemetry metrics instrumentation by @PavelPashov in #3110
- feat: implement diagnostic channels for observability by @logaretm in #3195
🧪 Tests & CI
- test(scho oss): add smigrating checks for new connections by @nkaradzhov in #3186
- Add self-report metrics step to CI workflow by @bobymicroby in #3199
- Add run tests action by @dariaguy in #3221
📚 Docs
- improve sentinel docs by @cutiepoka in #3189
- docs: clarify DUMP/RESTORE binary payload usage by @nkaradzhov in #3201
- fix(docs): configure typedoc entry points for monorepo by @nkaradzhov in #3220
🙌 New Contributors
- @cutiepoka made their first contribution in #3189
- @rhymincymon made their first contribution in #3213
- @logaretm made their first contribution in #3195
- @dariaguy made their first contribution in #3221
Full Changelog: https://github.com/redis/node-redis/compare/redis@5.11.0...redis@5.12.0
redis@5.11.0
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, andpolicy) - 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
- docs: correct CAS/CAD parameter name and update example by @PavelPashov in #3156
- docs(token-manager): Correct documentation for jitterPercentage by @dubek in #3153
- tests: fix flaky timeout assertion in maintenance notification test by @kiryazovi-redis in #3143
- tests: add TLS connection tests by @PavelPashov in #3166
- tests: add mocha multi-reporters and junit reporter support by @bobymicroby in #3138
- refactor(test-utils): use separate redis-tag and redis-version CLI arguments by @nkaradzhov in #3169
- Hotkeys Adjustments by @nkaradzhov in #3173
New Contributors
- @kiryazovi-redis made their first contribution in #3143
- @elimelt made their first contribution in #3145
- @dubek made their first contribution in #3153
- @itrich made their first contribution in #3165
- @TimWolla made their first contribution in #3176
Full Changelog: https://github.com/redis/node-redis/compare/redis@5.10.0...redis@5.11.0
redis@5.10.0
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!
- @andy-stark-redis
- @htemelski-redis
- @nkaradzhov
- @NaughtySora
- @PavelPashov
Full Changelog: https://github.com/redis/node-redis/compare/redis@5.9.0...redis@5.10.0