首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C# redis对mongodb性能的影响

C# redis对mongodb性能的影响
EN

Stack Overflow用户
提问于 2013-11-20 19:16:12
回答 1查看 3K关注 0票数 2

我正在研究不同的nosql缓存/数据库。

下面的性能测试是用C# mongo驱动程序1.8.3.9和ServiceStack.Redis 3.9.57.0进行的。

MongoDB 2.4

Redis 2.6.16

代码语言:javascript
复制
private List<string> GetListStrings()
{
    var list = new List<string>(count);
    for (int i = 0; i < count; i++)
    {
        list.Add(Guid.NewGuid().ToString());
    }
    return list;
}

蒙戈试验法

代码语言:javascript
复制
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);
    });
}

红系试验法

代码语言:javascript
复制
[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个线程

代码语言:javascript
复制
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

EN

Stack Overflow用户

发布于 2013-11-20 19:39:14

以下是一些可能影响您考试的案例。

总的说来,蒙戈更适合那次考试。看看mongo 并发性规范。

MongoDB使用读写器1锁,该锁允许并发读取对数据库的访问,但允许对单个写操作进行独占访问。 当存在读锁时,许多读取操作可能使用此锁。但是,当存在写锁时,单个写操作独占地保存锁,其他任何读或写操作都不能共享该锁。 锁是“编写者贪婪”,这意味着写入优先于读取。当读和写都在等待锁时,MongoDB将锁授予写入。

redis的概念是

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

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

票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20104896

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档