我正在研究不同的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;
}蒙戈试验法
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);
});
}红系试验法
[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人
红皮书:总计: 17.249888份平均费用: 2.275050013份
在我的测试中,Mongo的速度似乎比Redis快得多,有许多并发请求。我加的线越多,差距就越大。根据我所读到的,我期待着不同的结果。为什么?
都运行在同一个VM上。
英特尔(R) CentOS (商标)i7-2860QMCPU@ 2.50GHz
4Gb Ram
发布于 2013-11-20 19:39:14
以下是一些可能影响您考试的案例。
总的说来,蒙戈更适合那次考试。看看mongo 并发性规范。
MongoDB使用读写器1锁,该锁允许并发读取对数据库的访问,但允许对单个写操作进行独占访问。 当存在读锁时,许多读取操作可能使用此锁。但是,当存在写锁时,单个写操作独占地保存锁,其他任何读或写操作都不能共享该锁。 锁是“编写者贪婪”,这意味着写入优先于读取。当读和写都在等待锁时,MongoDB将锁授予写入。
redis的概念是
Redis操作是原子的,这只是单线程事件循环的结果。有趣的是原子性是免费提供的(它不需要同步)。用户可以利用它实现乐观锁定和其他模式,而无需支付同步开销。
附注:redis中的另一件事是拍拍设置,如果您使用RDB作为持久性存储类型的话。此策略意味着每N秒将db保存到磁盘,或者Y键被更改。例如,每10秒或每1000个键。
https://stackoverflow.com/questions/20104896
复制相似问题