我正在用不同的nosql缓存/数据库进行研究 .
使用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;
}
Mongo测试方法
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个项目列表时,我正在获取
Mongo: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);
我得到的结果令人惊讶 .
Mongo:总计:2.5217096平均值:0.210511518
Redis:总数:17.249888平均值:2.275050013
我的测试中的Mongo似乎比Redis快得多,并且有许多并发请求 . 我添加的线程越多,差距越大 . 根据我的阅读,我期待不同的结果 . 为什么?
两者都在同一个VM上运行
CentOS 6.4 Intel(R)Core(TM)i7-2860QM CPU @ 2.50GHz
4Gb Ram
1 回答
以下是一些可能影响您的测试的案例 .
一般来说,Mongo对于那个测试更好 . 请看 mongo concurrency规格 .
而 redis 的概念是
附:如果您使用RDB作为持久性存储类型,redis中的另一件事是snapshoting settings . 此策略意味着每隔N秒或如果更改了Y键,将db保存到磁盘 . 例如,每10秒或每1000个键 .