C#redis vs mongodb性能

我正在用不同的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 avg:2.275050013

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

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

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

4Gb公羊


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

一般来说,Mongo对于这个测试更好。 看看mongo并发规范。

MongoDB使用读写器1锁,它允许并发读取数据库访问权限,但可以独占访问单个写入操作。

当读锁存在时,许多读操作可能会使用此锁。 但是,如果存在写入锁定,则单个写入操作将独占锁定,并且不会有其他读取或写入操作共享该锁定。

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

redis的概念是

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

ps如果您将RDB用作持久性存储类型,则redis中的另一件事是快照设置。 这种策略意味着你每隔N秒将数据库保存到磁盘,或者如果Y键被更改。 例如每10秒或每1000个键。

链接地址: http://www.djcxy.com/p/86415.html

上一篇: C# redis vs mongodb performance

下一篇: How to atomically delete keys matching a pattern using Redis