releases.shpreview
Home/Redis
Redis

Redis

RESP3 now default; Node.js 20 minimum; Redis 8.8 commands added

This release11 featuresNew capabilities3 enhancementsImprovements to existing features6 fixesBug fixesAI-tallied from the release notes
node-redis · 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) 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

  • 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-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

RESP3 now default wire protocol; async cluster pubsub added

This release9 featuresNew capabilities5 enhancementsImprovements to existing features8 fixesBug fixesAI-tallied from the release notes
redis-py · v8.0.0

Changes

🚀 Highlights

Async Cluster PubSub

This release introduces full asyncio Cluster PubSub support, bringing shard-channel capabilities (SSUBSCRIBE, SUNSUBSCRIBE, SPUBLISH) to the async RedisCluster client. The new ClusterPubSub class in redis.asyncio.cluster automatically routes shard-channel subscriptions to the correct cluster node based on key-slot hashing, manages per-node PubSub connections, and supports round-robin message retrieval across nodes. Users can create a cluster pubsub instance via RedisCluster.pubsub() and use ssubscribe(), sunsubscribe(), and get_sharded_message() just as they would with the sync cluster client.

Keyspace and subkey notifications

Redis Keyspace Notifications are now supported for standalone and cluster deployments in both sync and async modes. New classes — KeyspaceNotifications, ClusterKeyspaceNotifications, AsyncKeyspaceNotifications, and AsyncClusterKeyspaceNotifications — provide a high-level API for keyspace/keyevent subscriptions and subkey notification families: subkeyspace, subkeyevent, subkeyspaceitem, and subkeyspaceevent. Convenience methods like subscribe_keyspace(), subscribe_keyevent(), subscribe_subkeyspace(), subscribe_subkeyevent(), subscribe_subkeyspaceitem(), and subscribe_subkeyspaceevent() simplify common patterns, with channel classes for both key and subkey channels.

In cluster mode, subscriptions are managed across primary nodes because each node emits notifications only for keys it owns, with built-in topology-change handling. Sync run_in_thread() and async listen() workflows are supported.

