Skip to content

Commit

Permalink
feat(StackExchange.Redis): add new project and extend functionality
Browse files Browse the repository at this point in the history
- Added a new project "ES.FX.StackExchange.Redis" to the solution.
- Included this new project as a reference in "ES.FX.Ignite.StackExchange.Redis".
- Created DatabaseExtensions class in the new project with methods for deleting keys matching a pattern in batches.
  • Loading branch information
winromulus committed Aug 15, 2024
1 parent 3b89401 commit 8062bb9
Show file tree
Hide file tree
Showing 5 changed files with 99 additions and 15 deletions.
7 changes: 7 additions & 0 deletions ES.FX.sln
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ES.FX.Ignite.OpenTelemetry.
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ES.FX.Ignite.StackExchange.Redis", "src\ES.FX.Ignite.StackExchange.Redis\ES.FX.Ignite.StackExchange.Redis.csproj", "{4D59B23E-4E1D-4617-B23A-F8A2D23328DC}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ES.FX.StackExchange.Redis", "src\ES.FX.StackExchange.Redis\ES.FX.StackExchange.Redis.csproj", "{7CDC3CE5-FC2B-4C66-BC9D-DD0AA1471EDD}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand Down Expand Up @@ -426,6 +428,10 @@ Global
{4D59B23E-4E1D-4617-B23A-F8A2D23328DC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4D59B23E-4E1D-4617-B23A-F8A2D23328DC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4D59B23E-4E1D-4617-B23A-F8A2D23328DC}.Release|Any CPU.Build.0 = Release|Any CPU
{7CDC3CE5-FC2B-4C66-BC9D-DD0AA1471EDD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7CDC3CE5-FC2B-4C66-BC9D-DD0AA1471EDD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7CDC3CE5-FC2B-4C66-BC9D-DD0AA1471EDD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7CDC3CE5-FC2B-4C66-BC9D-DD0AA1471EDD}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down Expand Up @@ -502,6 +508,7 @@ Global
{497C425C-451C-4D46-9693-A609D06D946D} = {32548940-0629-46AC-B9BF-E7C41F1C49DE}
{55694C58-56AF-4FDF-8669-F955534CFBC1} = {32548940-0629-46AC-B9BF-E7C41F1C49DE}
{4D59B23E-4E1D-4617-B23A-F8A2D23328DC} = {5A5969AF-86CB-489B-B0DE-C0BAADF5B424}
{7CDC3CE5-FC2B-4C66-BC9D-DD0AA1471EDD} = {F8538BCE-36D3-4317-8C3C-7540117B99A7}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {388473D0-FE20-4821-BFE4-C3CD3E184C8F}
Expand Down
4 changes: 3 additions & 1 deletion playground/Playground.Microservice.Api.Host/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,9 @@
builder.Logging.ClearProviders();
builder.IgniteSerilog();

builder.Ignite(settings => { settings.HealthChecks.ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse; });
builder.Ignite(settings =>
settings.HealthChecks.ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse);

//Fluent Validation
builder.IgniteFluentValidation();

Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="AspNetCore.HealthChecks.Redis" Version="8.0.1" />
<PackageReference Include="OpenTelemetry.Instrumentation.StackExchangeRedis" Version="1.9.0-beta.1" />
<PackageReference Include="StackExchange.Redis" Version="2.8.0" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="AspNetCore.HealthChecks.Redis" Version="8.0.1" />
<PackageReference Include="OpenTelemetry.Instrumentation.StackExchangeRedis" Version="1.9.0-beta.1" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\ES.FX.Ignite.Spark\ES.FX.Ignite.Spark.csproj" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\ES.FX.Ignite.Spark\ES.FX.Ignite.Spark.csproj" />
<ProjectReference Include="..\ES.FX.StackExchange.Redis\ES.FX.StackExchange.Redis.csproj" />
</ItemGroup>

</Project>
</Project>
61 changes: 61 additions & 0 deletions src/ES.FX.StackExchange.Redis/DatabaseExtensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
using JetBrains.Annotations;
using StackExchange.Redis;

namespace ES.FX.StackExchange.Redis;

/// <summary>
/// Extensions for <see cref="IDatabase" />
/// </summary>
[PublicAPI]
public static class DatabaseExtensions
{
/// <summary>
/// LUA script to delete all keys matching a pattern in batches
/// </summary>
private const string DeleteAllWithPatternBatchedScript = @"
local cursor = '0'
local batchSize = tonumber(ARGV[2])
local totalDeleted = 0
local keys
repeat
keys = {}
local result = redis.call('SCAN', cursor, 'MATCH', ARGV[1], 'COUNT', batchSize)
cursor = result[1]
for i, key in ipairs(result[2]) do
table.insert(keys, key)
end
if #keys > 0 then
redis.call('DEL', unpack(keys))
totalDeleted = totalDeleted + #keys
end
until cursor == '0'
return totalDeleted
";

/// <summary>
/// Deletes all keys matching a pattern in batches
/// </summary>
/// <param name="database">The <see cref="IDatabase" /></param>
/// <param name="pattern">Pattern to MATCH keys</param>
/// <param name="batchSize">The batch size</param>
/// <returns>The deleted key count</returns>
public static long KeysDelete(this IDatabase database, string pattern, uint batchSize = 1000)
{
var result = database.ScriptEvaluate(DeleteAllWithPatternBatchedScript, values: [pattern, batchSize]);
return long.Parse(result.ToString());
}

/// <summary>
/// Deletes all keys matching a pattern in batches
/// </summary>
/// <param name="database">The <see cref="IDatabase" /></param>
/// <param name="pattern">Pattern to MATCH keys</param>
/// <param name="batchSize">The batch size</param>
/// <returns>The deleted key count</returns>
public static async Task<long> KeysDeleteAsync(this IDatabase database, string pattern, uint batchSize = 1000)
{
var result =
await database.ScriptEvaluateAsync(DeleteAllWithPatternBatchedScript, values: [pattern, batchSize]);
return long.Parse(result.ToString());
}
}
14 changes: 14 additions & 0 deletions src/ES.FX.StackExchange.Redis/ES.FX.StackExchange.Redis.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="JetBrains.Annotations" Version="2024.2.0" />
<PackageReference Include="StackExchange.Redis" Version="2.8.0" />
</ItemGroup>

</Project>

0 comments on commit 8062bb9

Please sign in to comment.