Release Notes (original) (raw)
StackExchange.Redis
Current package versions:
| NuGet Stable | NuGet Pre-release | MyGet |
|---|---|---|
2.10.1
- Support Redis 8.4 CAS/CAD operations (
DIGEST, and theIFEQ,IFNE,IFDEQ,IFDNEmodifiers onSET/DEL) via the newValueConditionabstraction, and use CAS/CAD operations forLock*APIs when possible (#2978 by mgravell)- note: overload resolution for
StringSet[Async]may be impacted in niche cases, requiring trivial build changes (there are no runtime-breaking changes such as missing methods)
- note: overload resolution for
- Support
XREADGROUP CLAIM(#2972 by mgravell) - Support
MSETEX(Redis 8.4.0) for multi-key operations with expiration (#2977 by mgravell)
2.9.32
- Fix
SSUBSCRIBErouting during slot migrations (#2969 by mgravell)
2.9.25
- (build) Fix SNK on non-Windows builds (#2963 by mgravell)
2.9.24
- Fix #2951 - sentinel reconnection failure (#2956 by mgravell)
- Mitigate #2955 (unbalanced pub/sub routing) / add
RedisValue.WithKeyRouting()(#2958 by mgravell) - Fix envoyproxy command exclusions (#2957 by sshumakov)
- Restrict
RedisValuehex fallback (stringconversion) to encoding failures (2954 by jcaspes) - (internals) prefer
Volatile.ReadoverThread.VolatileRead(2960 by mgravell)
2.9.17
- Add vector-set support (#2939 by mgravell)
- Fix
RedisValuespecial-value (NaN, Inf, etc) handling when casting from raw/string values todouble(#2950 by mgravell) - Internals:
- Use
sealedclasses where possible (#2942 by Henr1k80) - Add overlapped flushing in
LoggingTunneland avoid double-lookups (#2943 by Henr1k80)
- Use
2.9.11
- Add
HGETDEL,HGETEXandHSETEXsupport (#2863 by atakavci) - Fix key-prefix omission in
SetIntersectionLengthandSortedSet{Combine[WithScores]|IntersectionLength}(#2863 by mgravell) - Add
Condition.SortedSet[Not]ContainsStartingcondition for transactions (#2638 by ArnoKoll) - Add support for XPENDING Idle time filter (#2822 by david-brink-talogy)
- Improve
doubleformatting performance on net8+ (#2928 by mgravell) - Add
GetServer(RedisKey, ...)API (#2936 by mgravell) - Fix error constructing
StreamAddmessage (#2941 by mgravell)
2.8.58
- Fix #2679 - blocking call in long-running connects (#2680 by mgravell)
- Support async cancellation of
SCANenumeration (#2911 by mgravell) - Add
XTRIM MINIDsupport (#2842 by kijanawoodard) - Add new CE 8.2 stream support -
XDELEX,XACKDEL,{XADD|XTRIM} [KEEPREF|DELREF|ACKED](#2912 by mgravell) - Fix
ZREVRANGEBYLEXopen-ended commands (#2636 by ArnoKoll) - Fix
StreamGroupInfo.Lagwhennull(#2902 by robhop) - Internals
- Logging improvements (#2903 by Meir017 and #2917 by mgravell)
- Update tests to xUnit v3 (#2907 by NickCraver)
- Avoid
CLIENT PAUSEin CI tests (#2916 by mgravell)
2.8.47
- Add support for new
BITOPoperations in CE 8.2 (#2900 by atakavci) - Package updates (#2906 by mgravell)
- Docs: added guidance on async timeouts (#2910 by mgravell)
- Fix handshake error with
CLIENT ID(#2909 by mgravell)
2.8.41
- Add support for sharded pub/sub via
RedisChannel.Sharded- (#2887 by vandyvilla, atakavci and mgravell)
2.8.37
- Add
ConfigurationOptions.SetUserPemCertificate(...)andConfigurationOptions.SetUserPfxCertificate(...)methods to simplify using client certificates (#2873 by mgravell) - Add logging for when a Multiplexer reconfigures (#2864 by st-dev-gh)
- Fix: Move
AuthenticateAsClientto fully async after dropping older framework support, to help client thread starvation in cases TLS negotiation stalls server-side (#2878 by NickCraver)
2.8.31
- Fix: Respect
IReconnectRetryPolicytiming in the case that a node that was present disconnects indefinitely (#2853 & #2856 by NickCraver)- Special thanks to sampdei tracking this down and working a fix
- Changes max default retry policy backoff to 60 seconds (#2853 by NickCraver)
- Fix #2652: Track client-initiated shutdown for any pipe type (#2814 by bgrainger)
2.8.24
- Update Envoy command definitions to allow UNWATCH (#2824 by mgravell)
2.8.22
- Format IPv6 endpoints correctly when rewriting configration strings (#2813 by mgravell)
- Update default Redis version from
4.0.0to6.0.0for Azure Redis resources (#2810 by philon-msft) - Detect Azure Managed Redis caches and tune default connection settings for them (#2818 by philon-msft)
- Bump
Microsoft.Bcl.AsyncInterfacesdependency from5.0.0to6.0.0(#2820 by NickCraver)
2.8.16
- Fix: PhysicalBridge: Always perform “last read” check in heartbeat when
HeartbeatConsistencyChecksis enabled (#2795 by NickCraver)
2.8.14
- Fix #2793: Update Envoyproxy’s command map according to latest Envoy documentation (#2794 by dbarbosapn)
2.8.12
- Add support for hash field expiration (see #2715) (#2716 by atakavci)
- Add support for
HSCAN NOVALUES(see #2721) (#2722 by atakavci) - Fix #2763: Make ConnectionMultiplexer.Subscription thread-safe (#2769 by Chuck-EP)
- Fix #2778: Run
CheckInfoReplicationeven withHeartbeatConsistencyChecks(#2784 by NickCraver and leachdaniel-clark)
2.8.0
- Add high-integrity mode (docs, #2471 by mgravell)
- TLS certificate/
TrustIssuer: Check EKU in X509 chain checks when validating certificates (#2670 by NickCraver)
2.7.33
- Potentially Breaking: Fix
CheckTrustedIssuercertificate 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.TrustIssuerat all.
- 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
- Add new
LoggingTunnelAPI; see https://stackexchange.github.io/StackExchange.Redis/RespLogging (#2660 by mgravell) - Fix #2664: Move ProcessBacklog to fully sync to prevent thread pool hopping and blocking on awaits (#2667 by NickCraver)
2.7.27
- Support
HeartbeatConsistencyChecksandHeartbeatIntervalinClone()(#2658 by mgravell) - Add
AddLibraryNameSuffixto multiplexer; allows usage-specific tokens to be appended after connect (#2659 by mgravell)
2.7.23
- Fix #2653: Client library metadata should validate contents (#2654 by mgravell)
- Add
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)
2.7.20
2.7.17
- Fix #2321: Honor disposition of select command in Command Map for transactions (#2322 by slorello89)
- Fix #2619: Type-forward
IsExternalInitto support down-level TFMs (#2621 by mgravell) InternalsVisibleToPublicKeyenhancements(#2623 by WeihanLi)- Fix #2576: Prevent
NullReferenceExceptionduring shutdown of connections (#2629 by NickCraver)
2.7.10
- Fix #2593:
EXPIRETIMEandPEXPIRETIMEmiscategorized asPrimaryOnlycommands causing them to fail when issued against a read-only replica (#2593 by slorello89) - Fix #2591: Add
HELLOto 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)
2.7.4
- Adds: RESP3 support (#2396 by mgravell) - see https://stackexchange.github.io/StackExchange.Redis/Resp3
- Fix #2507: Pub/sub with multi-item payloads should be usable (#2508 by mgravell)
- Add: connection-id tracking (internal only, no public API) (#2508 by mgravell)
- Add:
ConfigurationOptions.LoggerFactoryfor logging to anILoggerFactory(e.g.ILogger) all connection and error events (#2051 by NickCraver) - Fix #2467: Add StreamGroupInfo EntriesRead and Lag (#2510 by tvdias)
2.6.122
- 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)
- Fix #2520: Improve cluster connections in down scenarios by not re-pinging successful nodes (#2525 by Matiszak)
- Add:
Timer.ActiveCountunderPOOLin timeout messages on .NET 6+ to help diagnose timer overload affecting timeout evaluations (#2500 by NickCraver) - Add:
LibraryNameconfiguration option; allows the library name to be controlled at the individual options level (in addition to the existing controls inDefaultOptionsProvider) (#2502 by mgravell) - Add:
DefaultOptionsProvider.GetProviderallows lookup of provider by endpoint (#2502 by mgravell)
2.6.116
- Fix #2479: Add
RedisChannel.UseImplicitAutoPattern(global) andRedisChannel.IsPattern(#2480 by mgravell) - Fix #2479: Mark
RedisChannelconversion operators as obsolete; addRedisChannel.LiteralandRedisChannel.Patternhelpers (#2481 by mgravell) - Fix #2449: Update
Pipelines.Sockets.Unofficialtov2.2.8to support native AOT (#2456 by eerhardt)
2.6.111
- Fix #2426: Don’t restrict multi-slot operations on Envoy proxy; let the proxy decide (#2428 by mgravell)
- Add: Support for
User/PasswordinDefaultOptionsProviderto support token rotation scenarios (#2445 by NickCraver) - Fix #2449: Resolve AOT trim warnings in
TryGetAzureRoleInstanceIdNoThrow(#2451 by eerhardt) - Adds: Support for
HTTP/1.1 200 Connection establishedin HTTP Tunnel (#2448 by flobernd) - Adds: Timeout duration to backlog timeout error messages (#2452 by NickCraver)
- Adds:
DefaultOptionsProvider.LibraryNamefor specifying lib-name passed toCLIENT SETINFOin Redis 7.2+ (#2453 by NickCraver)
2.6.104
- 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)
- Add: Better error messages (over generic timeout) when commands are backlogged and unable to write to any connection (#2408 by NickCraver)
- Fix #2392: Dequeue all timed out messages from the backlog when not connected (including Fire+Forget) (#2397 by kornelpal)
- Fix #2400: Expose
ChannelMessageQueueasIAsyncEnumerable<ChannelMessage>(#2402 by mgravell) - Add: Support for
CLIENT SETINFO(lib name/version) during handshake; opt-out is viaConfigurationOptions; also support read ofresp,lib-verandlib-nameviaCLIENT LIST(#2414 by mgravell) - Documentation: clarify the meaning of
RedisValue.IsIntegerre #2418 (#2420 by mgravell)
2.6.96
- Fix #2350: Properly parse lua script parameters in all cultures (#2351 by NickCraver)
- Fix #2362: Set
RedisConnectionException.FailureTypetoAuthenticationFailureon 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)
2.6.90
- Adds: Support for
EVAL_ROandEVALSHA_ROviaIDatabase.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
- Fix #1520 & #1660: When
MOVEDis encountered from a cluster, a reconfigure will happen proactively to react to cluster changes ASAP (#2286 by NickCraver) - Fix #2249: Properly handle a
failstate (newClusterNode.IsFailproperty) forCLUSTER NODESand exposefail?as a property (IsPossiblyFail) as well (#2288 by NickCraver) - Adds:
IConnectionMultiplexer.ServerMaintenanceEvent(was onConnectionMultiplexerbut not the interface) (#2306 by NickCraver) - Adds: To timeout messages, additional debug information:
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)
2.6.80
- Adds:
last-inandcur-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
- Fix:
MOVEDwithNoRedirect(and other non-reachable errors) should respect theIncludeDetailInExceptionssetting (#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
- 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:
IConnectionMultiplexernow implementsIAsyncDisposable(#2161 by kimsey0) - Adds:
IConnectionMultiplexer.GetServers()to get allIServerinstances 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 replicaerrors (#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
- 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.Preparefor scripts that don’t have parameters (#2166 by mgravell)
2.6.45
- 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
nullvs. 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
COPYwith.KeyCopy()/.KeyCopyAsync()(#2064 by Avital-Fine) - Adds: Support for
LMOVEwith.ListMove()/.ListMoveAsync()(#2065 by Avital-Fine) - Adds: Support for
ZRANDMEMBERwith.SortedSetRandomMember()/.SortedSetRandomMemberAsync(),.SortedSetRandomMembers()/.SortedSetRandomMembersAsync(), and.SortedSetRandomMembersWithScores()/.SortedSetRandomMembersWithScoresAsync()(#2076 by Avital-Fine) - Adds: Support for
SMISMEMBERwith.SetContains()/.SetContainsAsync()(#2077 by Avital-Fine) - Adds: Support for
ZDIFF,ZDIFFSTORE,ZINTER,ZINTERCARD, andZUNIONwith.SortedSetCombine()/.SortedSetCombineAsync(),.SortedSetCombineWithScores()/.SortedSetCombineWithScoresAsync(), and.SortedSetIntersectionLength()/.SortedSetIntersectionLengthAsync()(#2075 by Avital-Fine) - Adds: Support for
SINTERCARDwith.SetIntersectionLength()/.SetIntersectionLengthAsync()(#2078 by Avital-Fine) - Adds: Support for
LPOSwith.ListPosition()/.ListPositionAsync()and.ListPositions()/.ListPositionsAsync()(#2080 by slorello89) - Adds: Support for
ZMSCOREwith.SortedSetScores()/.SortedSetScoresAsync()(#2082 by ttingen) - Adds: Support for
NX | XX | GT | LTtoEXPIRE,EXPIREAT,PEXPIRE, andPEXPIREATwith.KeyExpire()/.KeyExpireAsync()(#2083 by Avital-Fine) - Adds: Support for
EXPIRETIME, andPEXPIRETIMEwith.KeyExpireTime()/.KeyExpireTimeAsync()(#2083 by Avital-Fine) - Fix: For streams, properly hash
XACK,XCLAIM, andXPENDINGin cluster scenarios to eliminateMOVEDretries (#2085 by nielsderdaele) - Adds: Support for
OBJECT REFCOUNTwith.KeyRefCount()/.KeyRefCountAsync()(#2087 by Avital-Fine) - Adds: Support for
OBJECT ENCODINGwith.KeyEncoding()/.KeyEncodingAsync()(#2088 by Avital-Fine) - Adds: Support for
GEOSEARCHwith.GeoSearch()/.GeoSearchAsync()(#2089 by slorello89) - Adds: Support for
GEOSEARCHSTOREwith.GeoSearchAndStore()/.GeoSearchAndStoreAsync()(#2089 by slorello89) - Adds: Support for
HRANDFIELDwith.HashRandomField()/.HashRandomFieldAsync(),.HashRandomFields()/.HashRandomFieldsAsync(), and.HashRandomFieldsWithValues()/.HashRandomFieldsWithValuesAsync()(#2090 by slorello89) - Adds: Support for
LMPOPwith.ListLeftPop()/.ListLeftPopAsync()and.ListRightPop()/.ListRightPopAsync()(#2094 by slorello89) - Adds: Support for
ZMPOPwith.SortedSetPop()/.SortedSetPopAsync()(#2094 by slorello89) - Adds: Support for
XAUTOCLAIMwith.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
XREADandXREADGROUPcommands (#2093 by nielsderdaele) - Adds: Support for
LCSwith.StringLongestCommonSubsequence()/.StringLongestCommonSubsequence(),.StringLongestCommonSubsequenceLength()/.StringLongestCommonSubsequenceLengthAsync(), and.StringLongestCommonSubsequenceWithMatches()/.StringLongestCommonSubsequenceWithMatchesAsync()(#2104 by Avital-Fine) - Adds: Support for
OBJECT FREQwith.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_ROwith.Sort()/.SortAsync()(#2111 by slorello89) - Adds: Support for
BIT | BYTEtoBITCOUNTandBITPOSwith.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, andCHonZADDwith.SortedSetAdd()/.SortedSetAddAsync()and.SortedSetUpdate()/.SortedSetUpdateAsync()(#2136 by Avital-Fine) - Adds: Support for
COMMAND COUNT,COMMAND GETKEYS, andCOMMAND LIST, with.CommandCount()/.CommandCountAsync(),.CommandGetKeys()/.CommandGetKeysAsync(), and.CommandList()/.CommandListAsync()(#2143 by shacharPash)
2.5.61
- Adds:
GETEXsupport with.StringGetSetExpiry()/.StringGetSetExpiryAsync()(#1743 by benbryant0) - Fix #1988: Don’t issue
SELECTcommands if explicitly disabled (#2023 by NickCraver) - Adds:
KEEPTTLsupport onSEToperations (#2029 by NickCraver) - Fix: Allow
XTRIMMAXLENargument to be0(#2030 by NicoAvanzDev) - Adds:
ConfigurationOptions.BeforeSocketConnectfor 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/ClientKillAsyncwhen usingClientType(#2048 by NickCraver) - Adds: Most
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)- Obsolete: This change also moves
ConnectionMultiplexer.IncludeDetailInExceptionsandConnectionMultiplexer.IncludePerformanceCountersInExceptionstoConfigurationOptions. The old properties are[Obsolete]proxies that work until 3.0 for compatibility.
- Obsolete: This change also moves
- Adds: Support for
ZRANGESTOREwith.SortedSetRangeAndStore()/.SortedSetRangeAndStoreAsync()(#2052 by slorello89)
2.5.43
- Adds: Bounds checking for
ExponentialRetrybackoff policy (#1921 by gliljas) - Adds:
DefaultOptionsProvidersupport for endpoint-based defaults configuration (#1987 by NickCraver) - Adds: Envoy proxy support (#1989 by rkarthick)
- Performance: When
SUBSCRIBEis disabled, give proper errors and connect faster (#2001 by NickCraver) - Adds:
GETonSETcommand support (present in Redis 6.2+ - #2003 by martinekvili) - Performance: Improves concurrent load performance when backlogs are utilized (#2008 by NickCraver)
- Stability: Improves cluster connections when
CLUSTERcommand is disabled (#2014 by tylerohlsen) - Logging: Improves connection logging and adds overall timing to it (#2019 by NickCraver)
2.5.27 (prerelease)
- Adds: a backlog/retry mechanism for commands issued while a connection isn’t available (#1912 by NickCraver)
- Commands will be queued if a multiplexer isn’t yet connected to a Redis server.
- Commands will be queued if a connection is lost and then sent to the server when the connection is restored.
- All commands queued will only remain in the backlog for the duration of the configured timeout.
- To revert to previous behavior, a new
ConfigurationOptions.BacklogPolicyis available - old behavior is configured viaoptions.BacklogPolicy = BacklogPolicy.FailFast. This backlogs nothing and fails commands immediately if no connection is available.
- Adds: Makes
StreamEntryconstructor public for better unit test experience (#1923 by WeihanLi) - Fix: Integer overflow error (issue #1926) with 2GiB+ result payloads (#1928 by mgravell)
- Change: Update assumed redis versions to v2.8 or v4.0 in the Azure case (#1929 by NickCraver)
- Fix: Profiler showing
EVALinsteadEVALSHA(#1930 by martinpotter) - Performance: Moved tiebreaker fetching in connections into the handshake phase (streamline + simplification) (#1931 by NickCraver)
- Stability: Fixed potential disposed object usage around Arenas (pulling in Piplines.Sockets.Unofficial#63 by MarcGravell)
- Adds: Thread pool work item stats to exception messages to help diagnose contention (#1964 by NickCraver)
- Fix/Performance: Overhauls pub/sub implementation for correctness (#1947 by NickCraver)
- Fixes a race in subscribing right after connected
- Fixes a race in subscribing immediately before a publish
- Fixes subscription routing on clusters (spreading instead of choosing 1 node)
- More correctly reconnects subscriptions on connection failures, including to other endpoints
- Adds “(vX.X.X)” version suffix to the default client ID so server-side
CLIENT LISTcan more easily see what’s connected (#1985 by NickCraver) - Fix: Properly including or excluding key names on some message failures (#1990 by NickCraver)
- Fix: Correct return of nil results in
LPOP,RPOP,SRANDMEMBER, andSPOP(#1993 by NickCraver)
2.2.88
- Change: Connection backoff default is now exponential instead of linear (#1896 by lolodi)
- Adds: Support for
NodeMaintenanceScaleCompleteevent (handles Redis cluster scaling) (#1902 by NickCraver)
2.2.79
- NRediSearch: Support on json index (#1808 by AvitalFineRedis)
- NRediSearch: Support sortable TagFields and unNormalizedForm for Tag & Text Fields (#1862 by slorello89 & AvitalFineRedis)
- Fix: Potential errors getting socket bytes (#1836 by NickCraver)
- Logging: Adds (.NET Version and timestamps) for better debugging (#1796 by philon-msft)
- Adds:
ConditionAPIs (transactions), now supportsStreamLengthEqualand variants (#1807 by AlphaGremlin) - Adds: Support for count argument to
ListLeftPop,ListLeftPopAsync,ListRightPop, andListRightPopAsync(#1850 by jjfmarket) - Fix: Potential task/thread exhaustion from the backlog processor (#1854 by mgravell)
- Adds: Support for listening to Azure Maintenance Events (#1876 by amsoedal)
- Adds:
StringGetDelete/StringGetDeleteAsyncAPIs for RedisGETDELcommand(#1840 by WeihanLi)
2.2.62
- Stability: Sentinel potential memory leak fix in OnManagedConnectionFailed handler (#1710 by alexSatov)
- Fix:
GetOutstandingCountcould obscure underlying faults by faulting itself (#1792 by mgravell) - Fix #1719: With backlog messages becoming reordered (#1779 by TimLovellSmith)
2.2.50
- Performance: Optimization for PING accuracy (#1714 by eduardobr)
- Fix: Improvement to reconnect logic (exponential backoff) (#1735 by deepakverma)
- Adds: Refresh replica endpoint list on failover (#1684 by laurauzcategui)
- Fix:
ReconfigureAsyncre-entrancy (caused connection issues) (#1772 by NickCraver) - Fix:
ReconfigureAsyncSentinel race resulting in NoConnectionAvailable when using DemandMaster (#1773 by NickCraver) - Stability: Resolve race in AUTH and other connection reconfigurations (#1759 by TimLovellSmith and NickCraver)
2.2.4
- Fix: Ambiguous signature of the new
RPUSHX/LPUSHXmethods (#1620 by stefanloerwald)
2.2.3
- Adds: .NET 5 target
- Fix: Mutex race condition (#1585 by arsnyder16)
- Adds:
CheckCertificateRevocationcan be controlled via the config string (#1591 by lwlwalker) - Fix: Range end-value inversion (#1573 by tombatron)
- Adds:
ROLEsupport (#1551 by zmj) - Adds: varadic
RPUSHX/LPUSHXsupport (#1557 by dmytrohridin) - Fix: Server-selection strategy race condition (#1532 by deepakverma)
- Fix: Sentinel default port (#1525 by ejsmith)
- Fix:
Int64parse scenario (#1568 by arsnyder16) - Add: Force replication check during failover (#1563 by aravindyeduvaka & joroda)
- Documentation tweaks (multiple)
- Fix: Backlog contention issue (#1612 by mgravell, see also #1574 by devbv)
2.1.58
- Fix:
[*]SCAN- fix possible NRE scenario if the iterator is disposed with an incomplete operation in flight - Fix:
[*]SCAN- treat the cursor as an opaque value whenever possible, for compatibility withredis-cluster-proxy - Adds:
[*]SCAN- include additional exception data in the case of faults
2.1.55
- Adds: Identification of assembly binding problem on .NET Framework. Drops
System.IO.Pipelinesto 4.7.1, and identifies newSystem.Buffersbinding failure on 4.7.2
2.1.50
- Adds: Bind directly to sentinel-managed instances from a configuration string/object (#1431 by ejsmith)
- Adds:
last-delivered-idtoStreamGroupInfo(#1477 by AndyPook) - Change: Update naming of replication-related commands to reflect Redis 5 naming (#1488 by mgravell & #945 by mgravell)
- Fix #1460:
IServercommands that are database-specific (DBSIZE,FLUSHDB,KEYS,SCAN) now respect the default database on the config (#1468 by mgravell) - Library updates
2.1.39
- Fix: Mutex around connection was not “fair”; in specific scenario could lead to out-of-order commands (#1440 by kennygea)
- Fix #1432: Update dependencies
- Fix: Timing error on linux (#1433 by pengweiqhca)
- Fix: Add
authto command-map for Sentinel (#1428 by ejsmith)
2.1.30
- Build: Fix deterministic builds (#1420 by @mgravell)
2.1.28
- Fix: Stability in new sentinel APIs
- Fix #1407: Include
SslProtocolosinConfigurationOptions.ToString()(#1408 by vksampath and Sampath Vuyyuru) - Fix: Clarify messaging around disconnected multiplexers (#1396 by NickCraver)
- Change: Tweak methods of new sentinel API (this is technically a breaking change, but since this is a new API that was pulled quickly, we consider this to be acceptable)
- Adds: New thread
SocketManagermode (opt-in) to always use the regular thread-pool instead of the dedicated pool - Adds: Improved counters in/around error messages
- Adds: New
Userproperty onConfigurationOptions - Build: Enable deterministic builds (note: this failed; fixed in 2.1.30)
2.1.0
- Fix: Ensure active-message is cleared (#1374 by hamish-omny)
- Adds: Sentinel support (#1067 by shadim, #692 by lexxdark)
- Adds:
IAsyncEnumerable<T>scanning APIs now supported (#1087 by mgravell) - Adds: New API for use with misbehaving sync-contexts (more info)
- Adds:
TOUCHsupport (#1291 by gkorland) - Adds:
ConditionAPI (transactions) now supportsSortedSetLengthEqual(#1332 by phosphene47) - Adds:
SocketManageris now more configurable (#1115 by naile) - Adds: NRediSearch updated in line with JRediSearch (#1267 by tombatron, #1199 by oruchreis)
- Adds: Support for
CheckCertificatRevocationconfiguration (#1234 by BLun78 and V912736) - Adds: More details about exceptions (#1190 by marafiq)
- Adds: Updated
StreamCreateConsumerGroupmethods to use theMKSTREAMoption (#1141 via ttingen) - Adds: Support for NOACK in the StreamReadGroup methods (#1154 by ttingen)
- Adds: Event-args now mockable (#1326 by n1l)
- Fix: No-op when adding 0 values to a set (#1283 by omeaart)
- Adds: Support for
LATENCYandMEMORY(#1204 by mgravell) - Adds: Support for
HSTRLEN(#1241 by eitanhs) - Adds:
GeoRadiusResultis now mockable (#1175 by firenero) - Fix: Various documentation fixes (#1162 by SnakyBeaky, #1135 by ttingen, #1203 by caveman-dick, #1240 by Excelan, #1245 by francoance, #1159 by odyth, #1311 by DillonAd, #1339 by vp89, #1336 by ERGeorgiev)
- Fix: Rare race-condition around exception data (#1342 by AdamOutcalt)
- Fix:
ScriptEvaluateAsynckeyspace isolation (#1377 by gliljas) - Fix: F# compatibility enhancements (#1386 by NickCraver)
- Fix: Improved
ScriptResultnull support (#1392 by mgravell) - Fix: Error with DNS resolution breaking endpoint iterator (#1393 by mgravell)
- Tests: Better docker support for tests (#1389 by ejsmith, #1391 by NickCraver)
- Tests: General test improvements (#1183 by mtreske, #1385 by NickCraver, #1384 by NickCraver)
2.0.601
- Adds: Tracking for current and next messages to help with debugging timeout issues - helpful in cases of large pipeline blockers
2.0.600
- Adds:
ulongsupport toRedisValueandRedisResult(#1104 by mgravell) - Fix: Remove odd equality:
"-" != 0(we do, however, still allow"-0", as that is at least semantically valid, and is logically== 0) (related to #1103) - Performance: Rework how pub/sub queues are stored - reduces delegate overheads (related to #1101)
- Fix #1108: Ensure that we don’t try appending log data to the
TextWriteronce we’ve returned from a method that accepted one
2.0.593
- Performance: Unify spin-wait usage on sync/async paths to one competitor
- Fix #1101: When a
ChannelMessageQueueis involved, unsubscribing via any route should still unsubscribe and mark the queue-writer as complete
2.0.588
- Stability/Performance: Resolve intermittent stall in the write-lock that could lead to unexpected timeouts even when at low/reasonable (but concurrent) load
2.0.571
- Performance: Use new arena allocation API to avoid
RawResult[]overhead - Performance: Massively simplified how
ResultBox<T>is implemented, in particular to reduceTaskCompletionSource<T>allocations - Performance: Fix sync-over-async issue with async call paths, and fix the SemaphoreSlim problems that this uncovered
- Performance: Reintroduce the unsent backlog queue, in particular to improve async performance
- Performance: Simplify how completions are reactivated, so that external callers use their originating pool, not the dedicated IO pools (prevent thread stealing)
- Fix: Update
Pipelines.Sockets.Unofficialto prevent issue with incorrect buffer re-use in corner-case - Fix:
KeyDeleteAsynccould, in some cases, always useDEL(instead ofUNLINK) - Fix: Last unanswered write time was incorrect
- Change: Use higher
Pipethresholds when sending
2.0.519
- Fix #1007: Adapt to late changes in the RC streams API (#983 by mgravell)
- Documentation fixes (#997 by MerelyRBLX, #1005 by zBrianW)
- Build: Switch to SDK 2.1.500
2.0.513
- Fix #961: fix assembly binding redirect problems; IMPORTANT: this drops to an older
System.Buffersversion - if you have manually added redirects for4.0.3.0, you may need to manually update to4.0.2.0(or remove completely) - Fix #962: Avoid NRE in edge-case when fetching bridge
2.0.505
- Fix #943: Ensure transaction inner tasks are completed prior to completing the outer transaction task
- Fix #946: Reinstate missing
TryParsemethods onRedisValue - Fix #940: Off-by-one on pre-boxed integer cache (NRediSearch)
2.0.495
2.0 is a large - and breaking - change. The key focus of this release is stability and reliability.
- Hard Break: The package identity has changed; instead of
StackExchange.Redis(not strong-named) andStackExchange.Redis.StrongName(strong-named), we are now only releasingStackExchange.Redis(strong-named). This is a binary breaking change that requires consumers to be re-compiled; it cannot be applied via binding-redirects - Hard Break: The platform targets have been rationalized - supported targets are .NETStandard 2.0 (and above), .NETFramework 4.6.1 (and above), and .NETFramework 4.7.2 (and above) (note - the last two are mainly due to assembly binding problems)
- Hard Break: The profiling API has been overhauled and simplified; full documentation is provided here
- Soft Break: The
PreserveAsyncOrderbehaviour of the pub/sub API has been deprecated; a new API has been provided for scenarios that require in-order pub/sub handling - theSubscribemethod has a new overload without a handler parameter which returns aChannelMessageQueue, which providesasyncordered access to messages) - Internal: The network architecture has moved to use
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 .NETStandard - Change: As a result of the
System.IO.Pipelineschange, the error-reporting on timeouts is now much simpler and clearer; the timeouts documentation has been updated - Removed: The
HighPriority(queue-jumping) flag is now deprecated - Internal: Most buffers internally now make use of pooled memory;
RedisValueno longer preemptively allocates buffers - Internal: Added new custom thread-pool for handling async continuations to avoid thread-pool starvation issues
- Internal: All IL generation has been removed; the library should now work on platforms that do not allow runtime-emit
- Adds: asynchronous operations now have full support for reporting timeouts
- Adds: new APIs now exist to work with pooled memory without allocations -
RedisValue.CreateFrom(MemoryStream)andoperatorsupport forMemory<byte>andReadOnlyMemory<byte>; andIDatabase.StringGetLease[Async](...),IDatabase.HashGetLease[Async](...),Lease<byte>.AsStream()) - Adds: “streams” support (thanks to ttingen for their contribution)
- Adds: Various missing commands / overloads have been added;
Execute[Async]for additional commands is now available onIServer - Fix: A lot of general bugs and issues have been resolved
- Break:
RedisValue.TryParsewas accidentally omitted in the overhaul; this has been rectified and will be available in the next build
A 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.
1.2.6
- Change:
cluster nodesoutput when using cluster-enabled target and 4.0+ (see redis #4186
1.2.5
- (Critical) Fix: “poll mode” was disabled in the build for
net45/net46- Impact: IO jams and lack of reader during high load
1.2.4
- Fix: Incorrect build configuration (#649 by jrlost)
1.2.3
- Fix: When using
redis-clusterwith multiple replicas, use round-robin when selecting replica (#610 by mgravell) - Adds: Can specify
NoScriptCacheflag when usingScriptEvaluateto bypass all cache features (always usesEVALinstead ofSCRIPT LOADandEVALSHA) (#617 by Funbit)
1.2.2 (preview)
- Break: .NET 4.0 support is not in this build, due to a build issue - looking into solutions
- Adds: Make performance-counter tracking opt-in (
IncludePerformanceCountersInExceptions) as it was causing problems (#587 by AlexanderKot) - Adds: Can now specifiy allowed SSL/TLS protocols (#603 by JonCole)
- Adds: Track message status in exceptions (#576 by deepakverma)
- Adds:
GetDatabase()optimization for DB 0 and low numbered databases:IDatabaseinstance is retained and recycled (as long as noasyncStateis provided) - Performance: Improved connection retry policy (#510 by deepakverma, #572 by deepakverma)
- Adds:
Execute/ExecuteAsyncAPI to support “modules”; more info - Fix: Timeout link fixed re /docs change (below)
- NRediSearch added as exploration into “modules”
- Other changes (not library related)
- Change: Refactor /docs for github pages
- Change: Improve release note tracking
- Build: Rework build process to use csproj
1.2.1
- Fix: Avoid overlapping per-endpoint heartbeats
1.2.0 (same as 1.2.0-alpha1)
- Adds: GEO commands (#489 by wjdavis5)
- Adds: ZADD support for new NX/XX switches (#520 by seniorquico)
- Adds: core-clr preview support improvements
1.1.608
- Fix: Bug with race condition in servers indexer (related: 1.1.606)
1.1.607
- Fix: Ensure socket-mode polling is enabled (.net)
1.1.606
- Fix: Bug with race condition in servers indexer
…and the rest
(We’re happy to take PRs for change history going back in time or any fixes here!)