Я занимаюсь исследованиями с различными кэшами/базами данных 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
Только для целей тестирования отключено сохранение на диске. Это не улучшало производительность, поскольку shapshoting выполняется по дочернему процессу. – serg
Как я уже говорил, это не решающий фактор. Главное - монго позволяет читать данные без блокировки. Я могу сделать некоторые улучшения для redis - выполнить команды в блоке MULTI. – misterion