[PR #6311] Bump github.com/redis/go-redis/v9 from 9.7.3 to 9.20.0 #25376

Closed
opened 2026-08-05 07:05:55 -04:00 by saavagebueno · 0 comments
Owner

Original Pull Request: https://github.com/netbirdio/netbird/pull/6311

State: closed
Merged: No


Bumps github.com/redis/go-redis/v9 from 9.7.3 to 9.20.0.

Release notes

Sourced from github.com/redis/go-redis/v9's releases.

9.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

... (truncated)

Changelog

Sourced from github.com/redis/go-redis/v9's changelog.

9.20.0 (2026-05-28)

🚀 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-rc1 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

... (truncated)

Commits
  • 7d05dd3 chore(release): v9.20.0 (#3832)
  • 9756882 fix(test): make waitForSentinelClusterStable robust to disconnected r… (#3830)
  • 875ce21 fix(sentinel): do not close sentinel when replica list is empty (#3795)
  • 8a027f2 chore(ci): add govulncheck workflow (#3779)
  • d8407df fix(pubsub): include shard channels in newConn routing list (#3829)
  • 6af9bdc fix(cluster): fall back to origin port when CLUSTER SLOTS reports port 0 (#3828)
  • fa5aa8c chore(doc): Update README and CI image. (#3822)
  • fdcc6f9 refactor(keyPos): Enhance key position retrieval with CommandInfo caching (#3...
  • 68a8bc1 fix(sentinel): close non-winning sentinel clients in MasterAddr concurrent pr...
  • 00bf6d3 fix: avoid retrying ClusterClient Watch callback errors (#3821)
  • Additional commits viewable in compare view

Dependabot compatibility score

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


Dependabot commands and options

You can trigger Dependabot actions by commenting on this PR:

  • @dependabot rebase will rebase this PR
  • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
  • @dependabot show <dependency name> ignore conditions will show all of the ignore conditions of the specified dependency
  • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
**Original Pull Request:** https://github.com/netbirdio/netbird/pull/6311 **State:** closed **Merged:** No --- Bumps [github.com/redis/go-redis/v9](https://github.com/redis/go-redis) from 9.7.3 to 9.20.0. <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/redis/go-redis/releases">github.com/redis/go-redis/v9's releases</a>.</em></p> <blockquote> <h2>9.20.0</h2> <h2>🚀 Highlights</h2> <h3>Redis 8.8 Support</h3> <p>This release adds support for <strong>Redis 8.8</strong>. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the <code>8.8</code> client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).</p> <p>Coverage for the new commands that ship in the 8.x line, rounded out in this release:</p> <ul> <li><strong><code>AR*</code> array data type</strong> (<a href="https://redirect.github.com/redis/go-redis/pull/3813">#3813</a>) — new array data structure, exposed via the <code>ArrayCmdable</code> interface (see the experimental-features highlight below).</li> <li><strong><code>INCREX</code></strong> (<a href="https://redirect.github.com/redis/go-redis/pull/3816">#3816</a>) — atomic increment with expiration in a single round-trip.</li> <li><strong><code>XNACK</code></strong> (<a href="https://redirect.github.com/redis/go-redis/pull/3790">#3790</a>) — explicit negative-acknowledge of pending stream entries.</li> <li><strong><code>XAUTOCLAIM</code> PEL deletes</strong> (<a href="https://redirect.github.com/redis/go-redis/pull/3798">#3798</a>) — <code>XAUTOCLAIM</code>/<code>XAUTOCLAIMJUSTID</code> now return the list of deleted message IDs from the pending entries list.</li> <li><strong><code>TS.RANGE</code> multiple aggregators</strong> (<a href="https://redirect.github.com/redis/go-redis/pull/3791">#3791</a>) — <code>TS.RANGE</code>/<code>TS.REVRANGE</code>/<code>TS.MRANGE</code>/<code>TS.MREVRANGE</code> accept multiple aggregators in a single call.</li> <li><strong><code>Z(UNION|INTER|DIFF)</code> <code>COUNT</code> aggregator</strong> (<a href="https://redirect.github.com/redis/go-redis/pull/3802">#3802</a>) — <code>COUNT</code> reducer for sorted-set set operations.</li> <li><strong><code>JSON.SET FPHA</code></strong> (<a href="https://redirect.github.com/redis/go-redis/pull/3797">#3797</a>) — new <code>FPHA</code> argument that specifies the floating-point type for homogeneous FP arrays.</li> </ul> <p>CI image bump (<a href="https://redirect.github.com/redis/go-redis/pull/3814">#3814</a>) by <a href="https://github.com/ofekshenawa"><code>@​ofekshenawa</code></a>. Command coverage contributions by <a href="https://github.com/cxljs"><code>@​cxljs</code></a>, <a href="https://github.com/elena-kolevska"><code>@​elena-kolevska</code></a>, <a href="https://github.com/Khukharr"><code>@​Khukharr</code></a>, <a href="https://github.com/ndyakov"><code>@​ndyakov</code></a>, and <a href="https://github.com/ofekshenawa"><code>@​ofekshenawa</code></a>.</p> <h3>Stable RESP3 for RediSearch (<code>UnstableResp3</code> deprecated)</h3> <p><code>FT.SEARCH</code>, <code>FT.AGGREGATE</code>, <code>FT.INFO</code>, <code>FT.SPELLCHECK</code>, and <code>FT.SYNDUMP</code> now parse RESP3 (map) responses into the same typed result objects as RESP2 — <code>Val()</code> and <code>Result()</code> work uniformly on both protocols, no flag required. Previously, RESP3 search responses required <code>UnstableResp3: true</code> and were returned as opaque maps accessible only via <code>RawResult()</code> / <code>RawVal()</code>.</p> <p>As a result, the <code>UnstableResp3</code> option is now a <strong>no-op</strong> across every options struct (<code>Options</code>, <code>ClusterOptions</code>, <code>UniversalOptions</code>, <code>FailoverOptions</code>, <code>RingOptions</code>) and has been marked <code>// Deprecated:</code>. The field is retained for backwards compatibility — existing code that sets <code>UnstableResp3: true</code> will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. <code>RawResult()</code> / <code>RawVal()</code> continue to work for callers that prefer the raw RESP payload.</p> <p>(<a href="https://redirect.github.com/redis/go-redis/pull/3741">#3741</a>) by <a href="https://github.com/ndyakov"><code>@​ndyakov</code></a></p> <h3>Experimental Array Data Structure Commands</h3> <p>Adds an experimental <code>ArrayCmdable</code> interface with the <code>AR*</code> command family (<code>ARSet</code>, <code>ARGet</code>, <code>ARGetRange</code>, <code>ARMSet</code>, <code>ARMGet</code>, <code>ARDel</code>, <code>ARDelRange</code>, <code>ARScan</code>, <code>ARSeek</code>, <code>ARNext</code>, <code>ARLastItems</code>, <code>ARGrep</code>, <code>ARGrepWithValues</code>, <code>ARInfo</code>/<code>ARInfoFull</code>, and typed reducers <code>AROpSum</code>/<code>AROpMin</code>/<code>AROpMax</code>/<code>AROpAnd</code>/<code>AROpOr</code>/<code>AROpXor</code>/<code>AROpMatch</code>/<code>AROpUsed</code>) for working with Redis 8.8's new array data type. <strong>API is experimental and may change in a future release.</strong></p> <p>(<a href="https://redirect.github.com/redis/go-redis/pull/3813">#3813</a>) by <a href="https://github.com/cxljs"><code>@​cxljs</code></a></p> <h2>✨ New Features</h2> <ul> <li><strong>RESP3 search parser</strong>: First-class RESP3 parsing for <code>FT.SEARCH</code>/<code>FT.AGGREGATE</code>/<code>FT.INFO</code>/<code>FT.SPELLCHECK</code>/<code>FT.SYNDUMP</code> responses with backwards compatibility for RESP2 (<a href="https://redirect.github.com/redis/go-redis/pull/3741">#3741</a>) by <a href="https://github.com/ndyakov"><code>@​ndyakov</code></a></li> <li><strong>INCREX</strong>: New <code>INCREX</code> command support — atomic increment with expiration (<a href="https://redirect.github.com/redis/go-redis/pull/3816">#3816</a>) by <a href="https://github.com/ndyakov"><code>@​ndyakov</code></a></li> <li><strong>XNACK</strong>: Client support for the <code>XNACK</code> stream command for explicitly negative-acknowledging pending entries (<a href="https://redirect.github.com/redis/go-redis/pull/3790">#3790</a>) by <a href="https://github.com/elena-kolevska"><code>@​elena-kolevska</code></a></li> <li><strong>TS range multiple aggregators</strong>: <code>TS.RANGE</code>/<code>TS.REVRANGE</code>/<code>TS.MRANGE</code>/<code>TS.MREVRANGE</code> now accept multiple aggregators in a single call (<a href="https://redirect.github.com/redis/go-redis/pull/3791">#3791</a>) by <a href="https://github.com/elena-kolevska"><code>@​elena-kolevska</code></a></li> <li><strong><code>XAutoClaim</code> deleted IDs</strong>: <code>XAUTOCLAIM</code>/<code>XAUTOCLAIMJUSTID</code> now return the list of deleted message IDs from the PEL (<a href="https://redirect.github.com/redis/go-redis/pull/3798">#3798</a>) by <a href="https://github.com/Khukharr"><code>@​Khukharr</code></a></li> <li><strong><code>JSON.SET FPHA</code></strong>: <code>JSON.SET</code> accepts a new <code>FPHA</code> argument that specifies the floating-point type for homogeneous floating-point arrays (<a href="https://redirect.github.com/redis/go-redis/pull/3797">#3797</a>) by <a href="https://github.com/ndyakov"><code>@​ndyakov</code></a></li> <li><strong>Sorted-set union/intersection COUNT</strong>: <code>ZUNION</code>/<code>ZINTER</code>/<code>ZDIFF</code> aggregator now supports <code>COUNT</code> (<a href="https://redirect.github.com/redis/go-redis/pull/3802">#3802</a>) by <a href="https://github.com/ofekshenawa"><code>@​ofekshenawa</code></a></li> <li><strong><code>FT.HYBRID</code> vector validation</strong>: Validates hybrid-search vector input types and adds proper typed vector parameters (<a href="https://redirect.github.com/redis/go-redis/pull/3756">#3756</a>) by <a href="https://github.com/DengY11"><code>@���DengY11</code></a></li> <li><strong>Cluster pool wait stats</strong>: <code>ClusterClient.PoolStats()</code> now accumulates <code>WaitCount</code> and <code>WaitDurationNs</code> across all node pools (previously always zero) (<a href="https://redirect.github.com/redis/go-redis/pull/3809">#3809</a>) by <a href="https://github.com/LINKIWI"><code>@​LINKIWI</code></a></li> </ul> <h2>🐛 Bug Fixes</h2> <ul> <li><strong>TLS-only Cluster PubSub</strong>: <code>CLUSTER SLOTS</code> port-0 entries now fall back to the origin endpoint's port, fixing <code>dial tcp &lt;ip&gt;:0: connection refused</code> on TLS-only clusters started with <code>--port 0 --tls-port &lt;port&gt;</code> (fixes <a href="https://redirect.github.com/redis/go-redis/issues/3726">#3726</a>) (<a href="https://redirect.github.com/redis/go-redis/pull/3828">#3828</a>) by <a href="https://github.com/ndyakov"><code>@​ndyakov</code></a></li> <li><strong>Sharded PubSub reconnect routing</strong>: <code>PubSub.conn()</code> now passes both regular (<code>c.channels</code>) and sharded (<code>c.schannels</code>) channels into the per-PubSub <code>newConn</code> closure. Previously, <code>ClusterClient.SSubscribe</code>-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the <code>SSUBSCRIBE</code> was sent to the wrong shard, and the resulting <code>MOVED</code> reply was silently dropped (<a href="https://redirect.github.com/redis/go-redis/pull/3829">#3829</a>) by <a href="https://github.com/ndyakov"><code>@​ndyakov</code></a></li> <li><strong>ClusterClient <code>Watch</code> retry</strong>: User errors returned from a <code>Watch</code> callback are no longer subjected to cluster-retry classification; transient cluster errors still retry, but a callback returning e.g. <code>net.ErrClosed</code> short-circuits immediately (<a href="https://redirect.github.com/redis/go-redis/pull/3821">#3821</a>) by <a href="https://github.com/obiyang"><code>@​obiyang</code></a></li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/redis/go-redis/blob/master/RELEASE-NOTES.md">github.com/redis/go-redis/v9's changelog</a>.</em></p> <blockquote> <h1>9.20.0 (2026-05-28)</h1> <h2>🚀 Highlights</h2> <h3>Redis 8.8 Support</h3> <p>This release adds support for <strong>Redis 8.8</strong>. The README's supported-versions list now includes Redis 8.8 alongside 8.0/8.2/8.4, and CI exercises the <code>8.8-rc1</code> client-libs-test image across the full suite (Makefile, build workflow, doctests, run-tests action, and docker-compose).</p> <p>Coverage for the new commands that ship in the 8.x line, rounded out in this release:</p> <ul> <li><strong><code>AR*</code> array data type</strong> (<a href="https://redirect.github.com/redis/go-redis/pull/3813">#3813</a>) — new array data structure, exposed via the <code>ArrayCmdable</code> interface (see the experimental-features highlight below).</li> <li><strong><code>INCREX</code></strong> (<a href="https://redirect.github.com/redis/go-redis/pull/3816">#3816</a>) — atomic increment with expiration in a single round-trip.</li> <li><strong><code>XNACK</code></strong> (<a href="https://redirect.github.com/redis/go-redis/pull/3790">#3790</a>) — explicit negative-acknowledge of pending stream entries.</li> <li><strong><code>XAUTOCLAIM</code> PEL deletes</strong> (<a href="https://redirect.github.com/redis/go-redis/pull/3798">#3798</a>) — <code>XAUTOCLAIM</code>/<code>XAUTOCLAIMJUSTID</code> now return the list of deleted message IDs from the pending entries list.</li> <li><strong><code>TS.RANGE</code> multiple aggregators</strong> (<a href="https://redirect.github.com/redis/go-redis/pull/3791">#3791</a>) — <code>TS.RANGE</code>/<code>TS.REVRANGE</code>/<code>TS.MRANGE</code>/<code>TS.MREVRANGE</code> accept multiple aggregators in a single call.</li> <li><strong><code>Z(UNION|INTER|DIFF)</code> <code>COUNT</code> aggregator</strong> (<a href="https://redirect.github.com/redis/go-redis/pull/3802">#3802</a>) — <code>COUNT</code> reducer for sorted-set set operations.</li> <li><strong><code>JSON.SET FPHA</code></strong> (<a href="https://redirect.github.com/redis/go-redis/pull/3797">#3797</a>) — new <code>FPHA</code> argument that specifies the floating-point type for homogeneous FP arrays.</li> </ul> <p>CI image bump (<a href="https://redirect.github.com/redis/go-redis/pull/3814">#3814</a>) by <a href="https://github.com/ofekshenawa"><code>@​ofekshenawa</code></a>. Command coverage contributions by <a href="https://github.com/cxljs"><code>@​cxljs</code></a>, <a href="https://github.com/elena-kolevska"><code>@​elena-kolevska</code></a>, <a href="https://github.com/Khukharr"><code>@​Khukharr</code></a>, <a href="https://github.com/ndyakov"><code>@​ndyakov</code></a>, and <a href="https://github.com/ofekshenawa"><code>@​ofekshenawa</code></a>.</p> <h3>Stable RESP3 for RediSearch (<code>UnstableResp3</code> deprecated)</h3> <p><code>FT.SEARCH</code>, <code>FT.AGGREGATE</code>, <code>FT.INFO</code>, <code>FT.SPELLCHECK</code>, and <code>FT.SYNDUMP</code> now parse RESP3 (map) responses into the same typed result objects as RESP2 ��� <code>Val()</code> and <code>Result()</code> work uniformly on both protocols, no flag required. Previously, RESP3 search responses required <code>UnstableResp3: true</code> and were returned as opaque maps accessible only via <code>RawResult()</code> / <code>RawVal()</code>.</p> <p>As a result, the <code>UnstableResp3</code> option is now a <strong>no-op</strong> across every options struct (<code>Options</code>, <code>ClusterOptions</code>, <code>UniversalOptions</code>, <code>FailoverOptions</code>, <code>RingOptions</code>) and has been marked <code>// Deprecated:</code>. The field is retained for backwards compatibility — existing code that sets <code>UnstableResp3: true</code> will continue to compile and behave identically — but it will be removed in a future release and new code should not set it. <code>RawResult()</code> / <code>RawVal()</code> continue to work for callers that prefer the raw RESP payload.</p> <p>(<a href="https://redirect.github.com/redis/go-redis/pull/3741">#3741</a>) by <a href="https://github.com/ndyakov"><code>@​ndyakov</code></a></p> <h3>Experimental Array Data Structure Commands</h3> <p>Adds an experimental <code>ArrayCmdable</code> interface with the <code>AR*</code> command family (<code>ARSet</code>, <code>ARGet</code>, <code>ARGetRange</code>, <code>ARMSet</code>, <code>ARMGet</code>, <code>ARDel</code>, <code>ARDelRange</code>, <code>ARScan</code>, <code>ARSeek</code>, <code>ARNext</code>, <code>ARLastItems</code>, <code>ARGrep</code>, <code>ARGrepWithValues</code>, <code>ARInfo</code>/<code>ARInfoFull</code>, and typed reducers <code>AROpSum</code>/<code>AROpMin</code>/<code>AROpMax</code>/<code>AROpAnd</code>/<code>AROpOr</code>/<code>AROpXor</code>/<code>AROpMatch</code>/<code>AROpUsed</code>) for working with Redis 8.8's new array data type. <strong>API is experimental and may change in a future release.</strong></p> <p>(<a href="https://redirect.github.com/redis/go-redis/pull/3813">#3813</a>) by <a href="https://github.com/cxljs"><code>@​cxljs</code></a></p> <h2>✨ New Features</h2> <ul> <li><strong>RESP3 search parser</strong>: First-class RESP3 parsing for <code>FT.SEARCH</code>/<code>FT.AGGREGATE</code>/<code>FT.INFO</code>/<code>FT.SPELLCHECK</code>/<code>FT.SYNDUMP</code> responses with backwards compatibility for RESP2 (<a href="https://redirect.github.com/redis/go-redis/pull/3741">#3741</a>) by <a href="https://github.com/ndyakov"><code>@​ndyakov</code></a></li> <li><strong>INCREX</strong>: New <code>INCREX</code> command support — atomic increment with expiration (<a href="https://redirect.github.com/redis/go-redis/pull/3816">#3816</a>) by <a href="https://github.com/ndyakov"><code>@​ndyakov</code></a></li> <li><strong>XNACK</strong>: Client support for the <code>XNACK</code> stream command for explicitly negative-acknowledging pending entries (<a href="https://redirect.github.com/redis/go-redis/pull/3790">#3790</a>) by <a href="https://github.com/elena-kolevska"><code>@​elena-kolevska</code></a></li> <li><strong>TS range multiple aggregators</strong>: <code>TS.RANGE</code>/<code>TS.REVRANGE</code>/<code>TS.MRANGE</code>/<code>TS.MREVRANGE</code> now accept multiple aggregators in a single call (<a href="https://redirect.github.com/redis/go-redis/pull/3791">#3791</a>) by <a href="https://github.com/elena-kolevska"><code>@​elena-kolevska</code></a></li> <li><strong><code>XAutoClaim</code> deleted IDs</strong>: <code>XAUTOCLAIM</code>/<code>XAUTOCLAIMJUSTID</code> now return the list of deleted message IDs from the PEL (<a href="https://redirect.github.com/redis/go-redis/pull/3798">#3798</a>) by <a href="https://github.com/Khukharr"><code>@​Khukharr</code></a></li> <li><strong><code>JSON.SET FPHA</code></strong>: <code>JSON.SET</code> accepts a new <code>FPHA</code> argument that specifies the floating-point type for homogeneous floating-point arrays (<a href="https://redirect.github.com/redis/go-redis/pull/3797">#3797</a>) by <a href="https://github.com/ndyakov"><code>@​ndyakov</code></a></li> <li><strong>Sorted-set union/intersection COUNT</strong>: <code>ZUNION</code>/<code>ZINTER</code>/<code>ZDIFF</code> aggregator now supports <code>COUNT</code> (<a href="https://redirect.github.com/redis/go-redis/pull/3802">#3802</a>) by <a href="https://github.com/ofekshenawa"><code>@​ofekshenawa</code></a></li> <li><strong><code>FT.HYBRID</code> vector validation</strong>: Validates hybrid-search vector input types and adds proper typed vector parameters (<a href="https://redirect.github.com/redis/go-redis/pull/3756">#3756</a>) by <a href="https://github.com/DengY11"><code>@​DengY11</code></a></li> <li><strong>Cluster pool wait stats</strong>: <code>ClusterClient.PoolStats()</code> now accumulates <code>WaitCount</code> and <code>WaitDurationNs</code> across all node pools (previously always zero) (<a href="https://redirect.github.com/redis/go-redis/pull/3809">#3809</a>) by <a href="https://github.com/LINKIWI"><code>@​LINKIWI</code></a></li> </ul> <h2>🐛 Bug Fixes</h2> <ul> <li><strong>TLS-only Cluster PubSub</strong>: <code>CLUSTER SLOTS</code> port-0 entries now fall back to the origin endpoint's port, fixing <code>dial tcp &lt;ip&gt;:0: connection refused</code> on TLS-only clusters started with <code>--port 0 --tls-port &lt;port&gt;</code> (fixes <a href="https://redirect.github.com/redis/go-redis/issues/3726">#3726</a>) (<a href="https://redirect.github.com/redis/go-redis/pull/3828">#3828</a>) by <a href="https://github.com/ndyakov"><code>@​ndyakov</code></a></li> <li><strong>Sharded PubSub reconnect routing</strong>: <code>PubSub.conn()</code> now passes both regular (<code>c.channels</code>) and sharded (<code>c.schannels</code>) channels into the per-PubSub <code>newConn</code> closure. Previously, <code>ClusterClient.SSubscribe</code>-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), the <code>SSUBSCRIBE</code> was sent to the wrong shard, and the resulting <code>MOVED</code> reply was silently dropped (<a href="https://redirect.github.com/redis/go-redis/pull/3829">#3829</a>) by <a href="https://github.com/ndyakov"><code>@​ndyakov</code></a></li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/redis/go-redis/commit/7d05dd3b7ce12a7b8c7923f73da0fede3bfa7c03"><code>7d05dd3</code></a> chore(release): v9.20.0 (<a href="https://redirect.github.com/redis/go-redis/issues/3832">#3832</a>)</li> <li><a href="https://github.com/redis/go-redis/commit/97568827124c58f1338d78b9535edc0eb9435453"><code>9756882</code></a> fix(test): make waitForSentinelClusterStable robust to disconnected r… (<a href="https://redirect.github.com/redis/go-redis/issues/3830">#3830</a>)</li> <li><a href="https://github.com/redis/go-redis/commit/875ce21e4862a7913edb5308b16869141ce5e833"><code>875ce21</code></a> fix(sentinel): do not close sentinel when replica list is empty (<a href="https://redirect.github.com/redis/go-redis/issues/3795">#3795</a>)</li> <li><a href="https://github.com/redis/go-redis/commit/8a027f21ba2686511e1a6a159f0c6888f11d48e7"><code>8a027f2</code></a> chore(ci): add govulncheck workflow (<a href="https://redirect.github.com/redis/go-redis/issues/3779">#3779</a>)</li> <li><a href="https://github.com/redis/go-redis/commit/d8407df30af7eba2c24280791fed4b8bd3e62c97"><code>d8407df</code></a> fix(pubsub): include shard channels in newConn routing list (<a href="https://redirect.github.com/redis/go-redis/issues/3829">#3829</a>)</li> <li><a href="https://github.com/redis/go-redis/commit/6af9bdc84ba25303f2b9dd9949055ee6224c6d96"><code>6af9bdc</code></a> fix(cluster): fall back to origin port when CLUSTER SLOTS reports port 0 (<a href="https://redirect.github.com/redis/go-redis/issues/3828">#3828</a>)</li> <li><a href="https://github.com/redis/go-redis/commit/fa5aa8c4d26a0983f16ebc537696150d80bfc8f0"><code>fa5aa8c</code></a> chore(doc): Update README and CI image. (<a href="https://redirect.github.com/redis/go-redis/issues/3822">#3822</a>)</li> <li><a href="https://github.com/redis/go-redis/commit/fdcc6f9221e6d447b1c1a50d946c74d8db51cda3"><code>fdcc6f9</code></a> refactor(keyPos): Enhance key position retrieval with CommandInfo caching (<a href="https://redirect.github.com/redis/go-redis/issues/3">#3</a>...</li> <li><a href="https://github.com/redis/go-redis/commit/68a8bc1e8457d796d35cae34435529cd6e56a762"><code>68a8bc1</code></a> fix(sentinel): close non-winning sentinel clients in MasterAddr concurrent pr...</li> <li><a href="https://github.com/redis/go-redis/commit/00bf6d3edc1f50cce7a81d6a11a580cb060fce56"><code>00bf6d3</code></a> fix: avoid retrying ClusterClient Watch callback errors (<a href="https://redirect.github.com/redis/go-redis/issues/3821">#3821</a>)</li> <li>Additional commits viewable in <a href="https://github.com/redis/go-redis/compare/v9.7.3...v9.20.0">compare view</a></li> </ul> </details> <br /> [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/redis/go-redis/v9&package-manager=go_modules&previous-version=9.7.3&new-version=9.20.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) --- <details> <summary>Dependabot commands and options</summary> <br /> You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) </details>
saavagebueno added the pull-request label 2026-08-05 07:05:55 -04:00
Sign in to join this conversation.
No Label pull-request
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: DYNR/netbird#25376