Potentially Breaking: Fix CheckTrustedIssuer certificate validation for broken chain scenarios (#2665 by @NickCraver)
Users inadvertently trusting a remote cert with a broken chain could not be failing custom validation before this change. This is only in play if you are using ConfigurationOptions.TrustIssuer at all.
Add HeartbeatConsistencyChecks option (opt-in) to enabled per-heartbeat (defaults to once per second) checks to be sent to ensure no network stream corruption has occurred (#2656 by @NickCraver)
Fix #2593: EXPIRETIME and PEXPIRETIME miscategorized as PrimaryOnly commands causing them to fail when issued against a read-only replica (#2593 by @slorello89)
Fix #2591: Add HELLO to Sentinel connections so they can support RESP3 (#2601 by @NickCraver)
Fix #2595: Add detection handling for dead sockets that the OS says are okay, seen especially in Linux environments (#2610 by @NickCraver)
Change: Target net6.0 instead of net5.0, since net5.0 is end of life. (#2497 by @eerhardt)
Fix: Fix nullability annotation of IConnectionMultiplexer.RegisterProfiler (#2494 by @eerhardt)
Add: Timer.ActiveCount under POOL in timeout messages on .NET 6+ to help diagnose timer overload affecting timeout evaluations (#2500 by @NickCraver)
Add: LibraryName configuration option; allows the library name to be controlled at the individual options level (in addition to the existing controls in DefaultOptionsProvider) (#2502 by @mgravell)
Add: DefaultOptionsProvider.GetProvider allows lookup of provider by endpoint (#2502 by @mgravell)
Fix #2412: Critical (but rare) GC bug that can lead to async tasks never completing if the multiplexer is not held by the consumer (#2408 by @mgravell)
Fix #2392: Dequeue all timed out messages from the backlog when not connected (including Fire+Forget) (#2397 by @kornelpal)
Fix #2400: Expose ChannelMessageQueue as IAsyncEnumerable<ChannelMessage> (#2402 by @mgravell)
Adds: Better error messages (over generic timeout) when commands are backlogged and unable to write to any connection (#2408 by @NickCraver)
Adds: Support for CLIENT SETINFO (lib name/version) during handshake; opt-out is via ConfigurationOptions; also support read of resp, lib-ver and lib-name via CLIENT LIST (#2414 by @mgravell)
Documentation: clarify the meaning of RedisValue.IsInteger re #2418 (#2420 by @mgravell)
Fix #2362: Set RedisConnectionException.FailureType to AuthenticationFailure on all authentication scenarios for better handling (#2367 by @NickCraver)
Fix #1520 & #1660: When MOVED is encountered from a cluster, a reconfigure will happen proactively to react to cluster changes ASAP (#2286 by @NickCraver)
Fix #2249: Properly handle a fail state (new ClusterNode.IsFail property) for CLUSTER NODES and expose fail? as a property (IsPossiblyFail) as well (#2288 by @NickCraver)
Adds: IConnectionMultiplexer.ServerMaintenanceEvent (was on ConnectionMultiplexer but not the interface) (#2306 by @NickCraver)
Adds: To timeout messages, additional debug information: Sync-Ops (synchronous operations), Async-Ops (asynchronous operations), and Server-Connected-Seconds (how long the connection in question has been connected, or "n/a") (#2300 by @NickCraver)
Adds: last-in and cur-in (bytes) to timeout exceptions to help identify timeouts that were just-behind another large payload off the wire (#2276 by @NickCraver)
Adds: general-purpose tunnel support, with HTTP proxy "connect" support included (#2274 by @mgravell)
Removes: Package dependency (System.Diagnostics.PerformanceCounter) (#2285 by @NickCraver)
Fix: MOVED with NoRedirect (and other non-reachable errors) should respect the IncludeDetailInExceptions setting (#2267 by @mgravell)
Fix #2251 & #2265: Cluster endpoint connections weren't proactively connecting subscriptions in all cases and taking the full connection timeout to complete as a result (#2268 by @iteplov)
Fix #2182: Be more flexible in which commands are "primary only" in order to support users with replicas that are explicitly configured to allow writes (#2183 by @slorello89)
Adds: IConnectionMultiplexer now implements IAsyncDisposable (#2161 by @kimsey0)
Adds: IConnectionMultiplexer.GetServers() to get all IServer instances for a multiplexer (#2203 by @NickCraver)
Fix #2016: Align server selection with supported commands (e.g. with writable servers) to reduce Command cannot be issued to a replica errors (#2191 by @slorello89)
Performance: Optimization around timeout processing to reduce lock contention in the case of many items that haven't yet timed out during a heartbeat (#2217 by @NickCraver)
Fix #2223: Resolve sync-context issues (missing ConfigureAwait(false)) (#2229 by @mgravell)
Fix #1968: Improved handling of EVAL scripts during server restarts and failovers, detecting and re-sending the script for a retry when needed (#2170 by @martintmk)
Adds: ConfigurationOptions.SslClientAuthenticationOptions (netcoreapp3.1/net5.0+ only) to give more control over SSL/TLS authentication (#2224 by @NickCraver)
Adds: ConfigurationOptions.HeartbeatInterval (Advanced Setting - see docs) To allow more finite control of the client heartbeat, which encompases how often command timeouts are actually evaluated - still defaults to 1,000 ms (#2243 by @NickCraver)
Adds annotations themselves for nullability to everything in the library
Fixes a few internal edge cases that will now throw proper errors (rather than a downstream null reference)
Fixes inconsistencies with null vs. empty array returns (preferring an not-null empty array in those edge cases)
Note: does not increment a major version (as these are warnings to consumers), because: they're warnings (errors are opt-in), removing obsolete types with a 3.0 rev would be binary breaking (this isn't), and reving to 3.0 would cause binding redirect pain for consumers. Bumping from 2.5 to 2.6 only for this change.
Adds: Support for COPY with .KeyCopy()/.KeyCopyAsync() (#2064 by @Avital-Fine)
Adds: Support for LMOVE with .ListMove()/.ListMoveAsync() (#2065 by @Avital-Fine)
Adds: Support for ZRANDMEMBER with .SortedSetRandomMember()/.SortedSetRandomMemberAsync(), .SortedSetRandomMembers()/.SortedSetRandomMembersAsync(), and .SortedSetRandomMembersWithScores()/.SortedSetRandomMembersWithScoresAsync() (#2076 by @Avital-Fine)
Adds: Support for SMISMEMBER with .SetContains()/.SetContainsAsync() (#2077 by @Avital-Fine)
Adds: Support for ZDIFF, ZDIFFSTORE, ZINTER, ZINTERCARD, and ZUNION with .SortedSetCombine()/.SortedSetCombineAsync(), .SortedSetCombineWithScores()/.SortedSetCombineWithScoresAsync(), and .SortedSetIntersectionLength()/.SortedSetIntersectionLengthAsync() (#2075 by @Avital-Fine)
Adds: Support for SINTERCARD with .SetIntersectionLength()/.SetIntersectionLengthAsync() (#2078 by @Avital-Fine)
Adds: Support for LPOS with .ListPosition()/.ListPositionAsync() and .ListPositions()/.ListPositionsAsync() (#2080 by @slorello89)
Adds: Support for ZMSCORE with .SortedSetScores()/.SortedSetScoresAsync() (#2082 by @ttingen)
Adds: Support for NX | XX | GT | LT to EXPIRE, EXPIREAT, PEXPIRE, and PEXPIREAT with .KeyExpire()/.KeyExpireAsync() (#2083 by @Avital-Fine)
Adds: Support for EXPIRETIME, and PEXPIRETIME with .KeyExpireTime()/.KeyExpireTimeAsync() (#2083 by @Avital-Fine)
Fix: For streams, properly hash XACK, XCLAIM, and XPENDING in cluster scenarios to eliminate MOVED retries (#2085 by @nielsderdaele)
Adds: Support for OBJECT REFCOUNT with .KeyRefCount()/.KeyRefCountAsync() (#2087 by @Avital-Fine)
Adds: Support for OBJECT ENCODING with .KeyEncoding()/.KeyEncodingAsync() (#2088 by @Avital-Fine)
Adds: Support for GEOSEARCH with .GeoSearch()/.GeoSearchAsync() (#2089 by @slorello89)
Adds: Support for GEOSEARCHSTORE with .GeoSearchAndStore()/.GeoSearchAndStoreAsync() (#2089 by @slorello89)
Adds: Support for HRANDFIELD with .HashRandomField()/.HashRandomFieldAsync(), .HashRandomFields()/.HashRandomFieldsAsync(), and .HashRandomFieldsWithValues()/.HashRandomFieldsWithValuesAsync() (#2090 by @slorello89)
Adds: Support for LMPOP with .ListLeftPop()/.ListLeftPopAsync() and .ListRightPop()/.ListRightPopAsync() (#2094 by @slorello89)
Adds: Support for ZMPOP with .SortedSetPop()/.SortedSetPopAsync() (#2094 by @slorello89)
Adds: Support for XAUTOCLAIM with .StreamAutoClaim()/.StreamAutoClaimAsync() and .StreamAutoClaimIdsOnly()/.StreamAutoClaimIdsOnlyAsync() (#2095 by @ttingen)
Fix #2071: Add .StringSet()/.StringSetAsync() overloads for source compat broken for 1 case in 2.5.61 (#2098 by @NickCraver)
Adds: Support for LCS with .StringLongestCommonSubsequence()/.StringLongestCommonSubsequence(), .StringLongestCommonSubsequenceLength()/.StringLongestCommonSubsequenceLengthAsync(), and .StringLongestCommonSubsequenceWithMatches()/.StringLongestCommonSubsequenceWithMatchesAsync() (#2104 by @Avital-Fine)
Adds: Support for OBJECT FREQ with .KeyFrequency()/.KeyFrequencyAsync() (#2105 by @Avital-Fine)
Performance: Avoids allocations when computing cluster hash slots or testing key equality (#2110 by @mgravell)
Adds: Support for SORT_RO with .Sort()/.SortAsync() (#2111 by @slorello89)
Adds: Support for BIT | BYTE to BITCOUNT and BITPOS with .StringBitCount()/.StringBitCountAsync() and .StringBitPosition()/.StringBitPositionAsync() (#2116 by @Avital-Fine)
Adds: Support for pub/sub payloads that are unary arrays (#2118 by @mgravell)
Fix: Sentinel timer race during dispose (#2133 by @ewisuri)
Adds: Support for GT, LT, and CH on ZADD with .SortedSetAdd()/.SortedSetAddAsync() and .SortedSetUpdate()/.SortedSetUpdateAsync() (#2136 by @Avital-Fine)
Adds: Support for COMMAND COUNT, COMMAND GETKEYS, and COMMAND LIST, with .CommandCount()/.CommandCountAsync(), .CommandGetKeys()/.CommandGetKeysAsync(), and .CommandList()/.CommandListAsync() (#2143 by @shacharPash)
Fix: ClientKill/ClientKillAsync when using ClientType (#2048 by @NickCraver)
Adds: Most ConfigurationOptions changes after ConnectionMultiplexer connections will now be respected, e.g. changing a timeout will work and changing a password for auth rotation would be used at the next reconnect (#2050 by @NickCraver)
Obsolete: This change also moves ConnectionMultiplexer.IncludeDetailInExceptions and ConnectionMultiplexer.IncludePerformanceCountersInExceptions to ConfigurationOptions. The old properties are [Obsolete] proxies that work until 3.0 for compatibility.
Adds: Support for ZRANGESTORE with .SortedSetRangeAndStore()/.SortedSetRangeAndStoreAsync() (#2052 by @slorello89)
This PR contains the following updates:
| Package | Type | Update | Change |
|---|---|---|---|
| [StackExchange.Redis](https://stackexchange.github.io/StackExchange.Redis/) ([source](https://github.com/StackExchange/StackExchange.Redis)) | nuget | minor | `2.2.4` -> `2.7.33` |
---
### Release Notes
<details>
<summary>StackExchange/StackExchange.Redis (StackExchange.Redis)</summary>
### [`v2.7.33`](https://github.com/StackExchange/StackExchange.Redis/releases/tag/2.7.33)
[Compare Source](https://github.com/StackExchange/StackExchange.Redis/compare/2.7.27...2.7.33)
#### What's Changed
- **Potentially Breaking**: Fix `CheckTrustedIssuer` certificate validation for broken chain scenarios ([#​2665](https://github.com/StackExchange/StackExchange.Redis/issues/2665) by [@​NickCraver](https://github.com/NickCraver))
- Users inadvertently trusting a remote cert with a broken chain could not be failing custom validation before this change. This is only in play if you are using `ConfigurationOptions.TrustIssuer` at all.
- Add new `LoggingTunnel` API; see https://stackexchange.github.io/StackExchange.Redis/Logging ([#​2660](https://github.com/StackExchange/StackExchange.Redis/issues/2660) by [@​mgravell](https://github.com/mgravell))
- Fix [#​2664](https://github.com/StackExchange/StackExchange.Redis/issues/2664): Move ProcessBacklog to fully sync to prevent thread pool hopping and blocking on awaits ([#​2667](https://github.com/StackExchange/StackExchange.Redis/issues/2667) by [@​NickCraver](https://github.com/NickCraver))
**Full Changelog**: https://github.com/StackExchange/StackExchange.Redis/compare/2.7.27...2.7.33
### [`v2.7.27`](https://github.com/StackExchange/StackExchange.Redis/releases/tag/2.7.27)
[Compare Source](https://github.com/StackExchange/StackExchange.Redis/compare/2.7.23...2.7.27)
#### What's Changed
- Support `HeartbeatConsistencyChecks` in `Clone()` ([#​2658](https://github.com/StackExchange/StackExchange.Redis/issues/2658) by [@​mgravell](https://github.com/mgravell))
- Add new `AddLibraryNameSuffix` API for annotating connections with usage ([#​2659](https://github.com/StackExchange/StackExchange.Redis/issues/2659) by [@​mgravell](https://github.com/mgravell))
**Full Changelog**: https://github.com/StackExchange/StackExchange.Redis/compare/2.7.23...2.7.27
### [`v2.7.23`](https://github.com/StackExchange/StackExchange.Redis/releases/tag/2.7.23)
[Compare Source](https://github.com/StackExchange/StackExchange.Redis/compare/2.7.20...2.7.23)
#### What's Changed
- Fix [#​2653](https://github.com/StackExchange/StackExchange.Redis/issues/2653): Client library metadata should validate contents ([#​2654](https://github.com/StackExchange/StackExchange.Redis/issues/2654) by [@​mgravell](https://github.com/mgravell))
- Add `HeartbeatConsistencyChecks` option (opt-in) to enabled per-heartbeat (defaults to once per second) checks to be sent to ensure no network stream corruption has occurred ([#​2656](https://github.com/StackExchange/StackExchange.Redis/issues/2656) by [@​NickCraver](https://github.com/NickCraver))
**Full Changelog**: https://github.com/StackExchange/StackExchange.Redis/compare/2.7.20...2.7.23
### [`v2.7.20`](https://github.com/StackExchange/StackExchange.Redis/releases/tag/2.7.20)
[Compare Source](https://github.com/StackExchange/StackExchange.Redis/compare/2.7.17...2.7.20)
#### What's Changed
- Support Alibaba pseudo-cluster configurations ([#​2646](https://github.com/StackExchange/StackExchange.Redis/issues/2646) by [@​mgravell](https://github.com/mgravell))
**Full Changelog**: https://github.com/StackExchange/StackExchange.Redis/compare/2.7.17...2.7.20
### [`v2.7.17`](https://github.com/StackExchange/StackExchange.Redis/releases/tag/2.7.17)
[Compare Source](https://github.com/StackExchange/StackExchange.Redis/compare/2.7.10...2.7.17)
#### What's Changed
- Fix: [#​2321](https://github.com/StackExchange/StackExchange.Redis/issues/2321): Honor disposition of select command in Command Map for transactions ([#​2322](https://github.com/StackExchange/StackExchange.Redis/issues/2322) by [@​slorello89](https://github.com/slorello89))
- Fix [#​2619](https://github.com/StackExchange/StackExchange.Redis/issues/2619): Type-forward `IsExternalInit` to support down-level TFMs ([#​2621](https://github.com/StackExchange/StackExchange.Redis/issues/2621) by [@​mgravell](https://github.com/mgravell))
- `InternalsVisibleTo` `PublicKey` enhancements([#​2623](https://github.com/StackExchange/StackExchange.Redis/issues/2623) by [@​WeihanLi](https://github.com/WeihanLi))
- Fix [#​2576](https://github.com/StackExchange/StackExchange.Redis/issues/2576): Prevent `NullReferenceException` during shutdown of connections ([#​2629](https://github.com/StackExchange/StackExchange.Redis/issues/2629) by [@​NickCraver](https://github.com/NickCraver))
**Full Changelog**: https://github.com/StackExchange/StackExchange.Redis/compare/2.7.10...2.7.17
### [`v2.7.10`](https://github.com/StackExchange/StackExchange.Redis/releases/tag/2.7.10)
[Compare Source](https://github.com/StackExchange/StackExchange.Redis/compare/2.7.4...2.7.10)
- Fix [#​2593](https://github.com/StackExchange/StackExchange.Redis/issues/2593): `EXPIRETIME` and `PEXPIRETIME` miscategorized as `PrimaryOnly` commands causing them to fail when issued against a read-only replica ([#​2593](https://github.com/StackExchange/StackExchange.Redis/issues/2593) by [@​slorello89](https://github.com/slorello89))
- Fix [#​2591](https://github.com/StackExchange/StackExchange.Redis/issues/2591): Add `HELLO` to Sentinel connections so they can support RESP3 ([#​2601](https://github.com/StackExchange/StackExchange.Redis/issues/2601) by [@​NickCraver](https://github.com/NickCraver))
- Fix [#​2595](https://github.com/StackExchange/StackExchange.Redis/issues/2595): Add detection handling for dead sockets that the OS says are okay, seen especially in Linux environments ([#​2610](https://github.com/StackExchange/StackExchange.Redis/issues/2610) by [@​NickCraver](https://github.com/NickCraver))
-
**Full Changelog**: https://github.com/StackExchange/StackExchange.Redis/compare/2.7.4...2.7.10
### [`v2.7.4`](https://github.com/StackExchange/StackExchange.Redis/releases/tag/2.7.4)
[Compare Source](https://github.com/StackExchange/StackExchange.Redis/compare/2.6.122...2.7.4)
- Add: RESP3 support ([#​2396](https://github.com/StackExchange/StackExchange.Redis/issues/2396) by [@​mgravell](https://github.com/mgravell)) - see https://stackexchange.github.io/StackExchange.Redis/Resp3
- Fix [#​2507](https://github.com/StackExchange/StackExchange.Redis/issues/2507): Pub/sub with multi-item payloads should be usable ([#​2508](https://github.com/StackExchange/StackExchange.Redis/issues/2508) by [@​mgravell](https://github.com/mgravell))
- Add: connection-id tracking (internal only, no public API) ([#​2508](https://github.com/StackExchange/StackExchange.Redis/issues/2508) by [@​mgravell](https://github.com/mgravell))
- Add: `ConfigurationOptions.LoggerFactory` for logging to an `ILoggerFactory` (e.g. `ILogger`) all connection and error events ([#​2051](https://github.com/StackExchange/StackExchange.Redis/issues/2051) by [@​NickCraver](https://github.com/NickCraver))
- Fix [#​2467](https://github.com/StackExchange/StackExchange.Redis/issues/2467): Add StreamGroupInfo EntriesRead and Lag ([#​2510](https://github.com/StackExchange/StackExchange.Redis/issues/2510) by [@​tvdias](https://github.com/tvdias))
**Full Changelog**: https://github.com/StackExchange/StackExchange.Redis/compare/2.6.122..2.7.4
### [`v2.6.122`](https://github.com/StackExchange/StackExchange.Redis/releases/tag/2.6.122)
[Compare Source](https://github.com/StackExchange/StackExchange.Redis/compare/2.6.116...2.6.122)
- Change: Target net6.0 instead of net5.0, since net5.0 is end of life. ([#​2497](https://github.com/StackExchange/StackExchange.Redis/issues/2497) by [@​eerhardt](https://github.com/eerhardt))
- Fix: Fix nullability annotation of IConnectionMultiplexer.RegisterProfiler ([#​2494](https://github.com/StackExchange/StackExchange.Redis/issues/2494) by [@​eerhardt](https://github.com/eerhardt))
- Add: `Timer.ActiveCount` under `POOL` in timeout messages on .NET 6+ to help diagnose timer overload affecting timeout evaluations ([#​2500](https://github.com/StackExchange/StackExchange.Redis/issues/2500) by [@​NickCraver](https://github.com/NickCraver))
- Add: `LibraryName` configuration option; allows the library name to be controlled at the individual options level (in addition to the existing controls in `DefaultOptionsProvider`) ([#​2502](https://github.com/StackExchange/StackExchange.Redis/issues/2502) by [@​mgravell](https://github.com/mgravell))
- Add: `DefaultOptionsProvider.GetProvider` allows lookup of provider by endpoint ([#​2502](https://github.com/StackExchange/StackExchange.Redis/issues/2502) by [@​mgravell](https://github.com/mgravell))
**Full Changelog**: https://github.com/StackExchange/StackExchange.Redis/compare/2.6.116...2.6.122
### [`v2.6.116`](https://github.com/StackExchange/StackExchange.Redis/releases/tag/2.6.116)
[Compare Source](https://github.com/StackExchange/StackExchange.Redis/compare/2.6.111...2.6.116)
- Fix [#​2479](https://github.com/StackExchange/StackExchange.Redis/issues/2479): Add `RedisChannel.UseImplicitAutoPattern` (global) and `RedisChannel.IsPattern` ([#​2480](https://github.com/StackExchange/StackExchange.Redis/issues/2480) by [@​mgravell](https://github.com/mgravell))
- Fix [#​2479](https://github.com/StackExchange/StackExchange.Redis/issues/2479): Mark `RedisChannel` conversion operators as obsolete; add `RedisChannel.Literal` and `RedisChannel.Pattern` helpers ([#​2481](https://github.com/StackExchange/StackExchange.Redis/issues/2481) by [@​mgravell](https://github.com/mgravell))
- Fix [#​2449](https://github.com/StackExchange/StackExchange.Redis/issues/2449): Update `Pipelines.Sockets.Unofficial` to `v2.2.8` to support native AOT ([#​2456](https://github.com/StackExchange/StackExchange.Redis/issues/2456) by [@​eerhardt](https://github.com/eerhardt))
**Full Changelog**: https://github.com/StackExchange/StackExchange.Redis/compare/2.6.111...2.6.116
### [`v2.6.111`](https://github.com/StackExchange/StackExchange.Redis/releases/tag/2.6.111)
[Compare Source](https://github.com/StackExchange/StackExchange.Redis/compare/2.6.104...2.6.111)
- Fix [#​2426](https://github.com/StackExchange/StackExchange.Redis/issues/2426): Don't restrict multi-slot operations on Envoy proxy; let the proxy decide ([#​2428](https://github.com/StackExchange/StackExchange.Redis/issues/2428) by [@​mgravell](https://github.com/mgravell))
- Add: Support for `User`/`Password` in `DefaultOptionsProvider` to support token rotation scenarios ([#​2445](https://github.com/StackExchange/StackExchange.Redis/issues/2445) by [@​NickCraver](https://github.com/NickCraver))
- Fix [#​2449](https://github.com/StackExchange/StackExchange.Redis/issues/2449): Resolve AOT trim warnings in `TryGetAzureRoleInstanceIdNoThrow` ([#​2451](https://github.com/StackExchange/StackExchange.Redis/issues/2451) by [@​eerhardt](https://github.com/eerhardt))
- Adds: Support for `HTTP/1.1 200 Connection established` in HTTP Tunnel ([#​2448](https://github.com/StackExchange/StackExchange.Redis/issues/2448) by [@​flobernd](https://github.com/flobernd))
- Adds: Timeout duration to backlog timeout error messages ([#​2452](https://github.com/StackExchange/StackExchange.Redis/issues/2452) by [@​NickCraver](https://github.com/NickCraver))
- Adds: `DefaultOptionsProvider.LibraryName` for specifying lib-name passed to `CLIENT SETINFO` in Redis 7.2+ ([#​2453](https://github.com/StackExchange/StackExchange.Redis/issues/2453) by [@​NickCraver](https://github.com/NickCraver))
#### New Contributors
- [@​eerhardt](https://github.com/eerhardt) made their first contribution in https://github.com/StackExchange/StackExchange.Redis/pull/2451
- [@​flobernd](https://github.com/flobernd) made their first contribution in https://github.com/StackExchange/StackExchange.Redis/pull/2448
**Full Changelog**: https://github.com/StackExchange/StackExchange.Redis/compare/2.6.104...2.6.111
### [`v2.6.104`](https://github.com/StackExchange/StackExchange.Redis/releases/tag/2.6.104)
[Compare Source](https://github.com/StackExchange/StackExchange.Redis/compare/2.6.96...2.6.104)
- Fix [#​2412](https://github.com/StackExchange/StackExchange.Redis/issues/2412): Critical (but rare) GC bug that can lead to async tasks never completing if the multiplexer is not held by the consumer ([#​2408](https://github.com/StackExchange/StackExchange.Redis/issues/2408) by [@​mgravell](https://github.com/mgravell))
- Fix [#​2392](https://github.com/StackExchange/StackExchange.Redis/issues/2392): Dequeue *all* timed out messages from the backlog when not connected (including Fire+Forget) ([#​2397](https://github.com/StackExchange/StackExchange.Redis/issues/2397) by [@​kornelpal](https://github.com/kornelpal))
- Fix [#​2400](https://github.com/StackExchange/StackExchange.Redis/issues/2400): Expose `ChannelMessageQueue` as `IAsyncEnumerable<ChannelMessage>` ([#​2402](https://github.com/StackExchange/StackExchange.Redis/issues/2402) by [@​mgravell](https://github.com/mgravell))
- Adds: Better error messages (over generic timeout) when commands are backlogged and unable to write to any connection ([#​2408](https://github.com/StackExchange/StackExchange.Redis/issues/2408) by [@​NickCraver](https://github.com/NickCraver))
- Adds: Support for `CLIENT SETINFO` (lib name/version) during handshake; opt-out is via `ConfigurationOptions`; also support read of `resp`, `lib-ver` and `lib-name` via `CLIENT LIST` ([#​2414](https://github.com/StackExchange/StackExchange.Redis/issues/2414) by [@​mgravell](https://github.com/mgravell))
- Documentation: clarify the meaning of `RedisValue.IsInteger` re [#​2418](https://github.com/StackExchange/StackExchange.Redis/issues/2418) ([#​2420](https://github.com/StackExchange/StackExchange.Redis/issues/2420) by [@​mgravell](https://github.com/mgravell))
#### New Contributors
- [@​SonnyRR](https://github.com/SonnyRR) made their first contribution in https://github.com/StackExchange/StackExchange.Redis/pull/2410
- [@​kornelpal](https://github.com/kornelpal) made their first contribution in https://github.com/StackExchange/StackExchange.Redis/pull/2397
**Full Changelog**: https://github.com/StackExchange/StackExchange.Redis/compare/2.6.96...2.6.104
### [`v2.6.96`](https://github.com/StackExchange/StackExchange.Redis/releases/tag/2.6.96)
[Compare Source](https://github.com/StackExchange/StackExchange.Redis/compare/2.6.90...2.6.96)
- Fix [#​2350](https://github.com/StackExchange/StackExchange.Redis/issues/2350): Properly parse lua script paramters in all cultures ([#​2351](https://github.com/StackExchange/StackExchange.Redis/issues/2351) by [@​NickCraver](https://github.com/NickCraver))
- Fix [#​2362](https://github.com/StackExchange/StackExchange.Redis/issues/2362): Set `RedisConnectionException.FailureType` to `AuthenticationFailure` on all authentication scenarios for better handling ([#​2367](https://github.com/StackExchange/StackExchange.Redis/issues/2367) by [@​NickCraver](https://github.com/NickCraver))
- Fix [#​2368](https://github.com/StackExchange/StackExchange.Redis/issues/2368): Support `RedisValue.Length()` for all storage types ([#​2370](https://github.com/StackExchange/StackExchange.Redis/issues/2370) by [@​mgravell](https://github.com/mgravell))
- Fix [#​2376](https://github.com/StackExchange/StackExchange.Redis/issues/2376): Avoid a (rare) deadlock scenario ([#​2378](https://github.com/StackExchange/StackExchange.Redis/issues/2378) by [@​mgravell](https://github.com/mgravell))
**Full Changelog**: https://github.com/StackExchange/StackExchange.Redis/compare/2.6.90...2.6.96
### [`v2.6.90`](https://github.com/StackExchange/StackExchange.Redis/releases/tag/2.6.90)
[Compare Source](https://github.com/StackExchange/StackExchange.Redis/compare/2.6.86...2.6.90)
- Adds: Support for `EVAL_RO` and `EVALSHA_RO` via `IDatabase.ScriptEvaluateReadOnly`/`IDatabase.ScriptEvaluateReadOnlyAsync` ([#​2168](https://github.com/StackExchange/StackExchange.Redis/issues/2168) by [@​shacharPash](https://github.com/shacharPash))
- Fix [#​1458](https://github.com/StackExchange/StackExchange.Redis/issues/1458): Fixes a leak condition when a connection completes on the TCP phase but not the Redis handshake ([#​2238](https://github.com/StackExchange/StackExchange.Redis/issues/2238) by [@​NickCraver](https://github.com/NickCraver))
- Internal: ServerSnapshot: Improve API and allow filtering with custom struct enumerator ([#​2337](https://github.com/StackExchange/StackExchange.Redis/issues/2337) by [@​mgravell](https://github.com/mgravell))
### [`v2.6.86`](https://github.com/StackExchange/StackExchange.Redis/releases/tag/2.6.86)
[Compare Source](https://github.com/StackExchange/StackExchange.Redis/compare/2.6.80...2.6.86)
- Fix [#​1520](https://github.com/StackExchange/StackExchange.Redis/issues/1520) & [#​1660](https://github.com/StackExchange/StackExchange.Redis/issues/1660): When `MOVED` is encountered from a cluster, a reconfigure will happen proactively to react to cluster changes ASAP ([#​2286](https://github.com/StackExchange/StackExchange.Redis/issues/2286) by [@​NickCraver](https://github.com/NickCraver))
- Fix [#​2249](https://github.com/StackExchange/StackExchange.Redis/issues/2249): Properly handle a `fail` state (new `ClusterNode.IsFail` property) for `CLUSTER NODES` and expose `fail?` as a property (`IsPossiblyFail`) as well ([#​2288](https://github.com/StackExchange/StackExchange.Redis/issues/2288) by [@​NickCraver](https://github.com/NickCraver))
- Adds: `IConnectionMultiplexer.ServerMaintenanceEvent` (was on `ConnectionMultiplexer` but not the interface) ([#​2306](https://github.com/StackExchange/StackExchange.Redis/issues/2306) by [@​NickCraver](https://github.com/NickCraver))
- Adds: To timeout messages, additional debug information: `Sync-Ops` (synchronous operations), `Async-Ops` (asynchronous operations), and `Server-Connected-Seconds` (how long the connection in question has been connected, or `"n/a"`) ([#​2300](https://github.com/StackExchange/StackExchange.Redis/issues/2300) by [@​NickCraver](https://github.com/NickCraver))
### [`v2.6.80`](https://github.com/StackExchange/StackExchange.Redis/releases/tag/2.6.80)
[Compare Source](https://github.com/StackExchange/StackExchange.Redis/compare/2.6.70...2.6.80)
- Adds: `last-in` and `cur-in` (bytes) to timeout exceptions to help identify timeouts that were just-behind another large payload off the wire ([#​2276](https://github.com/StackExchange/StackExchange.Redis/issues/2276) by [@​NickCraver](https://github.com/NickCraver))
- Adds: general-purpose tunnel support, with HTTP proxy "connect" support included ([#​2274](https://github.com/StackExchange/StackExchange.Redis/issues/2274) by [@​mgravell](https://github.com/mgravell))
- Removes: Package dependency (`System.Diagnostics.PerformanceCounter`) ([#​2285](https://github.com/StackExchange/StackExchange.Redis/issues/2285) by [@​NickCraver](https://github.com/NickCraver))
### [`v2.6.70`](https://github.com/StackExchange/StackExchange.Redis/releases/tag/2.6.70)
[Compare Source](https://github.com/StackExchange/StackExchange.Redis/compare/2.6.66...2.6.70)
- Fix: `MOVED` with `NoRedirect` (and other non-reachable errors) should respect the `IncludeDetailInExceptions` setting ([#​2267](https://github.com/StackExchange/StackExchange.Redis/issues/2267) by [@​mgravell](https://github.com/mgravell))
- Fix [#​2251](https://github.com/StackExchange/StackExchange.Redis/issues/2251) & [#​2265](https://github.com/StackExchange/StackExchange.Redis/issues/2265): Cluster endpoint connections weren't proactively connecting subscriptions in all cases and taking the full connection timeout to complete as a result ([#​2268](https://github.com/StackExchange/StackExchange.Redis/issues/2268) by [@​iteplov](https://github.com/iteplov))
### [`v2.6.66`](https://github.com/StackExchange/StackExchange.Redis/releases/tag/2.6.66)
[Compare Source](https://github.com/StackExchange/StackExchange.Redis/compare/2.6.48...2.6.66)
- Fix [#​2182](https://github.com/StackExchange/StackExchange.Redis/issues/2182): Be more flexible in which commands are "primary only" in order to support users with replicas that are explicitly configured to allow writes ([#​2183](https://github.com/StackExchange/StackExchange.Redis/issues/2183) by [@​slorello89](https://github.com/slorello89))
- Adds: `IConnectionMultiplexer` now implements `IAsyncDisposable` ([#​2161](https://github.com/StackExchange/StackExchange.Redis/issues/2161) by [@​kimsey0](https://github.com/kimsey0))
- Adds: `IConnectionMultiplexer.GetServers()` to get all `IServer` instances for a multiplexer ([#​2203](https://github.com/StackExchange/StackExchange.Redis/issues/2203) by [@​NickCraver](https://github.com/NickCraver))
- Fix [#​2016](https://github.com/StackExchange/StackExchange.Redis/issues/2016): Align server selection with supported commands (e.g. with writable servers) to reduce `Command cannot be issued to a replica` errors ([#​2191](https://github.com/StackExchange/StackExchange.Redis/issues/2191) by [@​slorello89](https://github.com/slorello89))
- Performance: Optimization around timeout processing to reduce lock contention in the case of many items that haven't yet timed out during a heartbeat ([#​2217](https://github.com/StackExchange/StackExchange.Redis/issues/2217) by [@​NickCraver](https://github.com/NickCraver))
- Fix [#​2223](https://github.com/StackExchange/StackExchange.Redis/issues/2223): Resolve sync-context issues (missing `ConfigureAwait(false)`) ([#​2229](https://github.com/StackExchange/StackExchange.Redis/issues/2229) by [@​mgravell](https://github.com/mgravell))
- Fix [#​1968](https://github.com/StackExchange/StackExchange.Redis/issues/1968): Improved handling of EVAL scripts during server restarts and failovers, detecting and re-sending the script for a retry when needed ([#​2170](https://github.com/StackExchange/StackExchange.Redis/issues/2170) by [@​martintmk](https://github.com/martintmk))
- Adds: `ConfigurationOptions.SslClientAuthenticationOptions` (`netcoreapp3.1`/`net5.0`+ only) to give more control over SSL/TLS authentication ([#​2224](https://github.com/StackExchange/StackExchange.Redis/issues/2224) by [@​NickCraver](https://github.com/NickCraver))
- Fix [#​2240](https://github.com/StackExchange/StackExchange.Redis/pull/2241): Improve support for DNS-based IPv6 endpoints ([#​2241](https://github.com/StackExchange/StackExchange.Redis/issues/2241) by [@​NickCraver](https://github.com/NickCraver))
- Adds: `ConfigurationOptions.HeartbeatInterval` (**Advanced Setting** - [see docs](https://stackexchange.github.io/StackExchange.Redis/Configuration#configuration-options)) To allow more finite control of the client heartbeat, which encompases how often command timeouts are actually evaluated - still defaults to 1,000 ms ([#​2243](https://github.com/StackExchange/StackExchange.Redis/issues/2243) by [@​NickCraver](https://github.com/NickCraver))
- Fix [#​1879](https://github.com/StackExchange/StackExchange.Redis/issues/1879): Improve exception message when the wrong password is used ([#​2246](https://github.com/StackExchange/StackExchange.Redis/issues/2246) by [@​NickCraver](https://github.com/NickCraver))
- Fix [#​2233](https://github.com/StackExchange/StackExchange.Redis/issues/2233): Repeated connection to Sentinel servers using the same ConfigurationOptions would fail ([#​2242](https://github.com/StackExchange/StackExchange.Redis/issues/2242) by [@​NickCraver](https://github.com/NickCraver))
### [`v2.6.48`](https://github.com/StackExchange/StackExchange.Redis/releases/tag/2.6.48)
[Compare Source](https://github.com/StackExchange/StackExchange.Redis/compare/2.6.45...2.6.48)
- URGENT Fix: [#​2167](https://github.com/StackExchange/StackExchange.Redis/issues/2167), [#​2176](https://github.com/StackExchange/StackExchange.Redis/issues/2176): fix error in batch/transaction handling that can result in out-of-order instructions ([#​2177](https://github.com/StackExchange/StackExchange.Redis/issues/2177) by [@​mgravell](https://github.com/mgravell))
- Fix: [#​2164](https://github.com/StackExchange/StackExchange.Redis/issues/2164): fix `LuaScript.Prepare` for scripts that don't have parameters ([#​2166](https://github.com/StackExchange/StackExchange.Redis/issues/2166) by [@​mgravell](https://github.com/mgravell))
### [`v2.6.45`](https://github.com/StackExchange/StackExchange.Redis/releases/tag/2.6.45)
[Compare Source](https://github.com/StackExchange/StackExchange.Redis/compare/2.5.61...2.6.45)
- Adds: [Nullable reference type](https://docs.microsoft.com/en-us/dotnet/csharp/nullable-references) annotations ([#​2041](https://github.com/StackExchange/StackExchange.Redis/issues/2041) by [@​NickCraver](https://github.com/NickCraver))
- Adds annotations themselves for nullability to everything in the library
- Fixes a few internal edge cases that will now throw proper errors (rather than a downstream null reference)
- Fixes inconsistencies with `null` vs. empty array returns (preferring an not-null empty array in those edge cases)
- Note: does *not* increment a major version (as these are warnings to consumers), because: they're warnings (errors are opt-in), removing obsolete types with a 3.0 rev *would* be binary breaking (this isn't), and reving to 3.0 would cause binding redirect pain for consumers. Bumping from 2.5 to 2.6 only for this change.
- Adds: Support for `COPY` with `.KeyCopy()`/`.KeyCopyAsync()` ([#​2064](https://github.com/StackExchange/StackExchange.Redis/issues/2064) by [@​Avital-Fine](https://github.com/Avital-Fine))
- Adds: Support for `LMOVE` with `.ListMove()`/`.ListMoveAsync()` ([#​2065](https://github.com/StackExchange/StackExchange.Redis/issues/2065) by [@​Avital-Fine](https://github.com/Avital-Fine))
- Adds: Support for `ZRANDMEMBER` with `.SortedSetRandomMember()`/`.SortedSetRandomMemberAsync()`, `.SortedSetRandomMembers()`/`.SortedSetRandomMembersAsync()`, and `.SortedSetRandomMembersWithScores()`/`.SortedSetRandomMembersWithScoresAsync()` ([#​2076](https://github.com/StackExchange/StackExchange.Redis/issues/2076) by [@​Avital-Fine](https://github.com/Avital-Fine))
- Adds: Support for `SMISMEMBER` with `.SetContains()`/`.SetContainsAsync()` ([#​2077](https://github.com/StackExchange/StackExchange.Redis/issues/2077) by [@​Avital-Fine](https://github.com/Avital-Fine))
- Adds: Support for `ZDIFF`, `ZDIFFSTORE`, `ZINTER`, `ZINTERCARD`, and `ZUNION` with `.SortedSetCombine()`/`.SortedSetCombineAsync()`, `.SortedSetCombineWithScores()`/`.SortedSetCombineWithScoresAsync()`, and `.SortedSetIntersectionLength()`/`.SortedSetIntersectionLengthAsync()` ([#​2075](https://github.com/StackExchange/StackExchange.Redis/issues/2075) by [@​Avital-Fine](https://github.com/Avital-Fine))
- Adds: Support for `SINTERCARD` with `.SetIntersectionLength()`/`.SetIntersectionLengthAsync()` ([#​2078](https://github.com/StackExchange/StackExchange.Redis/issues/2078) by [@​Avital-Fine](https://github.com/Avital-Fine))
- Adds: Support for `LPOS` with `.ListPosition()`/`.ListPositionAsync()` and `.ListPositions()`/`.ListPositionsAsync()` ([#​2080](https://github.com/StackExchange/StackExchange.Redis/issues/2080) by [@​slorello89](https://github.com/slorello89))
- Adds: Support for `ZMSCORE` with `.SortedSetScores()`/.`SortedSetScoresAsync()` ([#​2082](https://github.com/StackExchange/StackExchange.Redis/issues/2082) by [@​ttingen](https://github.com/ttingen))
- Adds: Support for `NX | XX | GT | LT` to `EXPIRE`, `EXPIREAT`, `PEXPIRE`, and `PEXPIREAT` with `.KeyExpire()`/`.KeyExpireAsync()` ([#​2083](https://github.com/StackExchange/StackExchange.Redis/issues/2083) by [@​Avital-Fine](https://github.com/Avital-Fine))
- Adds: Support for `EXPIRETIME`, and `PEXPIRETIME` with `.KeyExpireTime()`/`.KeyExpireTimeAsync()` ([#​2083](https://github.com/StackExchange/StackExchange.Redis/issues/2083) by [@​Avital-Fine](https://github.com/Avital-Fine))
- Fix: For streams, properly hash `XACK`, `XCLAIM`, and `XPENDING` in cluster scenarios to eliminate `MOVED` retries ([#​2085](https://github.com/StackExchange/StackExchange.Redis/issues/2085) by [@​nielsderdaele](https://github.com/nielsderdaele))
- Adds: Support for `OBJECT REFCOUNT` with `.KeyRefCount()`/`.KeyRefCountAsync()` ([#​2087](https://github.com/StackExchange/StackExchange.Redis/issues/2087) by [@​Avital-Fine](https://github.com/Avital-Fine))
- Adds: Support for `OBJECT ENCODING` with `.KeyEncoding()`/`.KeyEncodingAsync()` ([#​2088](https://github.com/StackExchange/StackExchange.Redis/issues/2088) by [@​Avital-Fine](https://github.com/Avital-Fine))
- Adds: Support for `GEOSEARCH` with `.GeoSearch()`/`.GeoSearchAsync()` ([#​2089](https://github.com/StackExchange/StackExchange.Redis/issues/2089) by [@​slorello89](https://github.com/slorello89))
- Adds: Support for `GEOSEARCHSTORE` with `.GeoSearchAndStore()`/`.GeoSearchAndStoreAsync()` ([#​2089](https://github.com/StackExchange/StackExchange.Redis/issues/2089) by [@​slorello89](https://github.com/slorello89))
- Adds: Support for `HRANDFIELD` with `.HashRandomField()`/`.HashRandomFieldAsync()`, `.HashRandomFields()`/`.HashRandomFieldsAsync()`, and `.HashRandomFieldsWithValues()`/`.HashRandomFieldsWithValuesAsync()` ([#​2090](https://github.com/StackExchange/StackExchange.Redis/issues/2090) by [@​slorello89](https://github.com/slorello89))
- Adds: Support for `LMPOP` with `.ListLeftPop()`/`.ListLeftPopAsync()` and `.ListRightPop()`/`.ListRightPopAsync()` ([#​2094](https://github.com/StackExchange/StackExchange.Redis/issues/2094) by [@​slorello89](https://github.com/slorello89))
- Adds: Support for `ZMPOP` with `.SortedSetPop()`/`.SortedSetPopAsync()` ([#​2094](https://github.com/StackExchange/StackExchange.Redis/issues/2094) by [@​slorello89](https://github.com/slorello89))
- Adds: Support for `XAUTOCLAIM` with `.StreamAutoClaim()`/.`StreamAutoClaimAsync()` and `.StreamAutoClaimIdsOnly()`/.`StreamAutoClaimIdsOnlyAsync()` ([#​2095](https://github.com/StackExchange/StackExchange.Redis/issues/2095) by [@​ttingen](https://github.com/ttingen))
- Fix [#​2071](https://github.com/StackExchange/StackExchange.Redis/issues/2071): Add `.StringSet()`/`.StringSetAsync()` overloads for source compat broken for 1 case in 2.5.61 ([#​2098](https://github.com/StackExchange/StackExchange.Redis/issues/2098) by [@​NickCraver](https://github.com/NickCraver))
- Fix [#​2086](https://github.com/StackExchange/StackExchange.Redis/issues/2086): Correct HashSlot calculations for `XREAD` and `XREADGROUP` commands ([#​2093](https://github.com/StackExchange/StackExchange.Redis/issues/2093) by [@​nielsderdaele](https://github.com/nielsderdaele))
- Adds: Support for `LCS` with `.StringLongestCommonSubsequence()`/`.StringLongestCommonSubsequence()`, `.StringLongestCommonSubsequenceLength()`/`.StringLongestCommonSubsequenceLengthAsync()`, and `.StringLongestCommonSubsequenceWithMatches()`/`.StringLongestCommonSubsequenceWithMatchesAsync()` ([#​2104](https://github.com/StackExchange/StackExchange.Redis/issues/2104) by [@​Avital-Fine](https://github.com/Avital-Fine))
- Adds: Support for `OBJECT FREQ` with `.KeyFrequency()`/`.KeyFrequencyAsync()` ([#​2105](https://github.com/StackExchange/StackExchange.Redis/issues/2105) by [@​Avital-Fine](https://github.com/Avital-Fine))
- Performance: Avoids allocations when computing cluster hash slots or testing key equality ([#​2110](https://github.com/StackExchange/StackExchange.Redis/issues/2110) by [@​mgravell](https://github.com/mgravell))
- Adds: Support for `SORT_RO` with `.Sort()`/`.SortAsync()` ([#​2111](https://github.com/StackExchange/StackExchange.Redis/issues/2111) by [@​slorello89](https://github.com/slorello89))
- Adds: Support for `BIT | BYTE` to `BITCOUNT` and `BITPOS` with `.StringBitCount()`/`.StringBitCountAsync()` and `.StringBitPosition()`/`.StringBitPositionAsync()` ([#​2116](https://github.com/StackExchange/StackExchange.Redis/issues/2116) by [@​Avital-Fine](https://github.com/Avital-Fine))
- Adds: Support for pub/sub payloads that are unary arrays ([#​2118](https://github.com/StackExchange/StackExchange.Redis/issues/2118) by [@​mgravell](https://github.com/mgravell))
- Fix: Sentinel timer race during dispose ([#​2133](https://github.com/StackExchange/StackExchange.Redis/issues/2133) by [@​ewisuri](https://github.com/ewisuri))
- Adds: Support for `GT`, `LT`, and `CH` on `ZADD` with `.SortedSetAdd()`/`.SortedSetAddAsync()` and `.SortedSetUpdate()`/`.SortedSetUpdateAsync()` ([#​2136](https://github.com/StackExchange/StackExchange.Redis/issues/2136) by [@​Avital-Fine](https://github.com/Avital-Fine))
- Adds: Support for `COMMAND COUNT`, `COMMAND GETKEYS`, and `COMMAND LIST`, with `.CommandCount()`/`.CommandCountAsync()`, `.CommandGetKeys()`/`.CommandGetKeysAsync()`, and `.CommandList()`/`.CommandListAsync()` ([#​2143](https://github.com/StackExchange/StackExchange.Redis/issues/2143) by [@​shacharPash](https://github.com/shacharPash))
### [`v2.5.61`](https://github.com/StackExchange/StackExchange.Redis/releases/tag/2.5.61)
[Compare Source](https://github.com/StackExchange/StackExchange.Redis/compare/2.5.43...2.5.61)
- Adds: `GETEX` support with `.StringGetSetExpiry()`/`.StringGetSetExpiryAsync()` ([#​1743](https://github.com/StackExchange/StackExchange.Redis/issues/1743) by [@​benbryant0](https://github.com/benbryant0))
- Fix [#​1988](https://github.com/StackExchange/StackExchange.Redis/issues/1988): Don't issue `SELECT` commands if explicitly disabled ([#​2023](https://github.com/StackExchange/StackExchange.Redis/issues/2023) by [@​NickCraver](https://github.com/NickCraver))
- Adds: `KEEPTTL` support on `SET` operations ([#​2029](https://github.com/StackExchange/StackExchange.Redis/issues/2029) by [@​NickCraver](https://github.com/NickCraver))
- Fix: Allow `XTRIM` `MAXLEN` argument to be `0` ([#​2030](https://github.com/StackExchange/StackExchange.Redis/issues/2030) by [@​NicoAvanzDev](https://github.com/NicoAvanzDev))
- Adds: `ConfigurationOptions.BeforeSocketConnect` for configuring sockets between creation and connection ([#​2031](https://github.com/StackExchange/StackExchange.Redis/issues/2031) by [@​NickCraver](https://github.com/NickCraver))
- Fix [#​1813](https://github.com/StackExchange/StackExchange.Redis/issues/1813): Don't connect to endpoints we failed to parse ([#​2042](https://github.com/StackExchange/StackExchange.Redis/issues/2042) by [@​NickCraver](https://github.com/NickCraver))
- Fix: `ClientKill`/`ClientKillAsync` when using `ClientType` ([#​2048](https://github.com/StackExchange/StackExchange.Redis/issues/2048) by [@​NickCraver](https://github.com/NickCraver))
- Adds: Most `ConfigurationOptions` changes after `ConnectionMultiplexer` connections will now be respected, e.g. changing a timeout will work and changing a password for auth rotation would be used at the next reconnect ([#​2050](https://github.com/StackExchange/StackExchange.Redis/issues/2050) by [@​NickCraver](https://github.com/NickCraver))
- **Obsolete**: This change also moves `ConnectionMultiplexer.IncludeDetailInExceptions` and `ConnectionMultiplexer.IncludePerformanceCountersInExceptions` to `ConfigurationOptions`. The old properties are `[Obsolete]` proxies that work until 3.0 for compatibility.
- Adds: Support for `ZRANGESTORE` with `.SortedSetRangeAndStore()`/`.SortedSetRangeAndStoreAsync()` ([#​2052](https://github.com/StackExchange/StackExchange.Redis/issues/2052) by [@​slorello89](https://github.com/slorello89))
### [`v2.5.43`](https://github.com/StackExchange/StackExchange.Redis/releases/tag/2.5.43)
[Compare Source](https://github.com/StackExchange/StackExchange.Redis/compare/2.2.88...2.5.43)
- Adds: Bounds checking for `ExponentialRetry` backoff policy ([#​1921](https://github.com/StackExchange/StackExchange.Redis/issues/1921) by [@​gliljas](https://github.com/gliljas))
- Adds: `DefaultOptionsProvider` support for endpoint-based defaults configuration ([#​1987](https://github.com/StackExchange/StackExchange.Redis/issues/1987) by [@​NickCraver](https://github.com/NickCraver))
- Adds: Envoy proxy support ([#​1989](https://github.com/StackExchange/StackExchange.Redis/issues/1989) by [@​rkarthick](https://github.com/rkarthick))
- Performance: When `SUBSCRIBE` is disabled, give proper errors and connect faster ([#​2001](https://github.com/StackExchange/StackExchange.Redis/issues/2001) by [@​NickCraver](https://github.com/NickCraver))
- Adds: `GET` on `SET` command support (present in Redis 6.2+ - [#​2003](https://github.com/StackExchange/StackExchange.Redis/issues/2003) by [@​martinekvili](https://github.com/martinekvili))
- Performance: Improves concurrent load performance when backlogs are utilized ([#​2008](https://github.com/StackExchange/StackExchange.Redis/issues/2008) by [@​NickCraver](https://github.com/NickCraver))
- Stability: Improves cluster connections when `CLUSTER` command is disabled ([#​2014](https://github.com/StackExchange/StackExchange.Redis/issues/2014) by [@​tylerohlsen](https://github.com/tylerohlsen))
- Logging: Improves connection logging and adds overall timing to it ([#​2019](https://github.com/StackExchange/StackExchange.Redis/issues/2019) by [@​NickCraver](https://github.com/NickCraver))
### [`v2.2.88`](https://github.com/StackExchange/StackExchange.Redis/releases/tag/2.2.88)
[Compare Source](https://github.com/StackExchange/StackExchange.Redis/compare/2.2.79...2.2.88)
- Change: Connection backoff default is now exponential instead of linear ([#​1896](https://github.com/StackExchange/StackExchange.Redis/issues/1896) by [@​lolodi](https://github.com/lolodi))
- Adds: Support for `NodeMaintenanceScaleComplete` event (handles Redis cluster scaling) ([#​1902](https://github.com/StackExchange/StackExchange.Redis/issues/1902) by [@​NickCraver](https://github.com/NickCraver))
### [`v2.2.79`](https://github.com/StackExchange/StackExchange.Redis/releases/tag/2.2.79)
[Compare Source](https://github.com/StackExchange/StackExchange.Redis/compare/2.2.62...2.2.79)
- NRediSearch: Support on json index ([#​1808](https://github.com/StackExchange/StackExchange.Redis/issues/1808) by [@​AvitalFineRedis](https://github.com/AvitalFineRedis))
- NRediSearch: Support sortable TagFields and unNormalizedForm for Tag & Text Fields ([#​1862](https://github.com/StackExchange/StackExchange.Redis/issues/1862) by [@​slorello89](https://github.com/slorello89) & [@​AvitalFineRedis](https://github.com/AvitalFineRedis))
- Fix: Potential errors getting socket bytes ([#​1836](https://github.com/StackExchange/StackExchange.Redis/issues/1836) by [@​NickCraver](https://github.com/NickCraver))
- Logging: Adds (.NET Version and timestamps) for better debugging ([#​1796](https://github.com/StackExchange/StackExchange.Redis/issues/1796) by [@​philon-msft](https://github.com/philon-msft))
- Adds: `Condition` APIs (transactions), now supports `StreamLengthEqual` and variants ([#​1807](https://github.com/StackExchange/StackExchange.Redis/issues/1807) by [@​AlphaGremlin](https://github.com/AlphaGremlin))
- Adds: Support for count argument to `ListLeftPop`, `ListLeftPopAsync`, `ListRightPop`, and `ListRightPopAsync` ([#​1850](https://github.com/StackExchange/StackExchange.Redis/issues/1850) by [@​jjfmarket](https://github.com/jjfmarket))
- Fix: Potential task/thread exhaustion from the backlog processor ([#​1854](https://github.com/StackExchange/StackExchange.Redis/issues/1854) by [@​mgravell](https://github.com/mgravell))
- Adds: Support for listening to Azure Maintenance Events ([#​1876](https://github.com/StackExchange/StackExchange.Redis/issues/1876) by [@​amsoedal](https://github.com/amsoedal))
- Adds: `StringGetDelete`/`StringGetDeleteAsync` APIs for Redis `GETDEL` command([#​1840](https://github.com/StackExchange/StackExchange.Redis/issues/1840) by [@​WeihanLi](https://github.com/WeihanLi))
### [`v2.2.62`](https://github.com/StackExchange/StackExchange.Redis/releases/tag/2.2.62)
[Compare Source](https://github.com/StackExchange/StackExchange.Redis/compare/2.2.50...2.2.62)
- Stability: Sentinel potential memory leak fix in OnManagedConnectionFailed handler ([#​1710](https://github.com/StackExchange/StackExchange.Redis/issues/1710) by [@​alexSatov](https://github.com/alexSatov))
- Fix: `GetOutstandingCount` could obscure underlying faults by faulting itself ([#​1792](https://github.com/StackExchange/StackExchange.Redis/issues/1792) by [@​mgravell](https://github.com/mgravell))
- Fix [#​1719](https://github.com/StackExchange/StackExchange.Redis/issues/1719): With backlog messages becoming reordered ([#​1779](https://github.com/StackExchange/StackExchange.Redis/issues/1779) by [@​TimLovellSmith](https://github.com/TimLovellSmith))
### [`v2.2.50`](https://github.com/StackExchange/StackExchange.Redis/releases/tag/2.2.50)
- Performance: Optimization for PING accuracy ([#​1714](https://github.com/StackExchange/StackExchange.Redis/issues/1714) by [@​eduardobr](https://github.com/eduardobr))
- Fix: Improvement to reconnect logic (exponential backoff) ([#​1735](https://github.com/StackExchange/StackExchange.Redis/issues/1735) by [@​deepakverma](https://github.com/deepakverma))
- Adds: Refresh replica endpoint list on failover ([#​1684](https://github.com/StackExchange/StackExchange.Redis/issues/1684) by [@​laurauzcategui](https://github.com/laurauzcategui))
- Fix: `ReconfigureAsync` re-entrancy (caused connection issues) (\[1772 by [@​NickCraver](https://github.com/NickCraver))
- Fix: `ReconfigureAsync` Sentinel race resulting in NoConnectionAvailable when using DemandMaster ([#​1773](https://github.com/StackExchange/StackExchange.Redis/issues/1773) by [@​NickCraver](https://github.com/NickCraver))
- Stability: Resolve race in AUTH and other connection reconfigurations ([#​1759](https://github.com/StackExchange/StackExchange.Redis/issues/1759) by [@​TimLovellSmith](https://github.com/TimLovellSmith) and NickCraver)
</details>
---
### Configuration
📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).
🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.
♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 **Ignore**: Close this PR and you won't be reminded about this update again.
---
- [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box
---
This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy4yNjQuMCIsInVwZGF0ZWRJblZlciI6IjM3LjI2NC4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiJ9-->
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
This PR contains the following updates:
2.2.4->2.7.33Release Notes
StackExchange/StackExchange.Redis (StackExchange.Redis)
v2.7.33Compare Source
What's Changed
CheckTrustedIssuercertificate validation for broken chain scenarios (#2665 by @NickCraver)ConfigurationOptions.TrustIssuerat all.LoggingTunnelAPI; see https://stackexchange.github.io/StackExchange.Redis/Logging (#2660 by @mgravell)Full Changelog: https://github.com/StackExchange/StackExchange.Redis/compare/2.7.27...2.7.33
v2.7.27Compare Source
What's Changed
HeartbeatConsistencyChecksinClone()(#2658 by @mgravell)AddLibraryNameSuffixAPI for annotating connections with usage (#2659 by @mgravell)Full Changelog: https://github.com/StackExchange/StackExchange.Redis/compare/2.7.23...2.7.27
v2.7.23Compare Source
What's Changed
HeartbeatConsistencyChecksoption (opt-in) to enabled per-heartbeat (defaults to once per second) checks to be sent to ensure no network stream corruption has occurred (#2656 by @NickCraver)Full Changelog: https://github.com/StackExchange/StackExchange.Redis/compare/2.7.20...2.7.23
v2.7.20Compare Source
What's Changed
Full Changelog: https://github.com/StackExchange/StackExchange.Redis/compare/2.7.17...2.7.20
v2.7.17Compare Source
What's Changed
IsExternalInitto support down-level TFMs (#2621 by @mgravell)InternalsVisibleToPublicKeyenhancements(#2623 by @WeihanLi)NullReferenceExceptionduring shutdown of connections (#2629 by @NickCraver)Full Changelog: https://github.com/StackExchange/StackExchange.Redis/compare/2.7.10...2.7.17
v2.7.10Compare Source
EXPIRETIMEandPEXPIRETIMEmiscategorized asPrimaryOnlycommands causing them to fail when issued against a read-only replica (#2593 by @slorello89)HELLOto Sentinel connections so they can support RESP3 (#2601 by @NickCraver)Full Changelog: https://github.com/StackExchange/StackExchange.Redis/compare/2.7.4...2.7.10
v2.7.4Compare Source
ConfigurationOptions.LoggerFactoryfor logging to anILoggerFactory(e.g.ILogger) all connection and error events (#2051 by @NickCraver)Full Changelog: https://github.com/StackExchange/StackExchange.Redis/compare/2.6.122..2.7.4
v2.6.122Compare Source
Timer.ActiveCountunderPOOLin timeout messages on .NET 6+ to help diagnose timer overload affecting timeout evaluations (#2500 by @NickCraver)LibraryNameconfiguration option; allows the library name to be controlled at the individual options level (in addition to the existing controls inDefaultOptionsProvider) (#2502 by @mgravell)DefaultOptionsProvider.GetProviderallows lookup of provider by endpoint (#2502 by @mgravell)Full Changelog: https://github.com/StackExchange/StackExchange.Redis/compare/2.6.116...2.6.122
v2.6.116Compare Source
RedisChannel.UseImplicitAutoPattern(global) andRedisChannel.IsPattern(#2480 by @mgravell)RedisChannelconversion operators as obsolete; addRedisChannel.LiteralandRedisChannel.Patternhelpers (#2481 by @mgravell)Pipelines.Sockets.Unofficialtov2.2.8to support native AOT (#2456 by @eerhardt)Full Changelog: https://github.com/StackExchange/StackExchange.Redis/compare/2.6.111...2.6.116
v2.6.111Compare Source
User/PasswordinDefaultOptionsProviderto support token rotation scenarios (#2445 by @NickCraver)TryGetAzureRoleInstanceIdNoThrow(#2451 by @eerhardt)HTTP/1.1 200 Connection establishedin HTTP Tunnel (#2448 by @flobernd)DefaultOptionsProvider.LibraryNamefor specifying lib-name passed toCLIENT SETINFOin Redis 7.2+ (#2453 by @NickCraver)New Contributors
Full Changelog: https://github.com/StackExchange/StackExchange.Redis/compare/2.6.104...2.6.111
v2.6.104Compare Source
ChannelMessageQueueasIAsyncEnumerable<ChannelMessage>(#2402 by @mgravell)CLIENT SETINFO(lib name/version) during handshake; opt-out is viaConfigurationOptions; also support read ofresp,lib-verandlib-nameviaCLIENT LIST(#2414 by @mgravell)RedisValue.IsIntegerre #2418 (#2420 by @mgravell)New Contributors
Full Changelog: https://github.com/StackExchange/StackExchange.Redis/compare/2.6.96...2.6.104
v2.6.96Compare Source
RedisConnectionException.FailureTypetoAuthenticationFailureon all authentication scenarios for better handling (#2367 by @NickCraver)RedisValue.Length()for all storage types (#2370 by @mgravell)Full Changelog: https://github.com/StackExchange/StackExchange.Redis/compare/2.6.90...2.6.96
v2.6.90Compare Source
EVAL_ROandEVALSHA_ROviaIDatabase.ScriptEvaluateReadOnly/IDatabase.ScriptEvaluateReadOnlyAsync(#2168 by @shacharPash)v2.6.86Compare Source
MOVEDis encountered from a cluster, a reconfigure will happen proactively to react to cluster changes ASAP (#2286 by @NickCraver)failstate (newClusterNode.IsFailproperty) forCLUSTER NODESand exposefail?as a property (IsPossiblyFail) as well (#2288 by @NickCraver)IConnectionMultiplexer.ServerMaintenanceEvent(was onConnectionMultiplexerbut not the interface) (#2306 by @NickCraver)Sync-Ops(synchronous operations),Async-Ops(asynchronous operations), andServer-Connected-Seconds(how long the connection in question has been connected, or"n/a") (#2300 by @NickCraver)v2.6.80Compare Source
last-inandcur-in(bytes) to timeout exceptions to help identify timeouts that were just-behind another large payload off the wire (#2276 by @NickCraver)System.Diagnostics.PerformanceCounter) (#2285 by @NickCraver)v2.6.70Compare Source
MOVEDwithNoRedirect(and other non-reachable errors) should respect theIncludeDetailInExceptionssetting (#2267 by @mgravell)v2.6.66Compare Source
IConnectionMultiplexernow implementsIAsyncDisposable(#2161 by @kimsey0)IConnectionMultiplexer.GetServers()to get allIServerinstances for a multiplexer (#2203 by @NickCraver)Command cannot be issued to a replicaerrors (#2191 by @slorello89)ConfigureAwait(false)) (#2229 by @mgravell)ConfigurationOptions.SslClientAuthenticationOptions(netcoreapp3.1/net5.0+ only) to give more control over SSL/TLS authentication (#2224 by @NickCraver)ConfigurationOptions.HeartbeatInterval(Advanced Setting - see docs) To allow more finite control of the client heartbeat, which encompases how often command timeouts are actually evaluated - still defaults to 1,000 ms (#2243 by @NickCraver)v2.6.48Compare Source
LuaScript.Preparefor scripts that don't have parameters (#2166 by @mgravell)v2.6.45Compare Source
nullvs. empty array returns (preferring an not-null empty array in those edge cases)COPYwith.KeyCopy()/.KeyCopyAsync()(#2064 by @Avital-Fine)LMOVEwith.ListMove()/.ListMoveAsync()(#2065 by @Avital-Fine)ZRANDMEMBERwith.SortedSetRandomMember()/.SortedSetRandomMemberAsync(),.SortedSetRandomMembers()/.SortedSetRandomMembersAsync(), and.SortedSetRandomMembersWithScores()/.SortedSetRandomMembersWithScoresAsync()(#2076 by @Avital-Fine)SMISMEMBERwith.SetContains()/.SetContainsAsync()(#2077 by @Avital-Fine)ZDIFF,ZDIFFSTORE,ZINTER,ZINTERCARD, andZUNIONwith.SortedSetCombine()/.SortedSetCombineAsync(),.SortedSetCombineWithScores()/.SortedSetCombineWithScoresAsync(), and.SortedSetIntersectionLength()/.SortedSetIntersectionLengthAsync()(#2075 by @Avital-Fine)SINTERCARDwith.SetIntersectionLength()/.SetIntersectionLengthAsync()(#2078 by @Avital-Fine)LPOSwith.ListPosition()/.ListPositionAsync()and.ListPositions()/.ListPositionsAsync()(#2080 by @slorello89)ZMSCOREwith.SortedSetScores()/.SortedSetScoresAsync()(#2082 by @ttingen)NX | XX | GT | LTtoEXPIRE,EXPIREAT,PEXPIRE, andPEXPIREATwith.KeyExpire()/.KeyExpireAsync()(#2083 by @Avital-Fine)EXPIRETIME, andPEXPIRETIMEwith.KeyExpireTime()/.KeyExpireTimeAsync()(#2083 by @Avital-Fine)XACK,XCLAIM, andXPENDINGin cluster scenarios to eliminateMOVEDretries (#2085 by @nielsderdaele)OBJECT REFCOUNTwith.KeyRefCount()/.KeyRefCountAsync()(#2087 by @Avital-Fine)OBJECT ENCODINGwith.KeyEncoding()/.KeyEncodingAsync()(#2088 by @Avital-Fine)GEOSEARCHwith.GeoSearch()/.GeoSearchAsync()(#2089 by @slorello89)GEOSEARCHSTOREwith.GeoSearchAndStore()/.GeoSearchAndStoreAsync()(#2089 by @slorello89)HRANDFIELDwith.HashRandomField()/.HashRandomFieldAsync(),.HashRandomFields()/.HashRandomFieldsAsync(), and.HashRandomFieldsWithValues()/.HashRandomFieldsWithValuesAsync()(#2090 by @slorello89)LMPOPwith.ListLeftPop()/.ListLeftPopAsync()and.ListRightPop()/.ListRightPopAsync()(#2094 by @slorello89)ZMPOPwith.SortedSetPop()/.SortedSetPopAsync()(#2094 by @slorello89)XAUTOCLAIMwith.StreamAutoClaim()/.StreamAutoClaimAsync()and.StreamAutoClaimIdsOnly()/.StreamAutoClaimIdsOnlyAsync()(#2095 by @ttingen).StringSet()/.StringSetAsync()overloads for source compat broken for 1 case in 2.5.61 (#2098 by @NickCraver)XREADandXREADGROUPcommands (#2093 by @nielsderdaele)LCSwith.StringLongestCommonSubsequence()/.StringLongestCommonSubsequence(),.StringLongestCommonSubsequenceLength()/.StringLongestCommonSubsequenceLengthAsync(), and.StringLongestCommonSubsequenceWithMatches()/.StringLongestCommonSubsequenceWithMatchesAsync()(#2104 by @Avital-Fine)OBJECT FREQwith.KeyFrequency()/.KeyFrequencyAsync()(#2105 by @Avital-Fine)SORT_ROwith.Sort()/.SortAsync()(#2111 by @slorello89)BIT | BYTEtoBITCOUNTandBITPOSwith.StringBitCount()/.StringBitCountAsync()and.StringBitPosition()/.StringBitPositionAsync()(#2116 by @Avital-Fine)GT,LT, andCHonZADDwith.SortedSetAdd()/.SortedSetAddAsync()and.SortedSetUpdate()/.SortedSetUpdateAsync()(#2136 by @Avital-Fine)COMMAND COUNT,COMMAND GETKEYS, andCOMMAND LIST, with.CommandCount()/.CommandCountAsync(),.CommandGetKeys()/.CommandGetKeysAsync(), and.CommandList()/.CommandListAsync()(#2143 by @shacharPash)v2.5.61Compare Source
GETEXsupport with.StringGetSetExpiry()/.StringGetSetExpiryAsync()(#1743 by @benbryant0)SELECTcommands if explicitly disabled (#2023 by @NickCraver)KEEPTTLsupport onSEToperations (#2029 by @NickCraver)XTRIMMAXLENargument to be0(#2030 by @NicoAvanzDev)ConfigurationOptions.BeforeSocketConnectfor configuring sockets between creation and connection (#2031 by @NickCraver)ClientKill/ClientKillAsyncwhen usingClientType(#2048 by @NickCraver)ConfigurationOptionschanges afterConnectionMultiplexerconnections will now be respected, e.g. changing a timeout will work and changing a password for auth rotation would be used at the next reconnect (#2050 by @NickCraver)ConnectionMultiplexer.IncludeDetailInExceptionsandConnectionMultiplexer.IncludePerformanceCountersInExceptionstoConfigurationOptions. The old properties are[Obsolete]proxies that work until 3.0 for compatibility.ZRANGESTOREwith.SortedSetRangeAndStore()/.SortedSetRangeAndStoreAsync()(#2052 by @slorello89)v2.5.43Compare Source
ExponentialRetrybackoff policy (#1921 by @gliljas)DefaultOptionsProvidersupport for endpoint-based defaults configuration (#1987 by @NickCraver)SUBSCRIBEis disabled, give proper errors and connect faster (#2001 by @NickCraver)GETonSETcommand support (present in Redis 6.2+ - #2003 by @martinekvili)CLUSTERcommand is disabled (#2014 by @tylerohlsen)v2.2.88Compare Source
NodeMaintenanceScaleCompleteevent (handles Redis cluster scaling) (#1902 by @NickCraver)v2.2.79Compare Source
ConditionAPIs (transactions), now supportsStreamLengthEqualand variants (#1807 by @AlphaGremlin)ListLeftPop,ListLeftPopAsync,ListRightPop, andListRightPopAsync(#1850 by @jjfmarket)StringGetDelete/StringGetDeleteAsyncAPIs for RedisGETDELcommand(#1840 by @WeihanLi)v2.2.62Compare Source
GetOutstandingCountcould obscure underlying faults by faulting itself (#1792 by @mgravell)v2.2.50ReconfigureAsyncre-entrancy (caused connection issues) ([1772 by @NickCraver)ReconfigureAsyncSentinel race resulting in NoConnectionAvailable when using DemandMaster (#1773 by @NickCraver)Configuration
📅 Schedule: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR has been generated by Renovate Bot.