Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<CodeAnalysisRuleset>$(MSBuildThisFileDirectory)Shared.ruleset</CodeAnalysisRuleset>
<MSBuildWarningsAsMessages>NETSDK1069</MSBuildWarningsAsMessages>
<NoWarn>$(NoWarn);NU5105;NU1507;SER001;SER002;SER003;SER004;SER005;SER006</NoWarn>
<!-- SER002/SER003/SER006 retired (Redis 8.4/8.6/8.8 features no longer experimental); IDs reserved, see Experiments.cs -->
<NoWarn>$(NoWarn);NU5105;NU1507;SER001;SER004;SER005</NoWarn>
<PackageReleaseNotes>https://stackexchange.github.io/StackExchange.Redis/ReleaseNotes</PackageReleaseNotes>
<PackageProjectUrl>https://stackexchange.github.io/StackExchange.Redis/</PackageProjectUrl>
<PackageLicenseExpression>MIT</PackageLicenseExpression>
Expand Down
10 changes: 7 additions & 3 deletions src/RESPite/Shared/Experiments.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,16 @@ internal static class Experiments
// note: {0} is substituted with the DiagnosticId by the analyzer, e.g. .../exp/SER002
public const string UrlFormat = "https://stackexchange.github.io/StackExchange.Redis/exp/{0}";

// Retired experiments: these server features are now stable and no longer gated.
// The DiagnosticIds remain reserved (do NOT reuse them) so old callers' suppressions
// and the /docs/exp pages stay meaningful:
// SER002 = Server_8_4 (Redis 8.4 features)
// SER003 = Server_8_6 (Redis 8.6 features)
// SER006 = Server_8_8 (Redis 8.8 features)

// ReSharper disable InconsistentNaming
public const string Server_8_4 = "SER002";
public const string Server_8_6 = "SER003";
public const string Respite = "SER004";
public const string UnitTesting = "SER005";
public const string Server_8_8 = "SER006";

// ReSharper restore InconsistentNaming

