Сценарии

Редактировал(а) Alexandr Fokin 2026/07/27 16:56

 
Шаблон транзакции redis

Транзакции

  1. Сначала подготавливаем контейнер команд.
  2. Выполняем транзакцию.
  3. Обрабатываем результаты команд.
private static async ValueTask<TResult> ExecuteTransactionAsync<TParam, TCommands, TResult>(
    TParam param,
    IDatabase database,
    Func<TParam, ITransaction, TCommands> prepareHandller,
    Func<TParam, TCommands, bool, TResult> executedHandler)
{
   var transaction = database.CreateTransaction();

   var prepareResult = prepareHandller(param, transaction);

   var isExecuted = await transaction.ExecuteAsync();

   return executedHandler(param, prepareResult, isExecuted);
}
Пример вызова.

Замечание, если хотя бы одно условие не выполнена, то действие не выполняется (isExecuted == false)
var counterValue = await ExecuteTransactionAsync(
    (1, key),
    db,
    prepareHandller: static (p, t) =>
    {
       var keyExists = t.AddCondition(Condition.KeyExists(p.key));
       var incrementResult = t.StringIncrementAsync(p.key, 1);

       return (
            keyExists,
            incrementResult);
    },
    executedHandler: static (p, c, r) =>
    {
       if (!c.keyExists.WasSatisfied)
        {
           throw new Exception($"Ожидается, что ключ уже должен существовать. {p.key}");
        }

       return c.incrementResult.Result;
    }
    );
  
Pipelining