我正在研究不同的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
复制相似问题