2013-11-20 2 views
2

Я занимаюсь исследованиями с различными кэшами/базами данных nosql.C# redis vs mongodb performance

Следующий тест производительности был выполнен с помощью драйвера C# mongo 1.8.3.9 и ServiceStack.Redis 3.9.57.0.

MongoDB 2,4

Redis Метод 2.6.16

private List<string> GetListStrings() 
{ 
    var list = new List<string>(count); 
    for (int i = 0; i < count; i++) 
    { 
     list.Add(Guid.NewGuid().ToString()); 
    } 
    return list; 
} 

Монго Метод испытания

public class TestStrings 
{ 
    [BsonId] 
    public ObjectId Id { get; set; } 
    public string[] List { get; set; } 
} 

public void SendIdsMongo() 
{ 
    var idsEntity = new TestStrings 
    { 
     List = GetListStrings().ToArray() 
    }; 

    var client = new MongoClient(mongoConnectionString); 
    MongoServer server = client.GetServer(); 
    MongoDatabase database = server.GetDatabase("newdb"); 

    var col = database.GetCollection("l2"); 

    Utils.TimeLog("Insert",() => 
    { 
     col.Insert(idsEntity, WriteConcern.Acknowledged); 
    }); 

    Utils.TimeLog("FindOneByIdAs",() => 
    { 
     var ret = col.FindOneByIdAs<TestStrings>(idsEntity.Id); 
     Console.Write(ret.List.Length); 
    }); 
} 

Redis Тест

[TestMethod] 
public void SendIdsRedis() 
{ 
    var key = Guid.NewGuid().ToString(); 

    var list = GetListStrings(); 

    using (var redisClient = manager.GetClient()) 
    { 
     Utils.TimeLog("AddRangeToList",() => redisClient.AddRangeToList(key, list)); 

     Utils.TimeLog("GetRangeFromList",() => 
     { 
      var ret = redisClient.GetAllItemsFromList(key); 
      Console.WriteLine(ret.Count); 
     }); 
    } 
} 

Когда я вставив 10000 элементов списка в и я получение

Монго: 0,27 пишут, 0,031 чтения

Redis: 0,26 пишут, 0,013 чтения

Теперь я пытаюсь сделать то же самое одновременно закручивая 100 потоков

var results = new TimeSpan[tasksCount]; 

Utils.TimeLog("total: ",() => 
{ 
    Parallel.For(0, tasksCount, x => 
    { 
     Stopwatch stopwatch = Stopwatch.StartNew(); 
     SendIdsRedis(); //SendIdsMongo() 
     stopwatch.Stop(); 
     results[x] = stopwatch.Elapsed; 
    }); 
}); 

Console.WriteLine("avg: " + results.Aggregate((a, b) => a + b).TotalSeconds/tasksCount); 

результаты я «Получаю удивление.

Монго: всего:: 2,5217096 среды: 0,210511518

Redis: всего:: 17,249888 среды: 2,275050013

Монго в моем тесте оказались намного быстрее, чем Redis с большим количеством одновременных запросов. И чем больше потоков я добавил, тем больше был разрыв. Я ожидал результатов, основанных на том, что я читал. Зачем?

Оба работают на той же VM

CentOS 6,4 Intel (R) ядро ​​(TM) i7-2860QM CPU @ 2.50GHz

4Gb Ram

ответ

2

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

В целом Монго лучше для этого теста. Посмотрите mongoconcurrency спецификация.

В MongoDB используется считыватель-писатель 1, который позволяет одновременному считыванию доступа к базе данных, но дает эксклюзивный доступ к одной операции записи.

Когда существует блокировка чтения, многие операции чтения могут использовать эту блокировку. Однако, когда существует блокировка записи, одна операция записи содержит блокировку исключительно, и никакие другие операции чтения или записи не могут совместно использовать блокировку.

Замки «писатель жадный», что означает, что записи предпочитают читать. Когда оба чтения и записи ждут блокировки, MongoDB предоставляет блокировку записи.

И Redis концепция

Тот факт, что Redis операции являются атомарными просто следствием однопоточных цикла событий. Интересным моментом является атомарность без дополнительных затрат (для этого не требуется синхронизация). Он может быть использован пользователем для реализации оптимистической блокировки и других шаблонов, не оплачивая накладные расходы синхронизации.

p.s. Еще одна вещь в redis - это настройки snapshoting, если вы используете RDB в качестве хранилища сохраняемости. Эта стратегия означает, что вы сохраняете db на диск каждые N секунд или если Y-ключи были изменены. Например, каждые 10 секунд или каждые 1000 клавиш.

+0

Только для целей тестирования отключено сохранение на диске. Это не улучшало производительность, поскольку shapshoting выполняется по дочернему процессу. – serg

+0

Как я уже говорил, это не решающий фактор. Главное - монго позволяет читать данные без блокировки. Я могу сделать некоторые улучшения для redis - выполнить команды в блоке MULTI. – misterion