Skip to content

Bump redis from 4.7.1 to 6.2.0 - #708

Merged
MikeyPetrillo merged 1 commit into
mainfrom
dependabot/npm_and_yarn/redis-6.2.0
Aug 9, 2026
Merged

Bump redis from 4.7.1 to 6.2.0#708
MikeyPetrillo merged 1 commit into
mainfrom
dependabot/npm_and_yarn/redis-6.2.0

Conversation

@dependabot

@dependabot dependabot Bot commented on behalf of github Aug 7, 2026

Copy link
Copy Markdown
Contributor

Bumps redis from 4.7.1 to 6.2.0.

Release notes

Sourced from redis's releases.

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.

⚠️ 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

⚠️ 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

... (truncated)

Commits

@dependabot @github

dependabot Bot commented on behalf of github Aug 7, 2026

Copy link
Copy Markdown
Contributor Author

Labels

The following labels could not be found: dependencies. Please create it before Dependabot can add it to a pull request.

Please fix the above issues or remove invalid values from dependabot.yml.

@socket-security

socket-security Bot commented Aug 7, 2026

Copy link
Copy Markdown

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

Diff Package Supply Chain
Security
Vulnerability Quality Maintenance License
Updatednpm/​redis@​4.7.1 ⏵ 6.2.0100 +110010097 +3100

View full report

@dependabot
dependabot Bot force-pushed the dependabot/npm_and_yarn/redis-6.2.0 branch from 7529fca to e962c0d Compare August 7, 2026 13:11
MikeyPetrillo added a commit that referenced this pull request Aug 7, 2026
…cted to one

Dependabot's redis 4 -> 6 (#708) is two majors on the library behind
src/cache.js and src/shared-limit.js, and its CI was green. That green was
worth nothing: no workflow ran a redis, and test-shared-limit.js injects a fake
store on purpose - it proves "two callers share one counter", and a fake proves
that exactly - so the CLIENT path was never exercised. createClient options,
connect, command shapes, quit: all untested. Same worthless green as the
tesseract 5 -> 7 trap, which passed 210 assertions while silently emptying a
paid tool's output.

It matters because prod is NOT in-memory. Verified against Railway rather than
against notes: REDIS_URL and RATE_LIMIT_REPLICAS are both set on the production
service and the project runs a dedicated Redis. The shared limiter FAILS
CLOSED, so a client regression refuses trials rather than degrading quietly.
The memory note claiming "prod is in-memory, low risk, take anytime" was wrong
in the reassuring direction and would have merged the bump.

So: a redis service container on the test job, and an integration test that
drives the real client - cap-of-1 across callers, the over-limit decrement,
refund flooring, and a cache set/get round trip. It asserts degraded === false,
because the fail-closed path would otherwise let every assertion pass for the
wrong reason with no server at all.

It REQUIRES a server and exits 1 without one. It does not skip: a skipped
integration test is precisely why this went untested, and "no redis in CI"
means the service container is gone, which is the regression this guards.

Caught while writing it: peek() returns { limited, count, degraded }, not
`.used` as I had assumed - read the source instead of guessing, since a wrong
assertion here would have looked like a redis failure.

NOT verified locally (no redis or docker on this machine), so CI is the first
real run. Flagged rather than glossed.

This makes #708 decidable instead of a coin flip.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@MikeyPetrillo

Copy link
Copy Markdown
Owner

Holding this until it can be decided on evidence rather than a green badge.

As of #714 the test job runs a real redis:7-alpine service container and scripts/test-redis-integration.js, which drives the actual client: cap-of-1 across callers, the over-limit decrement, refund flooring, and a cache set/get round trip. Before that, nothing in CI had ever connected to a redis — test-shared-limit.js injects a fake store by design — so a green run on a two-major client bump proved nothing about createClient, connect, or the command shapes.

This matters because production is not in-memory: REDIS_URL and RATE_LIMIT_REPLICAS are both set on the production service, redis backs src/cache.js and src/shared-limit.js, and the shared limiter fails CLOSED — a client regression refuses trials rather than degrading quietly.

@dependabot rebase — so this PR picks up the new coverage and its CI actually exercises redis 6.

Bumps [redis](https://github.com/redis/node-redis) from 4.7.1 to 6.2.0.
- [Release notes](https://github.com/redis/node-redis/releases)
- [Changelog](https://github.com/redis/node-redis/blob/master/CHANGELOG.md)
- [Commits](https://github.com/redis/node-redis/compare/redis@4.7.1...redis@6.2.0)

---
updated-dependencies:
- dependency-name: redis
  dependency-version: 6.2.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot
dependabot Bot force-pushed the dependabot/npm_and_yarn/redis-6.2.0 branch from e962c0d to ae1b211 Compare August 7, 2026 14:57

@MikeyPetrillo MikeyPetrillo left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed: redis 4.7.1→6.2.0 is API-compatible with our createClient/connect/incr/get/set usage. Real redis CI (test-redis-integration.js) passed 11/11 after rebase. Not on the settlement path; shared-limit stays fail-closed. Safe to merge as maintenance.

@MikeyPetrillo
MikeyPetrillo merged commit 5fbd0ba into main Aug 9, 2026
19 checks passed
@MikeyPetrillo
MikeyPetrillo deleted the dependabot/npm_and_yarn/redis-6.2.0 branch August 9, 2026 16:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant