2012-02-21 3 views
3

Я довольно новичок в Redis, и я его оцениваю. Я использую сервер Redis здесь: https://github.com/downloads/dmajkic/redis/redis-2.4.5-win32-win64.zipКлиент Redis/ServiceStack Сделки транзакций

Я также использую следующие конфигурации для сервера:

порта 6379 таймаута 300 сохранить 900 1 сохранить 300 10 сохранить 60 10000 LogLevel отладка логфайла STDOUT базы данных 1 MaxClients 32 maxmemory 2147483648

Я пытаюсь запустить код, как это использование ServiceStack клиента (ServiceStack-ServiceStack.Redis-4add28 а)

Вот мой код

public void InsertInsideTransaction(bool shouldTransactionRollback) 
{ 
    RedisClient transClient = new RedisClient("localhost"); 

    ClearAll(); 
    using (var trans = transClient.CreateTransaction()) 
    { 
     trans.QueueCommand(r => 
      { 
       var redisUsers = r.GetTypedClient<User>(); 
       var sacha = new User { Id = redisUsers.GetNextSequence(), Name = "Sacha Barber" }; 
       redisUsers.Store(sacha); 
       //redisUsers.Dispose(); 
      }); 

     //commit or rollback based on incoming flag 
     if (shouldTransactionRollback) 
      trans.Rollback(); 
     else 
      trans.Commit(); 

     IList<User> users = Users(); 
     Console.WriteLine(string.Format("InsertInsideTransaction : There are currently {0}, Users", users.Count())); 
    } 




} 

Где Пользователь выглядит следующим образом (от одного из примеров, который поставляется с ServiceStack)

public class User 
{ 
    public User() 
    { 
     this.BlogIds = new List<long>(); 
    } 

    public long Id { get; set; } 
    public string Name { get; set; } 
    public List<long> BlogIds { get; set; } 
} 

Я получаю это исключение, когда я пытаюсь совершить сделка

Неизвестный ответ на многоядерной запросу: 43QUEUED, Спорт: 60793, LastCommand: EXEC

at ServiceStack.Redis.RedisNativeClient.CreateResponseError (String error) в C: \ Users \ barbers \ Desktop \ Downloads \ ServiceStack-ServiceStack.Redis-4add28a \ ServiceStack-ServiceStack.Redis-4add28a \ src \ ServiceStack.Redis \ RedisNativeClient_Utils. cs: строка 146 в ServiceStack.Redis.RedisNativeClient.ReadMultiDataResultCount() в C: \ Users \ barbers \ Desktop \ Downloads \ ServiceStack-ServiceStack.Redis-4add28a \ ServiceStack-ServiceStack.Redis-4add28a \ src \ ServiceStack.Redis \ RedisNativeClient_Utils .cs: ​​строка 578 на ServiceStack.Redis.Pipeline.QueuedRedisOperation.ProcessResult() в папке C: \ Users \ barbers \ Desktop \ Downloads \ ServiceStack-ServiceStack.Redis-4add28a \ ServiceStack-ServiceStack.Redis-4add28a \ src \ ServiceStack. Redis \ Pipeline \ QueuedRedisOperation.cs: строка 169 в ServiceStack.Redis.RedisTransaction.Commit() в C: \ Users \ barbers \ Desktop \ Downloads \ ServiceStack-ServiceStack.Redis-4add 28a \ ServiceStack-ServiceStack.Redis-4add28a \ src \ ServiceStack.Redis \ Transaction \ RedisTransaction.cs: строка 100 в DocumentDB.Redis.RedisMessAround.InsertInsideTransaction (Boolean shouldTransactionRollback) в C: \ Users \ barbers \ Desktop \ DocumentDBs \ DocumentDB .Redis \ RedisMessAround.cs: строка 63 в DocumentDB.Redis.Program.Run() в папке C: \ Users \ barbers \ Desktop \ DocumentDBs \ DocumentDB.Redis \ Program.cs: строка 45 в DocumentDB.Redis.Program. Main (String [] args) в C: \ Users \ barbers \ Desktop \ DocumentDBs \ DocumentDB.Redis \ Program.cs: строка 18 в System.AppDomain._nExecuteAssembly (сборка RuntimeAssembly, String [] args) в System.AppDomain .ExecuteAssembly (String assemblyFile, Evidence assemblySecurity, String [] args) в Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() в Syste m.Threading.ThreadHelper.ThreadStart_Context (состояние объекта) на System.Threading.ExecutionContext.Run (ExecutionContext ExecutionContext, ContextCallback обратного вызова, состояние объекта, Boolean ignoreSyncCtx) на System.Threading.ExecutionContext.Run (ExecutionContext ExecutionContext, ContextCallback обратного вызова, объект состояние) в System.Threading.ThreadHelper.ThreadStart()

Я тогда подумал Ok ребята Redis ServiceStack он работает с использованием транзакций в своих модульных тестов, так что я редактировал «RedisTransactionTests», чем пришел с клиентом ServiceStack (ServiceStack -ServiceStack.Redis-4add28a) Я использую

Вот что я добавил к «RedisTransactionTests»

public class User 
{ 
    public User() 
    { 
     this.BlogIds = new List<long>(); 
    } 

    public long Id { get; set; } 
    public string Name { get; set; } 
    public List<long> BlogIds { get; set; } 
} 

, где у меня есть этот отредактированный тестовый код

[Test] 
[TestCase(true)] 
[TestCase(false)] 
public void TestUserTrans(bool shouldTransactionRollback) 
{ 
    int count = 0; 


    IRedisTransaction trans = Redis.CreateTransaction(); 

    try 
    { 
     trans.QueueCommand(r => 
     { 
      var redisUsers = r.GetTypedClient<User>(); 
      var sacha = new User { Id = redisUsers.GetNextSequence(), Name = "Sacha Barber" }; 
      redisUsers.Store(sacha); 
     }); 

     //commit or rollback based on incoming flag 
     if (shouldTransactionRollback) 
      trans.Rollback(); 
     else 
      trans.Commit(); 
    } 
    catch (Exception ex) 
    { 

    } 

    IList<User> users = Users(); 
    count = users.Count(); 
    Console.WriteLine(string.Format("TestUserTrans : There are currently {0}, Users", users.Count())); 
    if (shouldTransactionRollback) 
     Assert.That(count == 0); 
    else 
     Assert.That(count == 1); 

} 

В там Exception, кажется, чтобы получить полностью проглатывание.

Что же я делаю неправильно

ответ

4

Вы не можете прочитать и использовать полученные результаты в рамках одних и тех же операций.

Убедитесь, что вы читали о том, как работает MULTI/EXEC: http://redis.io/topics/transactions

Он эффективно работает дозированием до нескольких команд в одной команде соединения, который передается и обрабатывается Redis в 1 раз.

В вашем примере вы пытаетесь сделать чтение с redisUsers.GetNextSequence() и использовать результат из транзакции в очереди. Вы не можете сделать это, а если вы хотите использовать переменные в очереди транзакций, которые нужно прочитать перед:

var sacha = new User { 
    Id = Redis.As<User>().GetNextSequence(), Name = "Sacha Barber" }; 

trans.QueueCommand(r => r.As<User>().Store(sacha)); 

Примечание: .As<T>() это стенография для r.GetTypedClient<T>()

Для сделки целостность при чтении вы можете отправить команду WATCH, чтобы указать все переменные, которые будет использовать ваша транзакция. Затем, если какая-либо из этих переменных будет изменена до завершения транзакции, будет создано исключение, и ни одна из выполняемых в очереди операций не будет выполнена.

+0

А гениальный, см. Сказал, что я новичок. Это меня разобрало, я обязательно прочитаю ссылки, которые вы разместили. Огромное спасибо – sacha