StackExchange.Redis Versions Save

General purpose redis client

2.6.104

1 year ago
  • 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)

New Contributors

Full Changelog: https://github.com/StackExchange/StackExchange.Redis/compare/2.6.96...2.6.104

2.6.96

1 year ago
  • Fix #2350: Properly parse lua script paramters in all cultures (#2351 by @NickCraver)
  • Fix #2362: Set RedisConnectionException.FailureType to AuthenticationFailure on all authentication scenarios for better handling (#2367 by @NickCraver)
  • Fix #2368: Support RedisValue.Length() for all storage types (#2370 by @mgravell)
  • Fix #2376: Avoid a (rare) deadlock scenario (#2378 by @mgravell)

Full Changelog: https://github.com/StackExchange/StackExchange.Redis/compare/2.6.90...2.6.96

2.6.90

1 year ago
  • Adds: Support for EVAL_RO and EVALSHA_RO via IDatabase.ScriptEvaluateReadOnly/IDatabase.ScriptEvaluateReadOnlyAsync (#2168 by @shacharPash)
  • Fix #1458: Fixes a leak condition when a connection completes on the TCP phase but not the Redis handshake (#2238 by @NickCraver)
  • Internal: ServerSnapshot: Improve API and allow filtering with custom struct enumerator (#2337 by @mgravell)

2.6.86

1 year ago
  • 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)

2.6.80

1 year ago
  • 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)

2.6.70

1 year ago
  • 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)

2.6.66

1 year ago
  • 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)
  • Fix #2240: Improve support for DNS-based IPv6 endpoints (#2241 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)
  • Fix #1879: Improve exception message when the wrong password is used (#2246 by @NickCraver)
  • Fix #2233: Repeated connection to Sentinel servers using the same ConfigurationOptions would fail (#2242 by @NickCraver)

2.6.48

1 year ago
  • URGENT Fix: #2167, #2176: fix error in batch/transaction handling that can result in out-of-order instructions (#2177 by @mgravell)
  • Fix: #2164: fix LuaScript.Prepare for scripts that don't have parameters (#2166 by @mgravell)

2.6.45

1 year ago
  • Adds: Nullable reference type annotations (#2041 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)
  • Fix #2086: Correct HashSlot calculations for XREAD and XREADGROUP commands (#2093 by @nielsderdaele)
  • 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)

2.5.61

1 year ago
  • Adds: GETEX support with .StringGetSetExpiry()/.StringGetSetExpiryAsync() (#1743 by @benbryant0)
  • Fix #1988: Don't issue SELECT commands if explicitly disabled (#2023 by @NickCraver)
  • Adds: KEEPTTL support on SET operations (#2029 by @NickCraver)
  • Fix: Allow XTRIM MAXLEN argument to be 0 (#2030 by @NicoAvanzDev)
  • Adds: ConfigurationOptions.BeforeSocketConnect for configuring sockets between creation and connection (#2031 by @NickCraver)
  • Fix #1813: Don't connect to endpoints we failed to parse (#2042 by @NickCraver)
  • 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)