General purpose redis client
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)Full Changelog: https://github.com/StackExchange/StackExchange.Redis/compare/2.6.96...2.6.104
RedisConnectionException.FailureType
to AuthenticationFailure
on all authentication scenarios for better handling (#2367 by @NickCraver)RedisValue.Length()
for all storage types (#2370 by @mgravell)Full Changelog: https://github.com/StackExchange/StackExchange.Redis/compare/2.6.90...2.6.96
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)