多个redis调用或单个调用Mongo或其他数据库引擎

时间:2015-05-20 06:33:48

标签: mongodb performance redis database nosql

我理解redis很快,我发现只使用redis就可以实现很多东西。但是以牺牲多个查询为代价。在我使用Mongo时,我可能有一个模型/架构,如:

聊天室(Mongo)

  • _id:ObjectId
  • name:string
  • 用户:数组

使用redis我需要更复杂的东西

  • chatrooms:<<id>>其中id需要手动生成
    • 名称
  • chatrooms:<<id>>:users用于存储用户组

要检索mongo的聊天室详细信息很简单,使用mongo我需要在这种情况下产生2个查询。在更复杂的用例中,可能更多

所以我从性能的角度来看,这更有效率?从开发的角度来看,肯定是以简单的Mongo为例。

3 个答案:

答案 0 :(得分:5)

  

所以我从性能的角度来看,这更有效率?   从开发的角度来看,肯定是它使用Mongo更简单   例如。

Redis支持Lua scripting using the EVAL/EVALSHA commands。您所谓的多个查询可以简化为其中一个,因为Lua脚本在Redis本身中执行,然后您可以通过SHA从Redis客户端调用缓存的Lua脚本。

在性能方面,它将取决于您自己的代码,但您可以确定Redis应该击败Mongo,因为Redis是内存存储并且它异步持久化到磁盘(实际上它创建了快照)加班或基于某些条件)。

关于简单性,并不比使用集合,散列或列表等数据结构更简单,但无论如何,简单性是一个主观概念......

关于Lua脚本

注意Lua脚本是以原子方式执行的,并且因为Redis可以立即执行命令(原子操作就像一个命令),所以你不应该在Lua中实现繁重的操作,因为它可能会降低整体Redis表现。

通常你实现Lua脚本以原子方式写入数据,例如&#34;设置一个字符串键,将一个成员添加到某个集合中并删除if who who who know what what sorted&#34;。由于您不希望有可能破坏您的数据,因此您可以使用Lua脚本或MULTI命令来实现原子操作。

答案 1 :(得分:2)

这是一个棘手的问题 - 您基本上要求比较两个数据库之间的性能,并将其与易用性进行对比。

就易用性而言,我绝对相信MongoDB更适合新手,也许是那些只想使用数据库而不了解每种技术的优缺点/优缺点的开发人员。 MongoDB是一项令人惊叹的技术,它可以为各种级别的工程师提供极大的便利 - 这既是它的力量,也是它的垮台IMO:虽然你可以做很多事情,但它太通用了我的口味要真正有效(有点像新甲骨文)。

Redis,OTOH,提供了基本构建模块 - 您需要了解它的工作原理以及如何将块放在一起以获得所需的结果。这对开发人员来说需要更多的努力 - 无论是学习Redis方式还是用它来实现解决方案。

因此,虽然MongoDB更容易开始使用,但我认为Redis从长远来看更灵活,并且允许对数据库的每个方面进行细粒度控制。

就性能而言,我非常肯定Redis会随时超越MongoDB。是的,性能受到&#34;呼叫次数的影响&#34;但这不是一个确定的措施。提供的示例(聊天室)可以很容易地封装在一个或几个&#34;调用&#34; (例如,使用哈希来包含所有对象和id),这只是一种方法。即使假设OP提出的&#34;架构&#34;并且,当来自MongoDB的一个调用提供了多次调用以从Redis获取相同的数据时,我确信数据将从Redis返回得比其他任何数据库更快,因为Redis使用RAM而MongoDB是基于磁盘的。

我建议,为了选择合适的技术/解决方案,您需要花一点时间来定义和考虑要求 - 如果您需要性能,Redis是您最好的选择。

答案 2 :(得分:0)

这取决于您要索引的内容。如果您只想按<id>进行索引,我不明白为什么您无法从redis获取一个查询中的所有数据。您可以做的是将名称和用户编码为JSON字符串,并仅使用一个查询来检索它。

总的来说,性能比较很棘手。较少的查询并不一定意味着更快。如果数据不复杂并且不需要多个字段的索引,我通常更喜欢redis或memcached类型的内存缓存。