Current package versions:
NuGet Stable | NuGet Pre-release | MyGet |
---|---|---|
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 ConfigurationOptions
IAsyncEnumerable<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 RedisValue
2.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 IServer
RedisValue.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!)