go-redis/redis (github.com/go-redis/redis/v7)
Compare Source
This is a patch release containing bug fixes only. There are no new features or breaking changes; upgrading from 9.20.0 is a drop-in replacement.
🚀 Highlights
RESP3 pub/sub message loss fixed
PeekPushNotificationName previously inspected only the bytes already buffered by bufio, so when a push frame header straddled a buffer fill boundary it could return a truncated notification name (e.g. "messa" instead of "message"). The push processor then mis-routed the frame and ReadReply silently dropped it, causing intermittent RESP3 pub/sub message loss. The peek now grows its window (36 bytes → up to 4 KiB) and reads more from the connection until the header is complete, cleanly separating incomplete prefixes from corrupt frames (including overflow-safe bulk-length handling). Fixes #3839.
(#3842) by @ndyakov
🐛 Bug Fixes
- RESP3 push peeking:
PeekPushNotificationName no longer returns a truncated notification name when a push frame header spans a buffer boundary, preventing silent RESP3 pub/sub message loss (fixes #3839) (#3842) by @ndyakov
FT.HYBRID vector params: Vector data is now always sent via PARAMS with auto-generated param names (__vector_param_N, with collision avoidance) when VectorParamName is omitted, since Redis no longer accepts inline vector blobs; the FTHybridOptions.Params map is no longer mutated, so the same options struct can be reused across calls (#3844) by @ndyakov
CLUSTER SHARDS forward compatibility: Unknown shard- and node-level attributes in the CLUSTER SHARDS reply are now skipped via DiscardNext() instead of erroring, so clients keep working when the server introduces new fields (#3843) by @madolson
- PubSub double reconnect:
PubSub.releaseConn no longer reconnects twice when a connection is both unusable (or pending handoff) and reports a bad-connection error, avoiding a wasted connection establish-then-close cycle (#3833) by @cxljs
👥 Contributors
We'd like to thank all the contributors who worked on this release!
@cxljs, @madolson, @ndyakov
Full Changelog: redis/go-redis@v9.20.0...v9.20.1
Compare Source
🚀 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: redis/go-redis@v9.19.0...v9.20.0
Compare Source
🚀 Highlights
FIPS-Compatible Script Helper
Script now supports a FIPS-safe execution mode that avoids client-side SHA-1 computation, which is blocked in strict FIPS environments. A new NewScriptServerSHA constructor uses SCRIPT LOAD to obtain and cache the digest from the server, then runs commands via EVALSHA/EVALSHA_RO. Falls back to EVAL/EVALRO if loading fails, and transparently retries once on NOSCRIPT. The default behavior is unchanged for existing users.
(#3700) by @chaitanyabodlapati
FT.AGGREGATE Step-Based Pipeline Builder
Added a new step-based FT.AGGREGATE pipeline API via FTAggregateOptions.Steps, allowing LOAD, APPLY, GROUPBY, and SORTBY (with per-step MAX) to be repeated and interleaved in arbitrary order — matching Redis's native multi-stage aggregation semantics. The legacy Load/Apply/GroupBy/SortBy/SortByMax fields are now deprecated.
(#3782) by @ndyakov
Raw RESP Protocol Access
Added DoRaw and DoRawWriteTo methods for executing arbitrary commands and reading the raw RESP response. Useful for proxying, custom protocol inspection, and working with commands not yet wrapped by go-redis.
(#3713) by @ofekshenawa
Configurable Dial Retry Backoff
Added DialerRetryBackoff option (plumbed through Options, ClusterOptions, RingOptions, FailoverOptions) to let callers customize the delay between failed dial attempts. Helpers DialRetryBackoffConstant and DialRetryBackoffExponential (with jitter and cap) are provided out of the box. Dial timeout is now also applied per attempt rather than across all retries.
(#3706, #3705) by @mwhooker
✨ New Features
- FT.AGGREGATE Steps: Step-based pipeline builder for
FT.AGGREGATE with support for repeated/interleaved LOAD, APPLY, GROUPBY, and SORTBY stages (#3782) by @ndyakov
- VectorSet commands: Added
VISMEMBER and WITHATTRIBS support (#3753) by @romanpovol
- FIPS-safe Script:
NewScriptServerSHA uses SCRIPT LOAD to obtain the digest from the server, avoiding client-side SHA-1 (#3700) by @chaitanyabodlapati
- Raw RESP access:
DoRaw and DoRawWriteTo for raw RESP protocol access (#3713) by @ofekshenawa
- Dial retry backoff:
DialerRetryBackoff function option with constant and exponential helpers (#3706) by @mwhooker
- Typed NOSCRIPT error: Redis
NOSCRIPT replies are now surfaced as a typed error for easier handling (#3738) by @LINKIWI
- PubSub ClientSetName: Added
ClientSetName method to PubSub (#3727) by @Flack74
- ReplicaOf: New
ReplicaOf method replaces the deprecated SlaveOf (#3720) by @Copilot
- HSCAN BinaryUnmarshaler:
HScan now supports types implementing encoding.BinaryUnmarshaler (#3768) by @Aaditya-dubey1
🐛 Bug Fixes
- Auto hostname type detection: Improved endpoint type detection for maintenance notifications using DNS-based classification; handles empty hosts and expanded private-IP ranges (#3789) by @ndyakov
- HELLO fallback: Don't send
CLIENT MAINT_NOTIFICATIONS handshake when HELLO fails and connection falls back to RESP2; fail fast when explicitly enabled with RESP3 (#3788) by @ndyakov
- Dial TCP retry:
ShouldRetry now treats net.OpError with Op == "dial" timeout errors as safe to retry since no command was sent (#3787) by @vladisa88
- wrappedOnClose leak: Fixed resource leak caused by repeatedly wrapping
baseClient close logic; replaced with a bounded, concurrency-safe named-hook registry (#3785) by @ndyakov
- Pool Close() on stale connections: Suppress close errors (e.g., TLS
closeNotify timeouts) for connections already dropped by the server due to idle timeout (#3778) by @ofekshenawa
- FIFO waiter ordering: Fixed race in
ConnStateMachine.notifyWaiters that could wake multiple waiters under a single mutex hold and violate FIFO ordering (#3777) by @0x48core
- Lua READONLY detection: Detect
READONLY errors embedded in Lua script error messages on read-only replicas so commands are correctly retried (#3769) by @zhengjilei
- VectorScoreSliceCmd RESP2: Fixed
VSimWithScores, VSimWithArgsWithScores, and VLinksWithScores which were broken on RESP2 connections returning flat arrays instead of maps (#3767) by @Copilot
- Closed connection handling: Two fixes for closed connection handling in the pool (#3764) by @cxljs
- ZRangeArgs Rev: Fixed
ZRangeArgs with Rev + ByScore/ByLex incorrectly swapping Start/Stop, breaking ZRANGESTORE (#3751) by @Copilot
- OTel metric instrument types: Fixed metric instrument types in
redisotel-native (#3743) by @ofekshenawa
- Options.clone() data race: Fixed data race when cloning
Options (#3739) by @rubensayshi
- Connection closure metrics: Fixed connection closure metrics and enabled all metric groups by default in
redisotel-native (#3735) by @ofekshenawa
- OTel semconv v1.38.0: Use metric definition from
otel/semconv/v1.38.0 in redisotel-native (#3731) by @wzy9607
- SETNX semantics: Use
SET ... NX instead of the deprecated SETNX command (#3723) by @ndyakov
- TIME keyless routing: Mark
TIME as a keyless command for correct cluster routing (#3722) by @fatal10110
- Dial timeout per retry: Dial timeout now applies per attempt instead of across all retry attempts combined (#3705) by @mwhooker
- Cluster metrics attributes: Fixed
pool.name being appended per node, which corrupted and dropped user-provided custom attributes (#3699) by @Jesse-Bonfire
- initConn nil dereference: Fixed nil pointer dereference and potential deadlock in
*baseClient.initConn(); added explicit nil option guards to client constructors (#3676) by @olde-ducke
⚡ Performance
- RESP reader: Optimized RESP reader by eliminating intermediate string allocations (#3774) by @Aaditya-dubey1
- Inline rendezvous hashing: Replaced
github.com/dgryski/go-rendezvous dependency with an in-repo implementation in internal/hashtag, reducing the dependency graph while preserving algorithm parity (#3762) by @bigsk05
🧪 Testing & Infrastructure
- Release automation: Added
repository, ref, and client-libs-test-image-tag inputs to the run-tests composite action; redis-version is now optional so unstable builds use REDIS_VERSION from the Makefile (#3749) by @dariaguy
- Go 1.24: Updated minimum Go version to 1.24 and use
-compat=1.24 in release scripts (#3714, #3754) by @ndyakov, @cxljs
🧰 Maintenance
- Pool state machine: Removed redundant
Conn.closed atomic field in favor of the state machine's StateClosed (#3783) by @cxljs
- OTel SDK: Updated OpenTelemetry SDK dependencies in
redisotel/redisotel-native (#3770) by @ndyakov
- Go 1.21+ built-ins: Use
maps.Keys, slices.Collect, slices.Contains, clear(), and slices.SortFunc instead of custom helpers (#3758, #3746) by @cxljs
- HGetAll docs: Added Go doc comment to
HGetAll describing behavior and complexity (#3776) by @0x48core
- Docs links: Fixed irrelevant docs links (#3724) by @olzhas-sabiyev
- Examples cleanup: Removed throughput binary from examples (#3733) by @ndyakov
👥 Contributors
We'd like to thank all the contributors who worked on this release!
@0x48core, @Aaditya-dubey1, @Copilot, @Flack74, @Jesse-Bonfire, @LINKIWI, @bigsk05, @chaitanyabodlapati, @cxljs, @dariaguy, @fatal10110, @mwhooker, @ndyakov, @ofekshenawa, @olde-ducke, @olzhas-sabiyev, @romanpovol, @rubensayshi, @vladisa88, @wzy9607, @zhengjilei
Full Changelog: redis/go-redis@v9.18.0...v9.19.0
Compare Source
Redis 8.6 Support
Added support for Redis 8.6, including new commands and features for streams idempotent production and HOTKEYS.
Smart Client Handoff (Maintenance Notifications) for Cluster
This release introduces comprehensive 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
- Triggering lazy cluster state reloads upon completion (SMIGRATED)
- Enabling seamless operations during Redis Enterprise maintenance windows
(#3643) by @ndyakov
OpenTelemetry Native Metrics Support
Added comprehensive OpenTelemetry metrics support following the OpenTelemetry Database Client Semantic Conventions. The implementation uses a Bridge Pattern to keep the core library dependency-free while providing optional metrics instrumentation through the new extra/redisotel-native package.
Metric groups include:
- Command metrics: Operation duration with retry tracking
- Connection basic: Connection count and creation time
- Resiliency: Errors, handoffs, timeout relaxation
- Connection advanced: Wait time and use time
- Pubsub metrics: Published and received messages
- Stream metrics: Processing duration and maintenance notifications
(#3637) by @ofekshenawa
✨ New Features
- HOTKEYS Commands: Added support for Redis HOTKEYS feature for identifying hot keys based on CPU consumption and network utilization (#3695) by @ofekshenawa
- Streams Idempotent Production: Added support for Redis 8.6+ Streams Idempotent Production with
ProducerID, IdempotentID, IdempotentAuto in XAddArgs and new XCFGSET command (#3693) by @ofekshenawa
- NaN Values for TimeSeries: Added support for NaN (Not a Number) values in Redis time series commands (#3687) by @ofekshenawa
- DialerRetries Options: Added
DialerRetries and DialerRetryTimeout to ClusterOptions, RingOptions, and FailoverOptions (#3686) by @naveenchander30
- ConnMaxLifetimeJitter: Added jitter configuration to distribute connection expiration times and prevent thundering herd (#3666) by @cyningsun
- Digest Helper Functions: Added
DigestString and DigestBytes helper functions for client-side xxh3 hashing compatible with Redis DIGEST command (#3679) by @ofekshenawa
- SMIGRATED New Format: Updated SMIGRATED parser to support new format and remember original host:port (#3697) by @ndyakov
- Cluster State Reload Interval: Added cluster state reload interval option for maintenance notifications (#3663) by @ndyakov
🐛 Bug Fixes
- PubSub nil pointer dereference: Fixed nil pointer dereference in PubSub after
WithTimeout() - pubSubPool is now properly cloned (#3710) by @Copilot
- MaintNotificationsConfig nil check: Guard against nil
MaintNotificationsConfig in initConn (#3707) by @veeceey
- wantConnQueue zombie elements: Fixed zombie
wantConn elements accumulation in wantConnQueue (#3680) by @cyningsun
- XADD/XTRIM approx flag: Fixed XADD and XTRIM to use
= when approx is false (#3684) by @ndyakov
- Sentinel timeout retry: When connection to a sentinel times out, attempt to connect to other sentinels (#3654) by @cxljs
⚡ Performance
- Fuzz test optimization: Eliminated repeated string conversions, used functional approach for cleaner operation selection (#3692) by @feiguoL
- Pre-allocate capacity: Pre-allocate slice capacity to prevent multiple capacity expansions (#3689) by @feelshu
🧪 Testing
- Comprehensive TLS tests: Added comprehensive TLS tests and example for standalone, cluster, and certificate authentication (#3681) by @ndyakov
- Redis 8.6: Updated CI to use Redis 8.6-pre (#3685) by @ndyakov
🧰 Maintenance
- Deprecation warnings: Added deprecation warnings for commands based on Redis documentation (#3673) by @ndyakov
- Use errors.Join(): Replaced custom error join function with standard library
errors.Join() (#3653) by @cxljs
- Use Go 1.21 min/max: Use Go 1.21's built-in min/max functions (#3656) by @cxljs
- Proper formatting: Code formatting improvements (#3670) by @12ya
- Set commands documentation: Added comprehensive documentation to all set command methods (#3642) by @iamamirsalehi
- MaxActiveConns docs: Added default value documentation for
MaxActiveConns (#3674) by @codykaup
- README example update: Updated README example (#3657) by @cxljs
- Cluster maintnotif example: Added example application for cluster maintenance notifications (#3651) by @ndyakov
👥 Contributors
We'd like to thank all the contributors who worked on this release!
@12ya, @Copilot, @codykaup, @cxljs, @cyningsun, @feelshu, @feiguoL, @iamamirsalehi, @naveenchander30, @ndyakov, @ofekshenawa, @veeceey
Compare Source
🐛 Bug Fixes
- Connection Pool: Fixed zombie
wantConn elements accumulation in wantConnQueue that could cause resource leaks in high concurrency scenarios with dial failures (#3680) by @cyningsun
- Stream Commands: Fixed
XADD and XTRIM commands to use exact threshold (=) when Approx is false, ensuring precise stream trimming behavior (#3684) by @ndyakov
- Connection Pool: Added
ConnMaxLifetimeJitter configuration to distribute connection expiration times and prevent the thundering herd problem when many connections expire simultaneously (#3666) by @cyningsun
- Client Options: Added
DialerRetries and DialerRetryTimeout fields to ClusterOptions, RingOptions, and FailoverOptions to allow configuring connection retry behavior for cluster, ring, and sentinel clients (#3686) by @naveenchander30
Contributors
We'd like to thank all the contributors who worked on this release!
@cyningsun, @naveenchander30, and @ndyakov
Full Changelog: redis/go-redis@v9.17.2...v9.17.3
Compare Source
🐛 Bug Fixes
- Connection Pool: Fixed critical race condition in turn management that could cause connection leaks when dial goroutines complete after request timeout (#3626) by @cyningsun
- Context Timeout: Improved context timeout calculation to use minimum of remaining time and DialTimeout, preventing goroutines from waiting longer than necessary (#3626) by @cyningsun
🧰 Maintenance
- chore(deps): bump rojopolis/spellcheck-github-actions from 0.54.0 to 0.55.0 (#3627)
Contributors
We'd like to thank all the contributors who worked on this release!
@cyningsun and @ndyakov
Compare Source
🐛 Bug Fixes
🧰 Maintenance
- chore(deps): bump golangci/golangci-lint-action from 9.0.0 to 9.1.0 (#3609)
- chore(deps): bump actions/checkout from 5 to 6 (#3610)
- chore(script): fix help call in tag.sh (#3606) by @ndyakov
Contributors
We'd like to thank all the contributors who worked on this release!
@marcoferrer and @ndyakov
Compare Source
🚀 Highlights
Redis 8.4 Support
Added support for Redis 8.4, including new commands and features (#3572)
Typed Errors
Introduced typed errors for better error handling using errors.As instead of string checks. Errors can now be wrapped and set to commands in hooks without breaking library functionality (#3602)
New Commands
- CAS/CAD Commands: Added support for Compare-And-Set/Compare-And-Delete operations with conditional matching (
IFEQ, IFNE, IFDEQ, IFDNE) (#3583, #3595)
- MSETEX: Atomically set multiple key-value pairs with expiration options and conditional modes (#3580)
- XReadGroup CLAIM: Consume both incoming and idle pending entries from streams in a single call (#3578)
- ACL Commands: Added
ACLGenPass, ACLUsers, and ACLWhoAmI (#3576)
- SLOWLOG Commands: Added
SLOWLOG LEN and SLOWLOG RESET (#3585)
- LATENCY Commands: Added
LATENCY LATEST and LATENCY RESET (#3584)
Search & Vector Improvements
- Hybrid Search: Added EXPERIMENTAL support for the new
FT.HYBRID command (#3573)
- Vector Range: Added
VRANGE command for vector sets (#3543)
- FT.INFO Enhancements: Added vector-specific attributes in FT.INFO response (#3596)
Connection Pool Improvements
- Improved Connection Success Rate: Implemented FIFO queue-based fairness and context pattern for connection creation to prevent premature cancellation under high concurrency (#3518)
- Connection State Machine: Resolved race conditions and improved pool performance with proper state tracking (#3559)
- Pool Performance: Significant performance improvements with faster semaphores, lockless hook manager, and reduced allocations (47-67% faster Get/Put operations) (#3565)
Metrics & Observability
- Canceled Metric Attribute: Added 'canceled' metrics attribute to distinguish context cancellation errors from other errors (#3566)
✨ New Features
🐛 Bug Fixes
⚡ Performance
- Connection state machine with race condition fixes (#3559) by @ndyakov
- Pool performance improvements: 47-67% faster Get/Put, 33% less memory, 50% fewer allocations (#3565) by @ndyakov
🧪 Testing & Infrastructure
👥 Contributors
We'd like to thank all the contributors who worked on this release!
@12ya, @ajax16384, @cxljs, @cyningsun, @destinyoooo, @dragneelfps, @htemelski-redis, @manisharma, @ndyakov, @ofekshenawa, @pvragov
Full Changelog: redis/go-redis@v9.16.0...v9.17.0
Compare Source
🚀 Highlights
Maintenance Notifications Support
This release introduces comprehensive support for Redis maintenance notifications, enabling applications to handle server maintenance events gracefully. The new maintnotifications package provides:
- RESP3 Push Notifications: Full support for Redis RESP3 protocol push notifications
- Connection Handoff: Automatic connection migration during server maintenance with configurable retry policies and circuit breakers
- Graceful Degradation: Configurable timeout relaxation during maintenance windows to prevent false failures
- Event-Driven Architecture: Background workers with on-demand scaling for efficient handoff processing
For detailed usage examples and configuration options, see the maintenance notifications documentation.
✨ New Features
- Trace Filtering: Add support for filtering traces for specific commands, including pipeline operations and dial operations (#3519, #3550)
- New
TraceCmdFilter option to selectively trace commands
- Reduces overhead by excluding high-frequency or low-value commands from traces
🐛 Bug Fixes
- Pipeline Error Handling: Fix issue where pipeline repeatedly sets the same error (#3525)
- Connection Pool: Ensure re-authentication does not interfere with connection handoff operations (#3547)
🔧 Improvements
- Hash Commands: Update hash command implementations (#3523)
- OpenTelemetry: Use
metric.WithAttributeSet to avoid unnecessary attribute copying in redisotel (#3552)
📚 Documentation
- Cluster Client: Add explanation for why
MaxRetries is disabled for ClusterClient (#3551)
🧪 Testing & Infrastructure
- E2E Testing: Upgrade E2E testing framework with improved reliability and coverage (#3541)
- Release Process: Improved resiliency of the release process (#3530)
📦 Dependencies
- Bump
rojopolis/spellcheck-github-actions from 0.51.0 to 0.52.0 (#3520)
- Bump
github/codeql-action from 3 to 4 (#3544)
👥 Contributors
We'd like to thank all the contributors who worked on this release!
@ndyakov, @htemelski-redis, @Sovietaced, @Udhayarajan, @boekkooi-impossiblecloud, @Pika-Gopher, @cxljs, @huiyifyj, @omid-h70
Full Changelog: redis/go-redis@v9.14.0...v9.16.0
v9.15.1: Retract v9.15.0 and v9.15.1
Compare Source
Compare Source
Changes
- fix(otel): Add support for filtering traces for certain commands (#3519)
- fix(pool): remove conn from idleConns if present (#3546)
Contributors
We'd like to thank all the contributors who worked on this release!
@Sovietaced, @ndyakov
Compare Source
Highlights
- Added batch process method to the pipeline (#3510)
Changes
🚀 New Features
- Added batch process method to the pipeline (#3510)
🐛 Bug Fixes
- fix: SetErr on Cmd if the command cannot be queued correctly in multi/exec (#3509)
🧰 Maintenance
- Updates release drafter config to exclude dependabot ([#3511](http
✂ Note
PR body was truncated to here.
Uh oh!
There was an error while loading. Please reload this page.
This PR contains the following updates:
v7.4.1→v9.20.1Release Notes
go-redis/redis (github.com/go-redis/redis/v7)
v9.20.1: 9.20.1Compare Source
This is a patch release containing bug fixes only. There are no new features or breaking changes; upgrading from 9.20.0 is a drop-in replacement.
🚀 Highlights
RESP3 pub/sub message loss fixed
PeekPushNotificationNamepreviously inspected only the bytes already buffered bybufio, so when a push frame header straddled a buffer fill boundary it could return a truncated notification name (e.g."messa"instead of"message"). The push processor then mis-routed the frame andReadReplysilently dropped it, causing intermittent RESP3 pub/sub message loss. The peek now grows its window (36 bytes → up to 4 KiB) and reads more from the connection until the header is complete, cleanly separating incomplete prefixes from corrupt frames (including overflow-safe bulk-length handling). Fixes #3839.(#3842) by @ndyakov
🐛 Bug Fixes
PeekPushNotificationNameno longer returns a truncated notification name when a push frame header spans a buffer boundary, preventing silent RESP3 pub/sub message loss (fixes #3839) (#3842) by @ndyakovFT.HYBRIDvector params: Vector data is now always sent viaPARAMSwith auto-generated param names (__vector_param_N, with collision avoidance) whenVectorParamNameis omitted, since Redis no longer accepts inline vector blobs; theFTHybridOptions.Paramsmap is no longer mutated, so the same options struct can be reused across calls (#3844) by @ndyakovCLUSTER SHARDSforward compatibility: Unknown shard- and node-level attributes in theCLUSTER SHARDSreply are now skipped viaDiscardNext()instead of erroring, so clients keep working when the server introduces new fields (#3843) by @madolsonPubSub.releaseConnno longer reconnects twice when a connection is both unusable (or pending handoff) and reports a bad-connection error, avoiding a wasted connection establish-then-close cycle (#3833) by @cxljs👥 Contributors
We'd like to thank all the contributors who worked on this release!
@cxljs, @madolson, @ndyakov
Full Changelog: redis/go-redis@v9.20.0...v9.20.1
v9.20.0: 9.20.0Compare Source
🚀 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.8client-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 theArrayCmdableinterface (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.XAUTOCLAIMPEL deletes (#3798) —XAUTOCLAIM/XAUTOCLAIMJUSTIDnow return the list of deleted message IDs from the pending entries list.TS.RANGEmultiple aggregators (#3791) —TS.RANGE/TS.REVRANGE/TS.MRANGE/TS.MREVRANGEaccept multiple aggregators in a single call.Z(UNION|INTER|DIFF)COUNTaggregator (#3802) —COUNTreducer for sorted-set set operations.JSON.SET FPHA(#3797) — newFPHAargument 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 (
UnstableResp3deprecated)FT.SEARCH,FT.AGGREGATE,FT.INFO,FT.SPELLCHECK, andFT.SYNDUMPnow parse RESP3 (map) responses into the same typed result objects as RESP2 —Val()andResult()work uniformly on both protocols, no flag required. Previously, RESP3 search responses requiredUnstableResp3: trueand were returned as opaque maps accessible only viaRawResult()/RawVal().As a result, the
UnstableResp3option 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 setsUnstableResp3: truewill 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
ArrayCmdableinterface with theAR*command family (ARSet,ARGet,ARGetRange,ARMSet,ARMGet,ARDel,ARDelRange,ARScan,ARSeek,ARNext,ARLastItems,ARGrep,ARGrepWithValues,ARInfo/ARInfoFull, and typed reducersAROpSum/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
FT.SEARCH/FT.AGGREGATE/FT.INFO/FT.SPELLCHECK/FT.SYNDUMPresponses with backwards compatibility for RESP2 (#3741) by @ndyakovINCREXcommand support — atomic increment with expiration (#3816) by @ndyakovXNACKstream command for explicitly negative-acknowledging pending entries (#3790) by @elena-kolevskaTS.RANGE/TS.REVRANGE/TS.MRANGE/TS.MREVRANGEnow accept multiple aggregators in a single call (#3791) by @elena-kolevskaXAutoClaimdeleted IDs:XAUTOCLAIM/XAUTOCLAIMJUSTIDnow return the list of deleted message IDs from the PEL (#3798) by @KhukharrJSON.SET FPHA:JSON.SETaccepts a newFPHAargument that specifies the floating-point type for homogeneous floating-point arrays (#3797) by @ndyakovZUNION/ZINTER/ZDIFFaggregator now supportsCOUNT(#3802) by @ofekshenawaFT.HYBRIDvector validation: Validates hybrid-search vector input types and adds proper typed vector parameters (#3756) by @DengY11ClusterClient.PoolStats()now accumulatesWaitCountandWaitDurationNsacross all node pools (previously always zero) (#3809) by @LINKIWI🐛 Bug Fixes
CLUSTER SLOTSport-0 entries now fall back to the origin endpoint's port, fixingdial tcp <ip>:0: connection refusedon TLS-only clusters started with--port 0 --tls-port <port>(fixes #3726) (#3828) by @ndyakovPubSub.conn()now passes both regular (c.channels) and sharded (c.schannels) channels into the per-PubSubnewConnclosure. Previously,ClusterClient.SSubscribe-only PubSubs reconnected to a random node (because the routing closure saw an empty channel list), theSSUBSCRIBEwas sent to the wrong shard, and the resultingMOVEDreply was silently dropped (#3829) by @ndyakovWatchretry: User errors returned from aWatchcallback are no longer subjected to cluster-retry classification; transient cluster errors still retry, but a callback returning e.g.net.ErrClosedshort-circuits immediately (#3821) by @obiyangMasterAddr's concurrent sentinel probe now closes the non-winning sentinel clients instead of leaking them (#3827) by @cxljsreplicaAddrsno 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 @shahyash2609CloseConnhooks:Pool.CloseConnnow triggers registered hooks, fixing a memory leak when connections are closed explicitly rather than via the normal removal path (#3818) by @ndyakovdial tcperrors are now correctly classified as redirectable so cluster routing can recover from a single unreachable node (#3810) by @vladisa88Closehealth checks:ConnPool.Closenow only runs health checks against idle connections, avoiding spurious activity on connections still in use (#3805) by @ndyakovVLINKS/VLINKSWITHSCORESvector-set replies (#3820) by @romanpovol🧪 Testing & Infrastructure
waitForSentinelClusterStablepost-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 intermittentExpected master to equal slaveflake (#3830) by @ndyakovgovulncheckworkflow: New scheduled GitHub Actions workflow runsgovulncheckon every push, PR, and weekly, surfacing newly disclosed Go vulnerabilities even when no code changes (#3779) by @solardome🧰 Maintenance
Cmd.Slot()lookup refactor: Caches the per-commandCommandInfoand short-circuits keyless commands before the switch dispatch, removing redundantPeekcalls (#3804) by @retr0-kernelmath/rand: Replacedinternal/randwithmath/randfrom the standard library now that the minimum Go version is 1.24 (#3823) by @cxljsConnPool, trimming the pool's footprint (#3826) by @cxljsextra/*package (#3817) 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: redis/go-redis@v9.19.0...v9.20.0
v9.19.0: 9.19.0Compare Source
🚀 Highlights
FIPS-Compatible Script Helper
Scriptnow supports a FIPS-safe execution mode that avoids client-side SHA-1 computation, which is blocked in strict FIPS environments. A newNewScriptServerSHAconstructor usesSCRIPT LOADto obtain and cache the digest from the server, then runs commands viaEVALSHA/EVALSHA_RO. Falls back toEVAL/EVALROif loading fails, and transparently retries once onNOSCRIPT. The default behavior is unchanged for existing users.(#3700) by @chaitanyabodlapati
FT.AGGREGATE Step-Based Pipeline Builder
Added a new step-based
FT.AGGREGATEpipeline API viaFTAggregateOptions.Steps, allowingLOAD,APPLY,GROUPBY, andSORTBY(with per-stepMAX) to be repeated and interleaved in arbitrary order — matching Redis's native multi-stage aggregation semantics. The legacyLoad/Apply/GroupBy/SortBy/SortByMaxfields are now deprecated.(#3782) by @ndyakov
Raw RESP Protocol Access
Added
DoRawandDoRawWriteTomethods for executing arbitrary commands and reading the raw RESP response. Useful for proxying, custom protocol inspection, and working with commands not yet wrapped by go-redis.(#3713) by @ofekshenawa
Configurable Dial Retry Backoff
Added
DialerRetryBackoffoption (plumbed throughOptions,ClusterOptions,RingOptions,FailoverOptions) to let callers customize the delay between failed dial attempts. HelpersDialRetryBackoffConstantandDialRetryBackoffExponential(with jitter and cap) are provided out of the box. Dial timeout is now also applied per attempt rather than across all retries.(#3706, #3705) by @mwhooker
✨ New Features
FT.AGGREGATEwith support for repeated/interleavedLOAD,APPLY,GROUPBY, andSORTBYstages (#3782) by @ndyakovVISMEMBERandWITHATTRIBSsupport (#3753) by @romanpovolNewScriptServerSHAusesSCRIPT LOADto obtain the digest from the server, avoiding client-side SHA-1 (#3700) by @chaitanyabodlapatiDoRawandDoRawWriteTofor raw RESP protocol access (#3713) by @ofekshenawaDialerRetryBackofffunction option with constant and exponential helpers (#3706) by @mwhookerNOSCRIPTreplies are now surfaced as a typed error for easier handling (#3738) by @LINKIWIClientSetNamemethod toPubSub(#3727) by @Flack74ReplicaOfmethod replaces the deprecatedSlaveOf(#3720) by @CopilotHScannow supports types implementingencoding.BinaryUnmarshaler(#3768) by @Aaditya-dubey1🐛 Bug Fixes
CLIENT MAINT_NOTIFICATIONShandshake whenHELLOfails and connection falls back to RESP2; fail fast when explicitly enabled with RESP3 (#3788) by @ndyakovShouldRetrynow treatsnet.OpErrorwithOp == "dial"timeout errors as safe to retry since no command was sent (#3787) by @vladisa88baseClientclose logic; replaced with a bounded, concurrency-safe named-hook registry (#3785) by @ndyakovcloseNotifytimeouts) for connections already dropped by the server due to idle timeout (#3778) by @ofekshenawaConnStateMachine.notifyWaitersthat could wake multiple waiters under a single mutex hold and violate FIFO ordering (#3777) by @0x48coreREADONLYerrors embedded in Lua script error messages on read-only replicas so commands are correctly retried (#3769) by @zhengjileiVSimWithScores,VSimWithArgsWithScores, andVLinksWithScoreswhich were broken on RESP2 connections returning flat arrays instead of maps (#3767) by @CopilotZRangeArgswithRev+ByScore/ByLexincorrectly swappingStart/Stop, breakingZRANGESTORE(#3751) by @Copilotredisotel-native(#3743) by @ofekshenawaOptions(#3739) by @rubensayshiredisotel-native(#3735) by @ofekshenawaotel/semconv/v1.38.0inredisotel-native(#3731) by @wzy9607SET ... NXinstead of the deprecatedSETNXcommand (#3723) by @ndyakovTIMEas a keyless command for correct cluster routing (#3722) by @fatal10110pool.namebeing appended per node, which corrupted and dropped user-provided custom attributes (#3699) by @Jesse-Bonfire*baseClient.initConn(); added explicit nil option guards to client constructors (#3676) by @olde-ducke⚡ Performance
github.com/dgryski/go-rendezvousdependency with an in-repo implementation ininternal/hashtag, reducing the dependency graph while preserving algorithm parity (#3762) by @bigsk05🧪 Testing & Infrastructure
repository,ref, andclient-libs-test-image-taginputs to therun-testscomposite action;redis-versionis now optional so unstable builds useREDIS_VERSIONfrom the Makefile (#3749) by @dariaguy-compat=1.24in release scripts (#3714, #3754) by @ndyakov, @cxljs🧰 Maintenance
Conn.closedatomic field in favor of the state machine'sStateClosed(#3783) by @cxljsredisotel/redisotel-native(#3770) by @ndyakovmaps.Keys,slices.Collect,slices.Contains,clear(), andslices.SortFuncinstead of custom helpers (#3758, #3746) by @cxljsHGetAlldescribing behavior and complexity (#3776) by @0x48core👥 Contributors
We'd like to thank all the contributors who worked on this release!
@0x48core, @Aaditya-dubey1, @Copilot, @Flack74, @Jesse-Bonfire, @LINKIWI, @bigsk05, @chaitanyabodlapati, @cxljs, @dariaguy, @fatal10110, @mwhooker, @ndyakov, @ofekshenawa, @olde-ducke, @olzhas-sabiyev, @romanpovol, @rubensayshi, @vladisa88, @wzy9607, @zhengjilei
Full Changelog: redis/go-redis@v9.18.0...v9.19.0
v9.18.0: 9.18.0Compare Source
Redis 8.6 Support
Added support for Redis 8.6, including new commands and features for streams idempotent production and HOTKEYS.
Smart Client Handoff (Maintenance Notifications) for Cluster
This release introduces comprehensive support for Redis Enterprise Cluster maintenance notifications via SMIGRATING/SMIGRATED push notifications. The client now automatically handles slot migrations by:
(#3643) by @ndyakov
OpenTelemetry Native Metrics Support
Added comprehensive OpenTelemetry metrics support following the OpenTelemetry Database Client Semantic Conventions. The implementation uses a Bridge Pattern to keep the core library dependency-free while providing optional metrics instrumentation through the new
extra/redisotel-nativepackage.Metric groups include:
(#3637) by @ofekshenawa
✨ New Features
ProducerID,IdempotentID,IdempotentAutoinXAddArgsand newXCFGSETcommand (#3693) by @ofekshenawaDialerRetriesandDialerRetryTimeouttoClusterOptions,RingOptions, andFailoverOptions(#3686) by @naveenchander30DigestStringandDigestByteshelper functions for client-side xxh3 hashing compatible with Redis DIGEST command (#3679) by @ofekshenawa🐛 Bug Fixes
WithTimeout()-pubSubPoolis now properly cloned (#3710) by @CopilotMaintNotificationsConfigininitConn(#3707) by @veeceeywantConnelements accumulation inwantConnQueue(#3680) by @cyningsun=when approx is false (#3684) by @ndyakov⚡ Performance
🧪 Testing
🧰 Maintenance
errors.Join()(#3653) by @cxljsMaxActiveConns(#3674) by @codykaup👥 Contributors
We'd like to thank all the contributors who worked on this release!
@12ya, @Copilot, @codykaup, @cxljs, @cyningsun, @feelshu, @feiguoL, @iamamirsalehi, @naveenchander30, @ndyakov, @ofekshenawa, @veeceey
v9.17.3: 9.17.3Compare Source
🐛 Bug Fixes
wantConnelements accumulation inwantConnQueuethat could cause resource leaks in high concurrency scenarios with dial failures (#3680) by @cyningsunXADDandXTRIMcommands to use exact threshold (=) whenApproxis false, ensuring precise stream trimming behavior (#3684) by @ndyakovConnMaxLifetimeJitterconfiguration to distribute connection expiration times and prevent the thundering herd problem when many connections expire simultaneously (#3666) by @cyningsunDialerRetriesandDialerRetryTimeoutfields toClusterOptions,RingOptions, andFailoverOptionsto allow configuring connection retry behavior for cluster, ring, and sentinel clients (#3686) by @naveenchander30Contributors
We'd like to thank all the contributors who worked on this release!
@cyningsun, @naveenchander30, and @ndyakov
Full Changelog: redis/go-redis@v9.17.2...v9.17.3
v9.17.2: 9.17.2Compare Source
🐛 Bug Fixes
🧰 Maintenance
Contributors
We'd like to thank all the contributors who worked on this release!
@cyningsun and @ndyakov
v9.17.1: 9.17.1Compare Source
🐛 Bug Fixes
🧰 Maintenance
Contributors
We'd like to thank all the contributors who worked on this release!
@marcoferrer and @ndyakov
v9.17.0: 9.17.0Compare Source
🚀 Highlights
Redis 8.4 Support
Added support for Redis 8.4, including new commands and features (#3572)
Typed Errors
Introduced typed errors for better error handling using
errors.Asinstead of string checks. Errors can now be wrapped and set to commands in hooks without breaking library functionality (#3602)New Commands
IFEQ,IFNE,IFDEQ,IFDNE) (#3583, #3595)ACLGenPass,ACLUsers, andACLWhoAmI(#3576)SLOWLOG LENandSLOWLOG RESET(#3585)LATENCY LATESTandLATENCY RESET(#3584)Search & Vector Improvements
FT.HYBRIDcommand (#3573)VRANGEcommand for vector sets (#3543)Connection Pool Improvements
Metrics & Observability
✨ New Features
🐛 Bug Fixes
joinErrorsto prevent panic (#3577) by @manisharma⚡ Performance
🧪 Testing & Infrastructure
👥 Contributors
We'd like to thank all the contributors who worked on this release!
@12ya, @ajax16384, @cxljs, @cyningsun, @destinyoooo, @dragneelfps, @htemelski-redis, @manisharma, @ndyakov, @ofekshenawa, @pvragov
Full Changelog: redis/go-redis@v9.16.0...v9.17.0
v9.16.0: 9.16.0Compare Source
🚀 Highlights
Maintenance Notifications Support
This release introduces comprehensive support for Redis maintenance notifications, enabling applications to handle server maintenance events gracefully. The new
maintnotificationspackage provides:For detailed usage examples and configuration options, see the maintenance notifications documentation.
✨ New Features
TraceCmdFilteroption to selectively trace commands🐛 Bug Fixes
🔧 Improvements
metric.WithAttributeSetto avoid unnecessary attribute copying in redisotel (#3552)📚 Documentation
MaxRetriesis disabled forClusterClient(#3551)🧪 Testing & Infrastructure
📦 Dependencies
rojopolis/spellcheck-github-actionsfrom 0.51.0 to 0.52.0 (#3520)github/codeql-actionfrom 3 to 4 (#3544)👥 Contributors
We'd like to thank all the contributors who worked on this release!
@ndyakov, @htemelski-redis, @Sovietaced, @Udhayarajan, @boekkooi-impossiblecloud, @Pika-Gopher, @cxljs, @huiyifyj, @omid-h70
Full Changelog: redis/go-redis@v9.14.0...v9.16.0
v9.15.1: Retract v9.15.0 and v9.15.1Compare Source
v9.14.1: 9.14.1Compare Source
Changes
Contributors
We'd like to thank all the contributors who worked on this release!
@Sovietaced, @ndyakov
v9.14.0: 9.14.0Compare Source
Highlights
Changes
🚀 New Features
🐛 Bug Fixes
🧰 Maintenance
Configuration
📅 Schedule: (UTC)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR was generated by Mend Renovate. View the repository job log.