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