diff --git a/.github/workflows/nuget-release.yml b/.github/workflows/nuget-release.yml index ff128062..e0080c6a 100644 --- a/.github/workflows/nuget-release.yml +++ b/.github/workflows/nuget-release.yml @@ -26,4 +26,4 @@ jobs: NUGET_KEY: ${{secrets.NUGET_API_KEY}} PROJECT_FILE_PATH: src/NRedisStack/NRedisStack.csproj PACKAGE_NAME: NRedisStack - TAG_COMMIT: false + TAG_COMMIT: false \ No newline at end of file diff --git a/src/NRedisStack/Pipeline.cs b/src/NRedisStack/Pipeline.cs new file mode 100644 index 00000000..dd833fd6 --- /dev/null +++ b/src/NRedisStack/Pipeline.cs @@ -0,0 +1,50 @@ +using NRedisStack.RedisStackCommands; +using StackExchange.Redis; + +namespace NRedisStack +{ + public class Pipeline + { + private readonly IDatabase _db; + private readonly List _commands = new List(); + + public Pipeline(IDatabase db) + { + _db = db; + } + + public void AddCommand(SerializedCommand command) + { + _commands.Add(command); + } + + public RedisResult[] Execute() + { + var transaction = _db.CreateTransaction(); + var tasks = new List>(); + foreach (var command in _commands) + { + tasks.Add(transaction.ExecuteAsync(command.Command, command.Args)); + } + + transaction.Execute(); + Task.WhenAll(tasks).Wait(); + return tasks.Select(x => x.Result).ToArray(); + } + + public async Task ExecuteAsync() + { + var transaction = _db.CreateTransaction(); + var tasks = new List>(); + foreach (var command in _commands) + { + tasks.Add(transaction.ExecuteAsync(command.Command, command.Args)); + } + + transaction.Execute(); + await Task.WhenAll(tasks); + return tasks.Select(x => x.Result).ToArray(); + } + + } +} \ No newline at end of file diff --git a/tests/NRedisStack.Tests/Json/JsonTests.cs b/tests/NRedisStack.Tests/Json/JsonTests.cs index a76f6cc4..6d05973b 100644 --- a/tests/NRedisStack.Tests/Json/JsonTests.cs +++ b/tests/NRedisStack.Tests/Json/JsonTests.cs @@ -20,6 +20,21 @@ public void Dispose() redisFixture.Redis.GetDatabase().KeyDelete(_testName); } + [Fact] + public void TestPipeline() + { + var conn = redisFixture.Redis; + var db = conn.GetDatabase(); + IJsonCommands json = new JsonCommands(db); + var pipeline = new Pipeline(db); + pipeline.AddCommand(JsonCommandBuilder.Set("key", "$", new Person { Name = "Shachar", Age = 23 })); + pipeline.AddCommand(JsonCommandBuilder.Get("key")); + var results = pipeline.Execute(); + Assert.Equal(2, results.Length); + Assert.Equal("OK", results[0].ToString()); + Assert.Equal("{\"Name\":\"Shachar\",\"Age\":23}", results[1].ToString()); + } + [Fact] public void TestSetFromFile() {