Current package versions:
| NuGet Stable | NuGet Pre-release | MyGet |
|---|---|---|
SSUBSCRIBE routing during slot migrations (#2969 by mgravell)RedisValue.WithKeyRouting() (#2958 by mgravell)RedisValue hex fallback (string conversion) to encoding failures (2954 by jcaspes)Volatile.Read over Thread.VolatileRead (2960 by mgravell)RedisValue special-value (NaN, Inf, etc) handling when casting from raw/string values to double (#2950 by mgravell)sealed classes where possible (#2942 by Henr1k80)LoggingTunnel and avoid double-lookups (#2943 by Henr1k80)HGETDEL, HGETEX and HSETEX support (#2863 by atakavci)SetIntersectionLength and SortedSet{Combine[WithScores]|IntersectionLength} (#2863 by mgravell)Condition.SortedSet[Not]ContainsStarting condition for transactions (#2638 by ArnoKoll)double formatting performance on net8+ (#2928 by mgravell)GetServer(RedisKey, ...) API (#2936 by mgravell)StreamAdd message (#2941 by mgravell)SCAN enumeration (#2911 by mgravell)XTRIM MINID support (#2842 by kijanawoodard)XDELEX, XACKDEL, {XADD|XTRIM} [KEEPREF|DELREF|ACKED] (#2912 by mgravell)ZREVRANGEBYLEX open-ended commands (#2636 by ArnoKoll)StreamGroupInfo.Lag when null (#2902 by robhop)CLIENT PAUSE in CI tests (#2916 by mgravell)BITOP operations in CE 8.2 (#2900 by atakavci)CLIENT ID (#2909 by mgravell)RedisChannel.Sharded - (#2887 by vandyvilla, atakavci and mgravell)ConfigurationOptions.SetUserPemCertificate(...) and ConfigurationOptions.SetUserPfxCertificate(...) methods to simplify using client certificates (#2873 by mgravell)AuthenticateAsClient to fully async after dropping older framework support, to help client thread starvation in cases TLS negotiation stalls server-side (#2878 by NickCraver)IReconnectRetryPolicy timing in the case that a node that was present disconnects indefinitely (#2853 & #2856 by NickCraver)
UNWATCH (#2824 by mgravell)4.0.0 to 6.0.0 for Azure Redis resources (#2810 by philon-msft)Microsoft.Bcl.AsyncInterfaces dependency from 5.0.0 to 6.0.0 (#2820 by NickCraver)HeartbeatConsistencyChecks is enabled (#2795 by NickCraver)HSCAN NOVALUES (see #2721) (#2722 by atakavci)CheckInfoReplication even with HeartbeatConsistencyChecks (#2784 by NickCraver and leachdaniel-clark)TrustIssuer: Check EKU in X509 chain checks when validating certificates (#2670 by NickCraver)CheckTrustedIssuer certificate validation for broken chain scenarios (#2665 by NickCraver)
ConfigurationOptions.TrustIssuer at all.LoggingTunnel API; see https://stackexchange.github.io/StackExchange.Redis/RespLogging (#2660 by mgravell)HeartbeatConsistencyChecks and HeartbeatInterval in Clone() (#2658 by mgravell)AddLibraryNameSuffix to multiplexer; allows usage-specific tokens to be appended after connect (#2659 by mgravell)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)IsExternalInit to support down-level TFMs (#2621 by mgravell)InternalsVisibleTo PublicKey enhancements(#2623 by WeihanLi)NullReferenceException during shutdown of connections (#2629 by NickCraver)EXPIRETIME and PEXPIRETIME miscategorized as PrimaryOnly commands causing them to fail when issued against a read-only replica (#2593 by slorello89)HELLO to Sentinel connections so they can support RESP3 (#2601 by NickCraver)ConfigurationOptions.LoggerFactory for logging to an ILoggerFactory (e.g. ILogger) all connection and error events (#2051 by NickCraver)Timer.ActiveCount under POOL in timeout messages on .NET 6+ to help diagnose timer overload affecting timeout evaluations (#2500 by NickCraver)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)DefaultOptionsProvider.GetProvider allows lookup of provider by endpoint (#2502 by mgravell)RedisChannel.UseImplicitAutoPattern (global) and RedisChannel.IsPattern (#2480 by mgravell)RedisChannel conversion operators as obsolete; add RedisChannel.Literal and RedisChannel.Pattern helpers (#2481 by mgravell)Pipelines.Sockets.Unofficial to v2.2.8 to support native AOT (#2456 by eerhardt)User/Password in DefaultOptionsProvider to support token rotation scenarios (#2445 by NickCraver)TryGetAzureRoleInstanceIdNoThrow (#2451 by eerhardt)HTTP/1.1 200 Connection established in HTTP Tunnel (#2448 by flobernd)DefaultOptionsProvider.LibraryName for specifying lib-name passed to CLIENT SETINFO in Redis 7.2+ (#2453 by NickCraver)ChannelMessageQueue as IAsyncEnumerable<ChannelMessage> (#2402 by mgravell)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)RedisValue.IsInteger re #2418 (#2420 by mgravell)RedisConnectionException.FailureType to AuthenticationFailure on all authentication scenarios for better handling (#2367 by NickCraver)RedisValue.Length() for all storage types (#2370 by mgravell)EVAL_RO and EVALSHA_RO via IDatabase.ScriptEvaluateReadOnly/IDatabase.ScriptEvaluateReadOnlyAsync (#2168 by shacharPash)MOVED is encountered from a cluster, a reconfigure will happen proactively to react to cluster changes ASAP (#2286 by NickCraver)fail state (new ClusterNode.IsFail property) for CLUSTER NODES and expose fail? as a property (IsPossiblyFail) as well (#2288 by NickCraver)IConnectionMultiplexer.ServerMaintenanceEvent (was on ConnectionMultiplexer but not the interface) (#2306 by NickCraver)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)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)System.Diagnostics.PerformanceCounter) (#2285 by NickCraver)MOVED with NoRedirect (and other non-reachable errors) should respect the IncludeDetailInExceptions setting (#2267 by mgravell)IConnectionMultiplexer now implements IAsyncDisposable (#2161 by kimsey0)IConnectionMultiplexer.GetServers() to get all IServer instances for a multiplexer (#2203 by NickCraver)Command cannot be issued to a replica errors (#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)LuaScript.Prepare for scripts that don’t have parameters (#2166 by mgravell)null vs. empty array returns (preferring an not-null empty array in those edge cases)COPY with .KeyCopy()/.KeyCopyAsync() (#2064 by Avital-Fine)LMOVE with .ListMove()/.ListMoveAsync() (#2065 by Avital-Fine)ZRANDMEMBER with .SortedSetRandomMember()/.SortedSetRandomMemberAsync(), .SortedSetRandomMembers()/.SortedSetRandomMembersAsync(), and .SortedSetRandomMembersWithScores()/.SortedSetRandomMembersWithScoresAsync() (#2076 by Avital-Fine)SMISMEMBER with .SetContains()/.SetContainsAsync() (#2077 by Avital-Fine)ZDIFF, ZDIFFSTORE, ZINTER, ZINTERCARD, and ZUNION with .SortedSetCombine()/.SortedSetCombineAsync(), .SortedSetCombineWithScores()/.SortedSetCombineWithScoresAsync(), and .SortedSetIntersectionLength()/.SortedSetIntersectionLengthAsync() (#2075 by Avital-Fine)SINTERCARD with .SetIntersectionLength()/.SetIntersectionLengthAsync() (#2078 by Avital-Fine)LPOS with .ListPosition()/.ListPositionAsync() and .ListPositions()/.ListPositionsAsync() (#2080 by slorello89)ZMSCORE with .SortedSetScores()/.SortedSetScoresAsync() (#2082 by ttingen)NX | XX | GT | LT to EXPIRE, EXPIREAT, PEXPIRE, and PEXPIREAT with .KeyExpire()/.KeyExpireAsync() (#2083 by Avital-Fine)EXPIRETIME, and PEXPIRETIME with .KeyExpireTime()/.KeyExpireTimeAsync() (#2083 by Avital-Fine)XACK, XCLAIM, and XPENDING in cluster scenarios to eliminate MOVED retries (#2085 by nielsderdaele)OBJECT REFCOUNT with .KeyRefCount()/.KeyRefCountAsync() (#2087 by Avital-Fine)OBJECT ENCODING with .KeyEncoding()/.KeyEncodingAsync() (#2088 by Avital-Fine)GEOSEARCH with .GeoSearch()/.GeoSearchAsync() (#2089 by slorello89)GEOSEARCHSTORE with .GeoSearchAndStore()/.GeoSearchAndStoreAsync() (#2089 by slorello89)HRANDFIELD with .HashRandomField()/.HashRandomFieldAsync(), .HashRandomFields()/.HashRandomFieldsAsync(), and .HashRandomFieldsWithValues()/.HashRandomFieldsWithValuesAsync() (#2090 by slorello89)LMPOP with .ListLeftPop()/.ListLeftPopAsync() and .ListRightPop()/.ListRightPopAsync() (#2094 by slorello89)ZMPOP with .SortedSetPop()/.SortedSetPopAsync() (#2094 by slorello89)XAUTOCLAIM with .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)XREAD and XREADGROUP commands (#2093 by nielsderdaele)LCS with .StringLongestCommonSubsequence()/.StringLongestCommonSubsequence(), .StringLongestCommonSubsequenceLength()/.StringLongestCommonSubsequenceLengthAsync(), and .StringLongestCommonSubsequenceWithMatches()/.StringLongestCommonSubsequenceWithMatchesAsync() (#2104 by Avital-Fine)OBJECT FREQ with .KeyFrequency()/.KeyFrequencyAsync() (#2105 by Avital-Fine)SORT_RO with .Sort()/.SortAsync() (#2111 by slorello89)BIT | BYTE to BITCOUNT and BITPOS with .StringBitCount()/.StringBitCountAsync() and .StringBitPosition()/.StringBitPositionAsync() (#2116 by Avital-Fine)GT, LT, and CH on ZADD with .SortedSetAdd()/.SortedSetAddAsync() and .SortedSetUpdate()/.SortedSetUpdateAsync() (#2136 by Avital-Fine)COMMAND COUNT, COMMAND GETKEYS, and COMMAND LIST, with .CommandCount()/.CommandCountAsync(), .CommandGetKeys()/.CommandGetKeysAsync(), and .CommandList()/.CommandListAsync() (#2143 by shacharPash)GETEX support with .StringGetSetExpiry()/.StringGetSetExpiryAsync() (#1743 by benbryant0)SELECT commands if explicitly disabled (#2023 by NickCraver)KEEPTTL support on SET operations (#2029 by NickCraver)XTRIM MAXLEN argument to be 0 (#2030 by NicoAvanzDev)ConfigurationOptions.BeforeSocketConnect for configuring sockets between creation and connection (#2031 by NickCraver)ClientKill/ClientKillAsync when using ClientType (#2048 by NickCraver)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)
ConnectionMultiplexer.IncludeDetailInExceptions and ConnectionMultiplexer.IncludePerformanceCountersInExceptions to ConfigurationOptions. The old properties are [Obsolete] proxies that work until 3.0 for compatibility.ZRANGESTORE with .SortedSetRangeAndStore()/.SortedSetRangeAndStoreAsync() (#2052 by slorello89)ExponentialRetry backoff policy (#1921 by gliljas)DefaultOptionsProvider support for endpoint-based defaults configuration (#1987 by NickCraver)SUBSCRIBE is disabled, give proper errors and connect faster (#2001 by NickCraver)GET on SET command support (present in Redis 6.2+ - #2003 by martinekvili)CLUSTER command is disabled (#2014 by tylerohlsen)ConfigurationOptions.BacklogPolicy is available - old behavior is configured via options.BacklogPolicy = BacklogPolicy.FailFast. This backlogs nothing and fails commands immediately if no connection is available.StreamEntry constructor public for better unit test experience (#1923 by WeihanLi)EVAL instead EVALSHA (#1930 by martinpotter)CLIENT LIST can more easily see what’s connected (#1985 by NickCraver)LPOP, RPOP, SRANDMEMBER, and SPOP (#1993 by NickCraver)NodeMaintenanceScaleComplete event (handles Redis cluster scaling) (#1902 by NickCraver)Condition APIs (transactions), now supports StreamLengthEqual and variants (#1807 by AlphaGremlin)ListLeftPop, ListLeftPopAsync, ListRightPop, and ListRightPopAsync (#1850 by jjfmarket)StringGetDelete/StringGetDeleteAsync APIs for Redis GETDEL command(#1840 by WeihanLi)GetOutstandingCount could obscure underlying faults by faulting itself (#1792 by mgravell)ReconfigureAsync re-entrancy (caused connection issues) (#1772 by NickCraver)ReconfigureAsync Sentinel race resulting in NoConnectionAvailable when using DemandMaster (#1773 by NickCraver)RPUSHX/LPUSHX methods (#1620 by stefanloerwald)CheckCertificateRevocation can be controlled via the config string (#1591 by lwlwalker)ROLE support (#1551 by zmj)RPUSHX/LPUSHX support (#1557 by dmytrohridin)Int64 parse scenario (#1568 by arsnyder16)[*]SCAN - fix possible NRE scenario if the iterator is disposed with an incomplete operation in flight[*]SCAN - treat the cursor as an opaque value whenever possible, for compatibility with redis-cluster-proxy[*]SCAN - include additional exception data in the case of faultsSystem.IO.Pipelines to 4.7.1, and identifies new System.Buffers binding failure on 4.7.2last-delivered-id to StreamGroupInfo (#1477 by AndyPook)IServer commands that are database-specific (DBSIZE, FLUSHDB, KEYS, SCAN) now respect the default database on the config (#1468 by mgravell)auth to command-map for Sentinel (#1428 by ejsmith)SslProtocolos in ConfigurationOptions.ToString() (#1408 by vksampath and Sampath Vuyyuru)SocketManager mode (opt-in) to always use the regular thread-pool instead of the dedicated poolUser property on ConfigurationOptionsIAsyncEnumerable<T> scanning APIs now supported (#1087 by mgravell)TOUCH support (#1291 by gkorland)Condition API (transactions) now supports SortedSetLengthEqual (#1332 by phosphene47)SocketManager is now more configurable (#1115 by naile)CheckCertificatRevocation configuration (#1234 by BLun78 and V912736)StreamCreateConsumerGroup methods to use the MKSTREAM option (#1141 via ttingen)LATENCY and MEMORY (#1204 by mgravell)HSTRLEN (#1241 by eitanhs)GeoRadiusResult is now mockable (#1175 by firenero)ScriptEvaluateAsync keyspace isolation (#1377 by gliljas)ScriptResult null support (#1392 by mgravell)ulong support to RedisValue and RedisResult (#1104 by mgravell)"-" != 0 (we do, however, still allow "-0", as that is at least semantically valid, and is logically == 0) (related to #1103)TextWriter once we’ve returned from a method that accepted oneChannelMessageQueue is involved, unsubscribing via any route should still unsubscribe and mark the queue-writer as completeRawResult[] overheadResultBox<T> is implemented, in particular to reduce TaskCompletionSource<T> allocationsPipelines.Sockets.Unofficial to prevent issue with incorrect buffer re-use in corner-caseKeyDeleteAsync could, in some cases, always use DEL (instead of UNLINK)Pipe thresholds when sendingSystem.Buffers version - if you have manually added redirects for 4.0.3.0, you may need to manually update to 4.0.2.0 (or remove completely)TryParse methods on RedisValue2.0 is a large - and breaking - change. The key focus of this release is stability and reliability.
StackExchange.Redis (not strong-named) and StackExchange.Redis.StrongName (strong-named), we are now
only releasing StackExchange.Redis (strong-named). This is a binary breaking change that requires consumers to be re-compiled; it cannot be applied via binding-redirectsPreserveAsyncOrder behaviour of the pub/sub API has been deprecated; a new API has been provided for scenarios that require in-order pub/sub handling -
the Subscribe method has a new overload without a handler parameter which returns a ChannelMessageQueue, which provides async ordered access to messages)System.IO.Pipelines; this has allowed us to simplify and unify a lot of the network code, and in particular fix a lot of problems relating to how the library worked with TLS and/or .NETStandardSystem.IO.Pipelines change, the error-reporting on timeouts is now much simpler and clearer; the timeouts documentation has been updatedHighPriority (queue-jumping) flag is now deprecatedRedisValue no longer preemptively allocates buffersRedisValue.CreateFrom(MemoryStream) and operator support for Memory<byte> and ReadOnlyMemory<byte>; and IDatabase.StringGetLease[Async](...), IDatabase.HashGetLease[Async](...), Lease<byte>.AsStream())Execute[Async] for additional commands is now available on IServerRedisValue.TryParse was accidentally omitted in the overhaul; this has been rectified and will be available in the next buildA more complete list of issues addressed can be seen in this tracking issue
Note: we currently have no plans to do an additional 1.* release. In particular, even though there was a 1.2.7-alpha build on nuget, we do not currently have plans to release 1.2.7.
cluster nodes output when using cluster-enabled target and 4.0+ (see redis #4186net45/net46 - Impact: IO jams and lack of reader during high loadredis-cluster with multiple replicas, use round-robin when selecting replica (#610 by mgravell)NoScriptCache flag when using ScriptEvaluate to bypass all cache features (always uses EVAL instead of SCRIPT LOAD and EVALSHA) (#617 by Funbit)IncludePerformanceCountersInExceptions) as it was causing problems (#587 by AlexanderKot)GetDatabase() optimization for DB 0 and low numbered databases: IDatabase instance is retained and recycled (as long as no asyncState is provided)Execute/ExecuteAsync API to support “modules”; more infoNRediSearch added as exploration into “modules”(We’re happy to take PRs for change history going back in time or any fixes here!)