Current package versions:
NuGet Stable | NuGet Pre-release | MyGet |
---|---|---|
No pending unreleased changes.
- Update Envoy command definitions to allow
UNWATCH
(#2824 by mgravell)
- Format IPv6 endpoints correctly when rewriting configration strings (#2813 by mgravell)
- Update default Redis version from
4.0.0
to6.0.0
for 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.AsyncInterfaces
dependency from5.0.0
to6.0.0
(#2820 by NickCraver)
- Fix: PhysicalBridge: Always perform "last read" check in heartbeat when
HeartbeatConsistencyChecks
is enabled (#2795 by NickCraver)
- Fix #2793: Update Envoyproxy's command map according to latest Envoy documentation (#2794 by dbarbosapn)
- 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
CheckInfoReplication
even withHeartbeatConsistencyChecks
(#2784 by NickCraver and leachdaniel-clark)
- Add high-integrity mode (docs, #2471 by mgravell)
- TLS certificate/
TrustIssuer
: Check EKU in X509 chain checks when validating certificates (#2670 by NickCraver)
- 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.
- 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
LoggingTunnel
API; 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)
- Support
HeartbeatConsistencyChecks
andHeartbeatInterval
inClone()
(#2658 by mgravell) - Add
AddLibraryNameSuffix
to multiplexer; allows usage-specific tokens to be appended after connect (#2659 by mgravell)
- Fix #2653: Client library metadata should validate contents (#2654 by 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 by NickCraver)
- Fix #2321: Honor disposition of select command in Command Map for transactions (#2322 by slorello89)
- Fix #2619: Type-forward
IsExternalInit
to support down-level TFMs (#2621 by mgravell) InternalsVisibleTo
PublicKey
enhancements(#2623 by WeihanLi)- Fix #2576: Prevent
NullReferenceException
during shutdown of connections (#2629 by NickCraver)
- Fix #2593:
EXPIRETIME
andPEXPIRETIME
miscategorized asPrimaryOnly
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)
- 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.LoggerFactory
for logging to anILoggerFactory
(e.g.ILogger
) all connection and error events (#2051 by NickCraver) - Fix #2467: Add StreamGroupInfo EntriesRead and Lag (#2510 by tvdias)
- 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.ActiveCount
underPOOL
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 inDefaultOptionsProvider
) (#2502 by mgravell) - Add:
DefaultOptionsProvider.GetProvider
allows lookup of provider by endpoint (#2502 by mgravell)
- Fix #2479: Add
RedisChannel.UseImplicitAutoPattern
(global) andRedisChannel.IsPattern
(#2480 by mgravell) - Fix #2479: Mark
RedisChannel
conversion operators as obsolete; addRedisChannel.Literal
andRedisChannel.Pattern
helpers (#2481 by mgravell) - Fix #2449: Update
Pipelines.Sockets.Unofficial
tov2.2.8
to support native AOT (#2456 by eerhardt)
- Fix #2426: Don't restrict multi-slot operations on Envoy proxy; let the proxy decide (#2428 by mgravell)
- Add: Support for
User
/Password
inDefaultOptionsProvider
to 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 established
in HTTP Tunnel (#2448 by flobernd) - Adds: Timeout duration to backlog timeout error messages (#2452 by NickCraver)
- Adds:
DefaultOptionsProvider.LibraryName
for specifying lib-name passed toCLIENT SETINFO
in Redis 7.2+ (#2453 by NickCraver)
- 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
ChannelMessageQueue
asIAsyncEnumerable<ChannelMessage>
(#2402 by mgravell) - Add: Support for
CLIENT SETINFO
(lib name/version) during handshake; opt-out is viaConfigurationOptions
; also support read ofresp
,lib-ver
andlib-name
viaCLIENT LIST
(#2414 by mgravell) - Documentation: clarify the meaning of
RedisValue.IsInteger
re #2418 (#2420 by mgravell)
- Fix #2350: Properly parse lua script parameters in all cultures (#2351 by NickCraver)
- Fix #2362: Set
RedisConnectionException.FailureType
toAuthenticationFailure
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)
- Adds: Support for
EVAL_RO
andEVALSHA_RO
viaIDatabase.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)
- 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 (newClusterNode.IsFail
property) forCLUSTER NODES
and exposefail?
as a property (IsPossiblyFail
) as well (#2288 by NickCraver) - Adds:
IConnectionMultiplexer.ServerMaintenanceEvent
(was onConnectionMultiplexer
but 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)
- Adds:
last-in
andcur-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
withNoRedirect
(and other non-reachable errors) should respect theIncludeDetailInExceptions
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 implementsIAsyncDisposable
(#2161 by kimsey0) - Adds:
IConnectionMultiplexer.GetServers()
to get allIServer
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)
- 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)
- 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
, andZUNION
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
toEXPIRE
,EXPIREAT
,PEXPIRE
, andPEXPIREAT
with.KeyExpire()
/.KeyExpireAsync()
(#2083 by Avital-Fine) - Adds: Support for
EXPIRETIME
, andPEXPIRETIME
with.KeyExpireTime()
/.KeyExpireTimeAsync()
(#2083 by Avital-Fine) - Fix: For streams, properly hash
XACK
,XCLAIM
, andXPENDING
in cluster scenarios to eliminateMOVED
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
andXREADGROUP
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
toBITCOUNT
andBITPOS
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
, andCH
onZADD
with.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)
- 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 onSET
operations (#2029 by NickCraver) - Fix: Allow
XTRIM
MAXLEN
argument to be0
(#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 usingClientType
(#2048 by NickCraver) - Adds: Most
ConfigurationOptions
changes afterConnectionMultiplexer
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
andConnectionMultiplexer.IncludePerformanceCountersInExceptions
toConfigurationOptions
. The old properties are[Obsolete]
proxies that work until 3.0 for compatibility.
- Obsolete: This change also moves
- Adds: Support for
ZRANGESTORE
with.SortedSetRangeAndStore()
/.SortedSetRangeAndStoreAsync()
(#2052 by slorello89)
- Adds: Bounds checking for
ExponentialRetry
backoff policy (#1921 by gliljas) - Adds:
DefaultOptionsProvider
support for endpoint-based defaults configuration (#1987 by NickCraver) - Adds: Envoy proxy support (#1989 by rkarthick)
- Performance: When
SUBSCRIBE
is disabled, give proper errors and connect faster (#2001 by NickCraver) - Adds:
GET
onSET
command 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
CLUSTER
command is disabled (#2014 by tylerohlsen) - Logging: Improves connection logging and adds overall timing to it (#2019 by NickCraver)
- 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.BacklogPolicy
is available - old behavior is configured viaoptions.BacklogPolicy = BacklogPolicy.FailFast
. This backlogs nothing and fails commands immediately if no connection is available.
- Adds: Makes
StreamEntry
constructor 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
EVAL
insteadEVALSHA
(#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 LIST
can 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)
- Change: Connection backoff default is now exponential instead of linear (#1896 by lolodi)
- Adds: Support for
NodeMaintenanceScaleComplete
event (handles Redis cluster scaling) (#1902 by NickCraver)
- 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:
Condition
APIs (transactions), now supportsStreamLengthEqual
and 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
/StringGetDeleteAsync
APIs for RedisGETDEL
command(#1840 by WeihanLi)
- Stability: Sentinel potential memory leak fix in OnManagedConnectionFailed handler (#1710 by alexSatov)
- Fix:
GetOutstandingCount
could obscure underlying faults by faulting itself (#1792 by mgravell) - Fix #1719: With backlog messages becoming reordered (#1779 by TimLovellSmith)
- 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:
ReconfigureAsync
re-entrancy (caused connection issues) (#1772 by NickCraver) - Fix:
ReconfigureAsync
Sentinel race resulting in NoConnectionAvailable when using DemandMaster (#1773 by NickCraver) - Stability: Resolve race in AUTH and other connection reconfigurations (#1759 by TimLovellSmith and NickCraver)
- Fix: Ambiguous signature of the new
RPUSHX
/LPUSHX
methods (#1620 by stefanloerwald)
- Adds: .NET 5 target
- Fix: Mutex race condition (#1585 by arsnyder16)
- Adds:
CheckCertificateRevocation
can be controlled via the config string (#1591 by lwlwalker) - Fix: Range end-value inversion (#1573 by tombatron)
- Adds:
ROLE
support (#1551 by zmj) - Adds: varadic
RPUSHX
/LPUSHX
support (#1557 by dmytrohridin) - Fix: Server-selection strategy race condition (#1532 by deepakverma)
- Fix: Sentinel default port (#1525 by ejsmith)
- Fix:
Int64
parse 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)
- 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
- Adds: Identification of assembly binding problem on .NET Framework. Drops
System.IO.Pipelines
to 4.7.1, and identifies newSystem.Buffers
binding failure on 4.7.2
- Adds: Bind directly to sentinel-managed instances from a configuration string/object (#1431 by ejsmith)
- Adds:
last-delivered-id
toStreamGroupInfo
(#1477 by AndyPook) - Change: Update naming of replication-related commands to reflect Redis 5 naming (#1488 by mgravell & #945 by mgravell)
- Fix #1460:
IServer
commands that are database-specific (DBSIZE
,FLUSHDB
,KEYS
,SCAN
) now respect the default database on the config (#1468 by mgravell) - Library updates
- 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
auth
to command-map for Sentinel (#1428 by ejsmith)
- Build: Fix deterministic builds (#1420 by @mgravell)
- Fix: Stability in new sentinel APIs
- Fix #1407: Include
SslProtocolos
inConfigurationOptions.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
SocketManager
mode (opt-in) to always use the regular thread-pool instead of the dedicated pool - Adds: Improved counters in/around error messages
- Adds: New
User
property onConfigurationOptions
- Build: Enable deterministic builds (note: this failed; fixed in 2.1.30)
- 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:
TOUCH
support (#1291 by gkorland) - Adds:
Condition
API (transactions) now supportsSortedSetLengthEqual
(#1332 by phosphene47) - Adds:
SocketManager
is now more configurable (#1115 by naile) - Adds: NRediSearch updated in line with JRediSearch (#1267 by tombatron, #1199 by oruchreis)
- Adds: Support for
CheckCertificatRevocation
configuration (#1234 by BLun78 and V912736) - Adds: More details about exceptions (#1190 by marafiq)
- Adds: Updated
StreamCreateConsumerGroup
methods to use theMKSTREAM
option (#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
LATENCY
andMEMORY
(#1204 by mgravell) - Adds: Support for
HSTRLEN
(#1241 by eitanhs) - Adds:
GeoRadiusResult
is 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:
ScriptEvaluateAsync
keyspace isolation (#1377 by gliljas) - Fix: F# compatibility enhancements (#1386 by NickCraver)
- Fix: Improved
ScriptResult
null 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)
- Adds: Tracking for current and next messages to help with debugging timeout issues - helpful in cases of large pipeline blockers
- Adds:
ulong
support toRedisValue
andRedisResult
(#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
TextWriter
once we've returned from a method that accepted one
- Performance: Unify spin-wait usage on sync/async paths to one competitor
- Fix #1101: When a
ChannelMessageQueue
is involved, unsubscribing via any route should still unsubscribe and mark the queue-writer as complete
- Stability/Performance: Resolve intermittent stall in the write-lock that could lead to unexpected timeouts even when at low/reasonable (but concurrent) load
- 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.Unofficial
to prevent issue with incorrect buffer re-use in corner-case - Fix:
KeyDeleteAsync
could, in some cases, always useDEL
(instead ofUNLINK
) - Fix: Last unanswered write time was incorrect
- Change: Use higher
Pipe
thresholds when sending
- 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
- Fix #961: fix assembly binding redirect problems; IMPORTANT: this drops to an older
System.Buffers
version - 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
- Fix #943: Ensure transaction inner tasks are completed prior to completing the outer transaction task
- Fix #946: Reinstate missing
TryParse
methods onRedisValue
- Fix #940: Off-by-one on pre-boxed integer cache (NRediSearch)
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
PreserveAsyncOrder
behaviour of the pub/sub API has been deprecated; a new API has been provided for scenarios that require in-order pub/sub handling - theSubscribe
method has a new overload without a handler parameter which returns aChannelMessageQueue
, which providesasync
ordered 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.Pipelines
change, 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;
RedisValue
no 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)
andoperator
support 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.TryParse
was 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
.
- Change:
cluster nodes
output when using cluster-enabled target and 4.0+ (see redis #4186
- (Critical) Fix: "poll mode" was disabled in the build for
net45
/net46
- Impact: IO jams and lack of reader during high load
- Fix: Incorrect build configuration (#649 by jrlost)
- Fix: When using
redis-cluster
with multiple replicas, use round-robin when selecting replica (#610 by mgravell) - Adds: Can specify
NoScriptCache
flag when usingScriptEvaluate
to bypass all cache features (always usesEVAL
instead ofSCRIPT LOAD
andEVALSHA
) (#617 by Funbit)
- 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:IDatabase
instance is retained and recycled (as long as noasyncState
is provided) - Performance: Improved connection retry policy (#510 by deepakverma, #572 by deepakverma)
- Adds:
Execute
/ExecuteAsync
API 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
- Fix: Avoid overlapping per-endpoint heartbeats
- Adds: GEO commands (#489 by wjdavis5)
- Adds: ZADD support for new NX/XX switches (#520 by seniorquico)
- Adds: core-clr preview support improvements
- Fix: Bug with race condition in servers indexer (related: 1.1.606)
- Fix: Ensure socket-mode polling is enabled (.net)
- Fix: Bug with race condition in servers indexer
(We're happy to take PRs for change history going back in time or any fixes here!)