【问题标题】:C# redis vs mongodb performanceC# redis vs mongodb 性能
【发布时间】:2013-12-04 23:22:57
【问题描述】:

我正在研究不同的 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);

我得到的结果令人惊讶。

蒙哥: 总计: : 2.5217096 平均:0.210511518

Redis: 总计: : 17.249888 平均:2.275050013

在我的测试中,Mongo 在并发请求很多时似乎比 Redis 快得多。我添加的线程越多,差距就越大。根据我阅读的内容,我期待不同的结果。为什么?

两者都在同一个虚拟机上运行

CentOS 6.4 Intel(R) Core(TM) i7-2860QM CPU @ 2.50GHz

4Gb 内存

【问题讨论】:

    标签: c# performance mongodb redis


    【解决方案1】:

    以下是一些可能会影响您的测试的情况。

    总的来说,Mongo 更适合该测试。查看 mongo concurrency 规范。

    MongoDB 使用读写器1 锁,它允许对数据库进行并发读取访问,但对单个写入操作提供独占访问。

    当存在读锁时,许多读操作可能会使用该锁。但是,当存在写锁时,单个写操作独占持有该锁,其他任何读写操作都不能共享该锁。

    锁是“写者贪婪的”,这意味着写优先于读。当读取和写入都在等待锁时,MongoDB 将锁授予写入。

    redis的概念是

    Redis 操作是原子的这一事实仅仅是单线程事件循环的结果。有趣的一点是原子性是免费提供的(它不需要同步)。用户可以利用它来实现乐观锁定和其他模式,而无需支付同步开销。

    附言如果您使用 RDB 作为持久性存储类型,redis 中的另一件事是 snapshoting 设置。此策略意味着您每 N 秒或 Y 键已更改时将 db 保存到磁盘。例如每 10 秒或每 1000 个键。

    【讨论】:

    • 仅出于测试目的禁用保存在磁盘上。它没有提高性能,因为在子进程上执行 shapshoting。
    • 正如我上面所说的 - 这不是决定因素。最主要的 - mongo 允许您在不阻塞的情况下读取数据。我可以对 redis 做一些改进——在 MULTI 块中执行命令。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-07
    • 2012-03-17
    • 1970-01-01
    • 2014-04-06
    • 1970-01-01
    • 2015-10-27
    • 2018-07-21
    相关资源
    最近更新 更多