首页 文章

C#redis vs mongodb表现

提问于
浏览
2

我正在用不同的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 回答

  • 2

    以下是一些可能影响您的测试的案例 .

    一般来说,Mongo对于那个测试更好 . 请看 mongo concurrency规格 .

    MongoDB使用reader-writer 1锁定,允许对数据库进行并发读取访问,但允许对单个写入操作进行独占访问 . 当存在读锁时,许多读操作可能使用此锁 . 但是,当存在写锁定时,单个写入操作将独占地保持锁定,并且没有其他读取或写入操作可以共享锁定 . 锁是“作家贪婪”,这意味着写作优先于读取 . 当读取和写入都在等待锁定时,MongoDB会将锁定授予写入 .

    redis 的概念是

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

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

相关问题