Redis Array commands(https://redis.io/docs/latest/develop/data-types/arrays/)

redis-py now supports Redis Arrays, a preview Redis data type for sparse, index-addressable sequences of strings. New AR* command helpers cover indexed reads/writes, range scans, deletion, cursor-based insertion, ring-buffer writes, metadata, text search, and aggregation, including ARGET, ARSET, ARMGET, ARMSET, ARSCAN, ARGREP, ARRING, and AROP.

Type Hints Improvements (breaking changes)

The @overload pattern has been applied systematically across core commands (core.py), VectorSet commands, and module commands (Search, JSON, TimeSeries, Bloom filters) to provide distinct return types for sync and async clients. Previously, methods returned a combined ResponseT (i.e., Union[Awaitable[Any], Any]), which caused static analysis tools like mypy and Pyright to flag false positives. Now, sync clients see concrete return types (e.g., int, bool, list[str]) while async clients see Awaitable[...] wrappers. This is a breaking change for type-checking only—runtime behavior is unchanged, but code relying on the old union return types in type annotations may need updates. Two new protocol types, SyncClientProtocol and AsyncClientProtocol, are used in overload signatures to enable this distinction.

RESP3 by default with opt-in unified responses

redis-py 8.0.0 now uses RESP3 on the wire by default while preserving legacy RESP2-compatible Python response shapes for existing applications (#4052). Protocol-independent unified response shapes are available by setting legacy_responses=False, so affected commands return the same Python structure with RESP2 or RESP3.

Use protocol=2 to force RESP2 on the wire, protocol=3 to opt into native RESP3 response shapes, or legacy_responses=False to migrate to unified responses. See docs/unified_responses.rst and specs/unified_responses_migration_guide.md for the affected commands and migration details.

Connection and retry defaults

Default connection settings were updated: socket_timeout and socket_connect_timeout now default to 5 seconds, TCP keepalive is enabled by default, socket reads use a 32 KB buffer, connection pools default to max_connections=100, and retry defaults now use 10 attempts with exponential jitter backoff.

Note: socket_timeout can affect blocking commands such as BLPOP/BRPOP; if a command blocks longer than the client socket timeout, it may raise TimeoutError before the command timeout elapses (#2807).

🧪 Experimental Features

  • Added support for new array commands (#4055)

🚀 New Features

  • Support Cluster PubSub in asyncio (#3736)
  • Add Redis Keyspace Notifications Support for Redis Cluster (#3962)
  • Add random load balancing strategy which allows for use of the primary (#4027)
  • Add FPHA (floating-point homogeneous array) arg support to JSON.SET (#4011)
  • Added custom Claude command + XNACK command support (#4030)
  • Adding Time Series Multiple Aggregators support (#4035)
  • Adding support for new COUNT aggregator for some sorted set commands - ZINTER, ZINTERSTORE, ZUNION, ZUNIONSTORE (#4034)
  • Adding support for new INCREX command (#4067 #4077)
  • Add support for PubSub subscriptions with binary channel names and handlers (#4068)

🔥 Breaking changes

  • Type hints improvements - fixing static code analysis issues related to combined sync and async return types(vectorsets + commands in core.py) (#3991)
  • Type hints improvements - fixing static code analysis issues related to combined sync and async return types - modules (#4005)
  • Add Redis Keyspace Notifications Support for Redis Cluster (#3962)
  • Added support for subkey notifications (#4040)
  • Changing the default protocol used to RESP3, keeping the responses for the default config compatible with the current RESP2 shape. Adding the possibility to opt-in for unified responses for both protocols. (#4025 #4031 #4052 #4046)
  • Type Lock.extend and Lock.reacquire as Literal[True] (#4045)
  • Handle cluster slot migration in ClusterPubSub (shard subscription reconciliation) (#4044)
  • Avoid zero-timeout async reads in hiredis connections readiness checks and replace async's can_read_destructive with non-destructive can_read. (#4063)
  • Updates in default connection and retry settings (#4082)

🐛 Bug Fixes

  • fix: guard disconnect() against RuntimeError on Python 3.13+ (#3856) (#4013)
  • Fix CacheProxyConnection hang when invalidation arrives on another connection (#3600) (#4014)
  • fix: handle scientific notation in score_cast_func for RESP2 (#4016)
  • Fix TypeError in CacheProxyConnection when cached response is non-bytes (#4017)
  • Fix async cluster connection cleanup on topology refresh (#4057)
  • Normalize scalar prefixes in IndexDefinition (#3983)
  • Avoid zero-timeout async reads in hiredis connections readiness checks and replace async's can_read_destructive with non-destructive can_read. (#4063)
  • Preserve explicit None for client metadata config (#4081)

⚠️ Deprecations

  • Align deprecation of lib_name/lib_version in async cluster (#3995)
  • Add deprecation notice to setex() method documentation (#4051)
  • Avoid zero-timeout async reads in hiredis connections readiness checks and replace async's can_read_destructive with non-destructive can_read. (#4063)

🧰 Maintenance

  • Adding unstable 8.8 build to pipeline test matrix. Updating the lib version in master. (#4004)
  • Fix type hints for register_script to support RedisCluster (#3876)
  • Updating dependencies to fix reported vulnerabilities (#4012)
  • Bump release-drafter/release-drafter from 6 to 7 (#4019)
  • Bump rojopolis/spellcheck-github-actions from 0.58.0 to 0.60.0 (#4018)
  • Reorganize unit tests grouping - extracting the tests that define their hardcoded client configuration separately (#4029)
  • Update home_json.py - this will make the docs examples interactive (#4020)
  • Fix Sync ClusterPubSub.disconnect() — Potential AttributeError (#4036)
  • Refactor ClusterPubSub to reuse NodesManager-managed connections. (#4037)
  • Fix CROSSSLOT on sharded pubsub resubscription by grouping channels per slot (#4038)
  • fix(cluster): enable health check in ClusterNode command execution (#4043)
  • Add Python version '3.14t' to CI matrix (#4058)
  • docs: fix typos in messages, docstrings, and comments (#4062)
  • Updating hash commands type hints and jsonget return type hints (#4054)
  • Fix flaky tests (#4071)
  • Add CLAUDE.md and /sync-claude-md skill for managing (#4066)
  • Randomize cluster startup node order during topology refresh (#4060)

We'd like to thank all the contributors who worked on this release! @hydroblaze @Br1an67 @mokashang @swoutch @armorbreak001 @Brumbelow @paoloredis @Pack-Yak1 @abersheeran @alisaifee @majiayu000 @uglide @dmaier-redislabs @vladvildanov @petyaslavova

go-redis · v9.20.0

🚀 Highlights

Redis 8.8 Support

This release adds support for Redis 8.8. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the 8.8 client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).

Coverage for the new commands that ship in the 8.x line, rounded out in this release:

  • AR* array data type (#3813) — new array data structure, exposed via the ArrayCmdable interface (see the experimental-features highlight below).
  • INCREX (#3816) — atomic increment with expiration in a single round-trip.
  • XNACK (#3790) — explicit negative-acknowledge of pending stream entries.
  • XAUTOCLAIM PEL deletes (#3798) — XAUTOCLAIM/XAUTOCLAIMJUSTID now return the list of deleted message IDs from the pending entries list.
  • TS.RANGE multiple aggregators (#3791) — TS.RANGE/TS.REVRANGE/TS.MRANGE/TS.MREVRANGE accept multiple aggregators in a single call.
  • Z(UNION|INTER|DIFF) COUNT aggregator (#3802) — COUNT reducer for sorted-set set operations.
  • JSON.SET FPHA (#3797) — new FPHA argument that specifies the floating-point type for homogeneous FP arrays.

CI image bump (#3814) by @ofekshenawa. Command coverage contributions by @cxljs, @elena-kolevska, @Khukharr, @ndyakov, and @ofekshenawa.

Stable RESP3 for RediSearch (UnstableResp3 deprecated)

FT.SEARCH, FT.AGGREGATE, FT.INFO, FT.SPELLCHECK, and FT.SYNDUMP now parse RESP3 (map) responses into the same typed result objects as RESP2 — Val() and Result() work uniformly on both protocols, no flag required. Previously, RESP3 search responses required UnstableResp3: true and were returned as opaque maps accessible only via RawResult() / RawVal().

As a result, the UnstableResp3 option is now a no-op across every options struct (Options, ClusterOptions, UniversalOptions, FailoverOptions, RingOptions) and has been marked // Deprecated:. The field is retained for backwards compatibility — existing code that sets UnstableResp3: true will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. RawResult() / RawVal() continue to work for callers that prefer the raw RESP payload.

(#3741) by @ndyakov

Experimental Array Data Structure Commands

Adds an experimental ArrayCmdable interface with the AR* command family (ARSet, ARGet, ARGetRange, ARMSet, ARMGet, ARDel, ARDelRange, ARScan, ARSeek, ARNext, ARLastItems, ARGrep, ARGrepWithValues, ARInfo/ARInfoFull, and typed reducers AROpSum/AROpMin/AROpMax/AROpAnd/AROpOr/AROpXor/AROpMatch/AROpUsed) for working with Redis 8.8's new array data type. API is experimental and may change in a future release.

(#3813) by @cxljs

✨ New Features

  • RESP3 search parser: First-class RESP3 parsing for FT.SEARCH/FT.AGGREGATE/FT.INFO/FT.SPELLCHECK/FT.SYNDUMP responses with backwards compatibility for RESP2 (#3741) by @ndyakov
  • INCREX: New INCREX command support — atomic increment with expiration (#3816) by @ndyakov
  • XNACK: Client support for the XNACK stream command for explicitly negative-acknowledging pending entries (#3790) by @elena-kolevska
  • TS range multiple aggregators: TS.RANGE/TS.REVRANGE/TS.MRANGE/TS.MREVRANGE now accept multiple aggregators in a single call (#3791) by @elena-kolevska
  • XAutoClaim deleted IDs: XAUTOCLAIM/XAUTOCLAIMJUSTID now return the list of deleted message IDs from the PEL (#3798) by @Khukharr
  • JSON.SET FPHA: JSON.SET accepts a new FPHA argument that specifies the floating-point type for homogeneous floating-point arrays (#3797) by @ndyakov
  • Sorted-set union/intersection COUNT: ZUNION/ZINTER/ZDIFF aggregator now supports COUNT (#3802) by @ofekshenawa
  • FT.HYBRID vector validation: Validates hybrid-search vector input types and adds proper typed vector parameters (#3756) by @DengY11
  • Cluster pool wait stats: ClusterClient.PoolStats() now accumulates WaitCount and WaitDurationNs across all node pools (previously always zero) (#3809) by @LINKIWI

🐛 Bug Fixes

  • TLS-only Cluster PubSub: CLUSTER SLOTS port-0 entries now fall back to the origin endpoint's port, fixing dial tcp <ip>:0: connection refused on TLS-only clusters started with --port 0 --tls-port <port> (fixes #3726) (#3828) by @ndyakov
  • Sharded PubSub reconnect routing: PubSub.conn() now passes both regular (c.channels) and sharded (c.schannels) channels into the per-PubSub newConn closure. Previously, ClusterClient.SSubscribe-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the SSUBSCRIBE was sent to the wrong shard, and the resulting MOVED reply was silently dropped (#3829) by @ndyakov
  • ClusterClient Watch retry: User errors returned from a Watch callback are no longer subjected to cluster-retry classification; transient cluster errors still retry, but a callback returning e.g. net.ErrClosed short-circuits immediately (#3821) by @obiyang
  • Sentinel concurrent-probe leak: MasterAddr's concurrent sentinel probe now closes the non-winning sentinel clients instead of leaking them (#3827) by @cxljs
  • Sentinel rediscovery loop on master-only setups: replicaAddrs no longer tears down the cached sentinel client when the replica list is empty, eliminating a continuous rediscovery loop on master-only Sentinel deployments that flooded logs and added per-operation latency (#3795) by @shahyash2609
  • Pool CloseConn hooks: Pool.CloseConn now triggers registered hooks, fixing a memory leak when connections are closed explicitly rather than via the normal removal path (#3818) by @ndyakov
  • Dial TCP error redirection: Wrapped dial tcp errors are now correctly classified as redirectable so cluster routing can recover from a single unreachable node (#3810) by @vladisa88
  • Pool Close health checks: ConnPool.Close now only runs health checks against idle connections, avoiding spurious activity on connections still in use (#3805) by @ndyakov
  • VLinks return type: Fixed the return type of VLINKS/VLINKSWITHSCORES vector-set replies (#3820) by @romanpovol

🧪 Testing & Infrastructure

  • Flaky tests: Stabilized several flaky tests in the sentinel and pool suites (#3815) by @ndyakov
  • Sentinel failover metric race: Fixed a data race in the sentinel failover metric test (#3824) by @cxljs
  • waitForSentinelClusterStable post-conditions: The sentinel test harness now waits for replicas to be fully connected (not just present in the count) and is robust to randomized spec ordering after failover specs, eliminating an intermittent Expected master to equal slave flake (#3830) by @ndyakov
  • govulncheck workflow: New scheduled GitHub Actions workflow runs govulncheck on every push, PR, and weekly, surfacing newly disclosed Go vulnerabilities even when no code changes (#3779) by @solardome
  • CI Redis 8.8-rc1: CI now exercises the 8.8-rc1 Redis image (#3814) by @ofekshenawa

🧰 Maintenance

  • Cmd.Slot() lookup refactor: Caches the per-command CommandInfo and short-circuits keyless commands before the switch dispatch, removing redundant Peek calls (#3804) by @retr0-kernel
  • stdlib math/rand: Replaced internal/rand with math/rand from the standard library now that the minimum Go version is 1.24 (#3823) by @cxljs
  • ConnPool queue channel: Removed the unused queue channel from ConnPool, trimming the pool's footprint (#3826) by @cxljs
  • Extra packages LICENSE: Added a LICENSE file to each extra/* package (#3817) by @ndyakov
  • README & CI image: Documentation refresh and bumped the default CI image tag (#3822) by @ndyakov

👥 Contributors

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

@cxljs, @DengY11, @elena-kolevska, @Khukharr, @LINKIWI, @ndyakov, @obiyang, @ofekshenawa, @retr0-kernel, @romanpovol, @shahyash2609, @solardome, @vladisa88


Full Changelog: https://github.com/redis/go-redis/compare/v9.19.0...v9.20.0

Array data structure ships; hash fields get notifications

This release9 featuresNew capabilities1 enhancementImprovements to existing features4 fixesBug fixesAI-tallied from the release notes
redis · v8.8.0

This is the General Availability release of Redis 8.8 in Redis Open Source.

Major changes compared to 8.6
  • New data structure: Array (@antirez)
  • Subkey notification for hash fields - field-level notifications
  • INCREX: a window counter rate limiter combining INCR, INCRBY, INCRBYFLOAT, bounds, and expiration (@raffertyyu + Redis team)
  • XNACK: a new streams command - allow consumers to explicitly release pending messages
  • ZUNION, ZINTER, ZUNIONSTORE, ZINTERSTORE: new COUNT aggregator
  • JSON.SET: new FPHA argument to specify the FP type for homogeneous FP arrays
  • TS.RANGE, TS.REVRANGE, TS.MRANGE, TS.MREVRANGE: multiple aggregators in a single command
  • FT.HYBRID KNN clause: new argument to request fewer candidates per shard
  • FT.PROFILE HYBRID: profiling support for FT.HYBRID
  • Performance improvements
Binary distributions
Operating systems we test Redis 8.8 on
  • Ubuntu 22.04 (Jammy Jellyfish), 24.04 (Noble Numbat), 26.04 (Resolute Raccoon)
  • Rocky Linux 8.10, 9.7, 10.1
  • AlmaLinux 8.10, 9.7, 10.1
  • Debian 12.13 (Bookworm), Debian 13.4 (Trixie)
  • Alpine 3.23
  • macOS 14.8.4 (Sonoma), 15.7.4 (Sequoia), 26.3 (Tahoe) - for both Intel and ARM
Bug fixes (compared to 8.8-RC1)
  • #15237 INCREX syntax update
  • #15005 Memory tracking can be enabled at runtime in non-clustered mode
  • RedisTimeSeries/RedisTimeSeries#1930 Cluster topology changes during a multi-shard command are not handled (MOD-14439)
  • RedisBloom/RedisBloom#1007 Memory leak on RDB load (MOD-15418)
Last Checked
3h ago
Domain
redis.io
Tracking since May 1, 2020