Expand Down
1 change: 0 additions & 1 deletion src/StackExchange.Redis/APITypes/RedisArrayEntry.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ namespace StackExchange.Redis;
/// </summary>
/// <param name="index">The array index.</param>
/// <param name="value">The value at this index.</param>
[Experimental(Experiments.Server_8_8, UrlFormat = Experiments.UrlFormat)]
public readonly struct RedisArrayEntry(RedisArrayIndex index, RedisValue value) : IEquatable<RedisArrayEntry>
{
private readonly RedisArrayIndex _index = index;
Expand Down
1 change: 0 additions & 1 deletion src/StackExchange.Redis/APITypes/RedisArrayIndex.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ namespace StackExchange.Redis;
/// but wrapped for convenience from languages that do not work well with unsigned values.
/// </summary>
/// <param name="value">The array index.</param>
[Experimental(Experiments.Server_8_8, UrlFormat = Experiments.UrlFormat)]
[method: CLSCompliant(false)]
public readonly struct RedisArrayIndex(ulong value) : IEquatable<RedisArrayIndex>
{
Expand Down
1 change: 0 additions & 1 deletion src/StackExchange.Redis/APITypes/RedisArrayRange.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ namespace StackExchange.Redis;
/// </summary>
/// <param name="start">The start index.</param>
/// <param name="end">The end index.</param>
[Experimental(Experiments.Server_8_8, UrlFormat = Experiments.UrlFormat)]
public readonly struct RedisArrayRange(RedisArrayIndex start, RedisArrayIndex end) : IEquatable<RedisArrayRange>
{
private readonly RedisArrayIndex _start = start;
Expand Down
6 changes: 0 additions & 6 deletions src/StackExchange.Redis/APITypes/StreamInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,6 @@ internal StreamInfo(
/// </summary>
public long IdmpDuration
{
[Experimental(Experiments.Server_8_6, UrlFormat = Experiments.UrlFormat)]
get;
}

Expand All @@ -114,7 +113,6 @@ public long IdmpDuration
/// </summary>
public long IdmpMaxSize
{
[Experimental(Experiments.Server_8_6, UrlFormat = Experiments.UrlFormat)]
get;
}

Expand All @@ -123,7 +121,6 @@ public long IdmpMaxSize
/// </summary>
public long PidsTracked
{
[Experimental(Experiments.Server_8_6, UrlFormat = Experiments.UrlFormat)]
get;
}

Expand All @@ -133,7 +130,6 @@ public long PidsTracked
/// </summary>
public long IidsTracked
{
[Experimental(Experiments.Server_8_6, UrlFormat = Experiments.UrlFormat)]
get;
}

Expand All @@ -143,7 +139,6 @@ public long IidsTracked
/// </summary>
public long IidsAdded
{
[Experimental(Experiments.Server_8_6, UrlFormat = Experiments.UrlFormat)]
get;
}

Expand All @@ -153,7 +148,6 @@ public long IidsAdded
/// </summary>
public long IidsDuplicates
{
[Experimental(Experiments.Server_8_6, UrlFormat = Experiments.UrlFormat)]
get;
}
}
2 changes: 0 additions & 2 deletions src/StackExchange.Redis/ArrayGrepRequest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ namespace StackExchange.Redis;
/// <summary>
/// Describes an array grep operation.
/// </summary>
[Experimental(Experiments.Server_8_8, UrlFormat = Experiments.UrlFormat)]
public class ArrayGrepRequest
{
[Flags]
Expand Down Expand Up @@ -249,7 +248,6 @@ internal Message CreateMessage(int db, RedisKey key, CommandFlags flags)
/// <summary>
/// Describes a predicate used by an array grep operation.
/// </summary>
[Experimental(Experiments.Server_8_8, UrlFormat = Experiments.UrlFormat)]
public abstract class Predicate
{
internal virtual int ArgCount => 2;
Expand Down
1 change: 0 additions & 1 deletion src/StackExchange.Redis/ArrayInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ namespace StackExchange.Redis;
/// <summary>
/// Contains metadata information about an array returned by the ARINFO command.
/// </summary>
[Experimental(Experiments.Server_8_8, UrlFormat = Experiments.UrlFormat)]
public readonly struct ArrayInfo
{
private readonly Dictionary<string, RedisValue>? otherValues;
Expand Down
1 change: 0 additions & 1 deletion src/StackExchange.Redis/Enums/Aggregate.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ public enum Aggregate
/// <summary>
/// The number of combined element scores is used.
/// </summary>
[Experimental(Experiments.Server_8_8, UrlFormat = Experiments.UrlFormat)]
Count,
}
}
1 change: 0 additions & 1 deletion src/StackExchange.Redis/Enums/ArrayOperation.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ namespace StackExchange.Redis;
/// <summary>
/// Describes an array aggregation operation.
/// </summary>
[Experimental(Experiments.Server_8_8, UrlFormat = Experiments.UrlFormat)]
public enum ArrayOperation
{
/// <summary>
Expand Down
1 change: 0 additions & 1 deletion src/StackExchange.Redis/Enums/IncrementOptions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ namespace StackExchange.Redis;
/// <summary>
/// Describes options for increment operations.
/// </summary>
[Experimental(Experiments.Server_8_8, UrlFormat = Experiments.UrlFormat)]
[Flags]
public enum IncrementOptions
{
Expand Down
1 change: 0 additions & 1 deletion src/StackExchange.Redis/Enums/RedisType.cs
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,6 @@ public enum RedisType
/// <summary>
/// Redis Arrays are sparse arrays of arbitrary values with a notional write head.
/// </summary>
[Experimental(Experiments.Server_8_8, UrlFormat = Experiments.UrlFormat)]
[AsciiHash("array")]
Array,
}
Expand Down
1 change: 0 additions & 1 deletion src/StackExchange.Redis/Enums/StreamNackMode.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ namespace StackExchange.Redis;
/// <summary>
/// Determines how a stream message is negatively acknowledged back to the consumer group.
/// </summary>
[Experimental(Experiments.Server_8_8, UrlFormat = Experiments.UrlFormat)]
public enum StreamNackMode
{
/// <summary>
Expand Down
10 changes: 0 additions & 10 deletions src/StackExchange.Redis/HotKeys.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ public partial interface IServer
/// <param name="sampleRatio">Profiling frequency; effectively: measure every Nth command.</param>
/// <param name="slots">The key-slots to record during this capture (defaults to "all").</param>
/// <param name="flags">The command flags to use.</param>
[Experimental(Experiments.Server_8_6, UrlFormat = Experiments.UrlFormat)]
void HotKeysStart(
HotKeysMetrics metrics = (HotKeysMetrics)~0, // everything by default
long count = 0,
Expand All @@ -34,7 +33,6 @@ void HotKeysStart(
/// <param name="sampleRatio">Profiling frequency; effectively: measure every Nth command.</param>
/// <param name="slots">The key-slots to record during this capture (defaults to "all" / "all on this node").</param>
/// <param name="flags">The command flags to use.</param>
[Experimental(Experiments.Server_8_6, UrlFormat = Experiments.UrlFormat)]
Task HotKeysStartAsync(
HotKeysMetrics metrics = (HotKeysMetrics)~0, // everything by default
long count = 0,
Expand All @@ -47,52 +45,45 @@ Task HotKeysStartAsync(
/// Stop the current <c>HOTKEYS</c> capture, if any.
/// </summary>
/// <param name="flags">The command flags to use.</param>
[Experimental(Experiments.Server_8_6, UrlFormat = Experiments.UrlFormat)]
bool HotKeysStop(CommandFlags flags = CommandFlags.None);

/// <summary>
/// Stop the current <c>HOTKEYS</c> capture, if any.
/// </summary>
/// <param name="flags">The command flags to use.</param>
[Experimental(Experiments.Server_8_6, UrlFormat = Experiments.UrlFormat)]
Task<bool> HotKeysStopAsync(CommandFlags flags = CommandFlags.None);

/// <summary>
/// Discard the last <c>HOTKEYS</c> capture data, if any.
/// </summary>
/// <param name="flags">The command flags to use.</param>
[Experimental(Experiments.Server_8_6, UrlFormat = Experiments.UrlFormat)]
void HotKeysReset(CommandFlags flags = CommandFlags.None);

/// <summary>
/// Discard the last <c>HOTKEYS</c> capture data, if any.
/// </summary>
/// <param name="flags">The command flags to use.</param>
[Experimental(Experiments.Server_8_6, UrlFormat = Experiments.UrlFormat)]
Task HotKeysResetAsync(CommandFlags flags = CommandFlags.None);

/// <summary>
/// Fetch the most recent <c>HOTKEYS</c> profiling data.
/// </summary>
/// <param name="flags">The command flags to use.</param>
/// <returns>The data captured during <c>HOTKEYS</c> profiling.</returns>
[Experimental(Experiments.Server_8_6, UrlFormat = Experiments.UrlFormat)]
HotKeysResult? HotKeysGet(CommandFlags flags = CommandFlags.None);

/// <summary>
/// Fetch the most recent <c>HOTKEYS</c> profiling data.
/// </summary>
/// <param name="flags">The command flags to use.</param>
/// <returns>The data captured during <c>HOTKEYS</c> profiling.</returns>
[Experimental(Experiments.Server_8_6, UrlFormat = Experiments.UrlFormat)]
Task<HotKeysResult?> HotKeysGetAsync(CommandFlags flags = CommandFlags.None);
}

/// <summary>
/// Metrics to record during <c>HOTKEYS</c> profiling.
/// </summary>
[Flags]
[Experimental(Experiments.Server_8_6, UrlFormat = Experiments.UrlFormat)]
public enum HotKeysMetrics
{
/// <summary>
Expand All @@ -114,7 +105,6 @@ public enum HotKeysMetrics
/// <summary>
/// Captured data from <c>HOTKEYS</c> profiling.
/// </summary>
[Experimental(Experiments.Server_8_6, UrlFormat = Experiments.UrlFormat)]
public sealed partial class HotKeysResult
{
// Note: names are intentionally chosen to align reasonably well with the Redis command output; some
Expand Down
1 change: 0 additions & 1 deletion src/StackExchange.Redis/Increx.StringIncrementResult.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ namespace StackExchange.Redis;
/// Represents the result of an increment operation including the resulting value and the increment actually applied.
/// </summary>
/// <typeparam name="T">The numeric type represented by the result.</typeparam>
[Experimental(Experiments.Server_8_8, UrlFormat = Experiments.UrlFormat)]
public readonly struct StringIncrementResult<T>(T value, T appliedIncrement)
{
/// <summary>
Expand Down
23 changes: 0 additions & 23 deletions src/StackExchange.Redis/Interfaces/IDatabase.Arrays.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,79 +10,66 @@ public partial interface IDatabase
/// <summary>
/// Sets the value at the specified array index.
/// </summary>
[Experimental(Experiments.Server_8_8, UrlFormat = Experiments.UrlFormat)]
bool ArraySet(RedisKey key, RedisArrayIndex index, RedisValue value, CommandFlags flags = CommandFlags.None);

/// <summary>
/// Sets a contiguous range of array values starting at the specified index.
/// </summary>
[Experimental(Experiments.Server_8_8, UrlFormat = Experiments.UrlFormat)]
int ArraySet(RedisKey key, RedisArrayIndex index, RedisValue[] values, CommandFlags flags = CommandFlags.None);

/// <summary>
/// Sets values at multiple array indices.
/// </summary>
[Experimental(Experiments.Server_8_8, UrlFormat = Experiments.UrlFormat)]
int ArraySet(RedisKey key, RedisArrayEntry[] values, CommandFlags flags = CommandFlags.None);

/// <summary>
/// Gets the value at the specified array index.
/// </summary>
[Experimental(Experiments.Server_8_8, UrlFormat = Experiments.UrlFormat)]
RedisValue ArrayGet(RedisKey key, RedisArrayIndex index, CommandFlags flags = CommandFlags.None);

/// <summary>
/// Gets the values at the specified array indices.
/// </summary>
[Experimental(Experiments.Server_8_8, UrlFormat = Experiments.UrlFormat)]
RedisValue[] ArrayGet(RedisKey key, RedisArrayIndex[] indices, CommandFlags flags = CommandFlags.None);

/// <summary>
/// Gets values in the specified array index range.
/// </summary>
[Experimental(Experiments.Server_8_8, UrlFormat = Experiments.UrlFormat)]
RedisValue[] ArrayGetRange(RedisKey key, RedisArrayIndex start, RedisArrayIndex end, CommandFlags flags = CommandFlags.None);

/// <summary>
/// Gets the notional length of the array.
/// </summary>
[Experimental(Experiments.Server_8_8, UrlFormat = Experiments.UrlFormat)]
RedisArrayIndex ArrayLength(RedisKey key, CommandFlags flags = CommandFlags.None);

/// <summary>
/// Gets the number of array cells that have values.
/// </summary>
[Experimental(Experiments.Server_8_8, UrlFormat = Experiments.UrlFormat)]
RedisArrayIndex ArrayCount(RedisKey key, CommandFlags flags = CommandFlags.None);

/// <summary>
/// Deletes the value at the specified array index.
/// </summary>
[Experimental(Experiments.Server_8_8, UrlFormat = Experiments.UrlFormat)]
bool ArrayDelete(RedisKey key, RedisArrayIndex index, CommandFlags flags = CommandFlags.None);

/// <summary>
/// Deletes values at the specified array indices.
/// </summary>
[Experimental(Experiments.Server_8_8, UrlFormat = Experiments.UrlFormat)]
int ArrayDelete(RedisKey key, RedisArrayIndex[] indices, CommandFlags flags = CommandFlags.None);

/// <summary>
/// Deletes values in the specified array index range.
/// </summary>
[Experimental(Experiments.Server_8_8, UrlFormat = Experiments.UrlFormat)]
RedisArrayIndex ArrayDeleteRange(RedisKey key, RedisArrayIndex start, RedisArrayIndex end, CommandFlags flags = CommandFlags.None);

/// <summary>
/// Deletes values in the specified array index ranges.
/// </summary>
[Experimental(Experiments.Server_8_8, UrlFormat = Experiments.UrlFormat)]
RedisArrayIndex ArrayDeleteRange(RedisKey key, RedisArrayRange[] ranges, CommandFlags flags = CommandFlags.None);

/// <summary>
/// Gets the non-empty values in the specified array index range.
/// </summary>
[Experimental(Experiments.Server_8_8, UrlFormat = Experiments.UrlFormat)]
RedisArrayEntry[] ArrayScan(RedisKey key, RedisArrayIndex start, RedisArrayIndex end, int limit = 0, CommandFlags flags = CommandFlags.None);

/// <summary>
Expand All @@ -92,61 +79,51 @@ public partial interface IDatabase
/// When <see cref="ArrayGrepRequest.IncludeValues"/> is <see langword="false"/>, returned entries contain only indices.
/// When <see cref="ArrayGrepRequest.IncludeValues"/> is <see langword="true"/>, returned entries contain indices and values.
/// </remarks>
[Experimental(Experiments.Server_8_8, UrlFormat = Experiments.UrlFormat)]
RedisArrayEntry[] ArrayGrep(RedisKey key, ArrayGrepRequest request, CommandFlags flags = CommandFlags.None);

/// <summary>
/// Performs an operation over the specified array range.
/// </summary>
[Experimental(Experiments.Server_8_8, UrlFormat = Experiments.UrlFormat)]
RedisValue ArrayOperation(RedisKey key, RedisArrayIndex start, RedisArrayIndex end, ArrayOperation operation, RedisValue operand = default, CommandFlags flags = CommandFlags.None);

/// <summary>
/// Adds a value to a ring-buffer array.
/// </summary>
[Experimental(Experiments.Server_8_8, UrlFormat = Experiments.UrlFormat)]
RedisArrayIndex ArrayRing(RedisKey key, RedisArrayIndex maxLength, RedisValue value, CommandFlags flags = CommandFlags.None);

/// <summary>
/// Adds values to a ring-buffer array.
/// </summary>
[Experimental(Experiments.Server_8_8, UrlFormat = Experiments.UrlFormat)]
RedisArrayIndex ArrayRing(RedisKey key, RedisArrayIndex maxLength, RedisValue[] values, CommandFlags flags = CommandFlags.None);

/// <summary>
/// Gets the current array write-head.
/// </summary>
[Experimental(Experiments.Server_8_8, UrlFormat = Experiments.UrlFormat)]
RedisArrayIndex? ArrayNext(RedisKey key, CommandFlags flags = CommandFlags.None);

/// <summary>
/// Inserts a value at the current array write-head.
/// </summary>
[Experimental(Experiments.Server_8_8, UrlFormat = Experiments.UrlFormat)]
RedisArrayIndex ArrayInsert(RedisKey key, RedisValue value, CommandFlags flags = CommandFlags.None);

/// <summary>
/// Inserts values at the current array write-head.
/// </summary>
[Experimental(Experiments.Server_8_8, UrlFormat = Experiments.UrlFormat)]
RedisArrayIndex ArrayInsert(RedisKey key, RedisValue[] values, CommandFlags flags = CommandFlags.None);

/// <summary>
/// Moves the array write-head to the specified index.
/// </summary>
[Experimental(Experiments.Server_8_8, UrlFormat = Experiments.UrlFormat)]
bool ArraySeek(RedisKey key, RedisArrayIndex index, CommandFlags flags = CommandFlags.None);

/// <summary>
/// Gets the previous array items.
/// </summary>
[Experimental(Experiments.Server_8_8, UrlFormat = Experiments.UrlFormat)]
RedisValue[] ArrayLastItems(RedisKey key, int count, bool reverse = false, CommandFlags flags = CommandFlags.None);

/// <summary>
/// Gets array metadata.
/// </summary>
[Experimental(Experiments.Server_8_8, UrlFormat = Experiments.UrlFormat)]
ArrayInfo ArrayInfo(RedisKey key, bool full = false, CommandFlags flags = CommandFlags.None);
}

Expand Down
Loading
Loading