哪个键/值存储最有前途/最稳定?

时间:2010-03-04 04:17:12

标签: python ruby database comparison

我希望开始为一些辅助项目使用一个键/值存储(主要是作为一种学习体验),但是最近出现了很多,我不知道从哪里开始。刚从记忆中列出,我可以想到:

  1. CouchDB的
  2. MongoDB的
  3. 了Riak
  4. Redis的
  5. 东京内阁
  6. Berkeley DB
  7. 卡桑德拉
  8. MemcacheDB
  9. 而且我确信在搜索工作中还有更多内容。有了所有信息,很难在所有竞争对手之间找到可靠的比较。我的标准和问题是:

    1. (最重要)您建议哪一个为什么
    2. 哪一个最快?
    3. 哪一个最稳定?
    4. 哪一个最容易设置和安装?
    5. 哪些具有Python和/或Ruby的绑定?
    6. 修改
      到目前为止看起来Redis是最好的解决方案,但这只是因为我得到了一个坚实的回应(来自ardsrk)。我正在寻找像他这样的更多答案,因为他们指出了我有用的定量信息的方向。哪个Key-Value商店使用哪个为什么

      编辑2:
      如果有人有CouchDB,Riak或MongoDB的经验,我很乐意听到你的经验(如果你能对其中几个进行比较分析,那就更是如此)

15 个答案:

答案 0 :(得分:26)

  

你推荐哪一个,为什么?

我推荐Redis。为什么?继续阅读!!

  

哪一个最快?

我不能说它是否是最快的。但Redis是fast。这很快,因为 它将所有数据保存在RAM中。最近,虚拟内存功能被添加,但仍然所有密钥都保留在主内存中,只有很少使用的值被交换到磁盘。

  

哪一个最稳定?

同样,由于我没有其他键值商店的直接经验,我无法比较。但是,Redis正在被许多Web应用程序(如GitHubInstagram等用于生产中。

  

哪一个最容易设置和安装?

Redis相当容易设置。抓住source并在Linux上运行make install。这会生成redis-server二进制文件,您可以将其放在路径上并启动它。

redis-server默认绑定到端口6379。请查看源代码附带的redis.conf以获取更多配置和设置选项。

  

哪些具有Python和/或Ruby的绑定?

Redis具有出色的RubyPython支持。

回复下面的Xorlev's comment:Memcached只是一个简单的键值存储。 Redis支持复杂的data types类似列表,集合和排序集,同时为这些数据类型提供simple interface

还有make 32bit使得所有指针的大小仅为32位,即使在64位计算机上也是如此。这可以在RAM少于4GB的计算机上节省大量内存。

答案 1 :(得分:24)

您需要了解现代NoSQL现象的含义。
它不是关键值存储。它们已经存在了数十年(例如BerkeleyDB)。为什么现在大惊小怪?

它不是关于花哨的文档或面向对象的模式,而是克服“阻抗不匹配”。这些功能的支持者多年来一直在宣传这些功能,但他们无处可去。

它只是解决3个技术问题:自动(对于维护者)和透明(对于应用程序开发人员)故障转移,分片和复制。 因此,你应该忽略任何在这方面无法提供的时尚产品。这些包括Redis,MongoDB,CouchDB等。并专注于真正的分布式解决方案,如cassandra,riak等。

否则你将失去sql给你的所有好东西(adhoc查询,老板的Crystal Reports,第三方工具和库)并且什么也得不到。

答案 2 :(得分:8)

在今年的PyCon上,Reddit的Jeremy Edberg发表了演讲:

http://pycon.blip.tv/file/3257303/

他说Reddit使用PostGres作为键值存储,可能是一个简单的2列表;根据他的讲话,它的基准测试速度比他们尝试过的任何其他键值商店都要快。当然,它非常成熟。

最终,OverClocked是对的;您的用例决定了最好的商店。但是RDMBS长期以来(ab)被用作键值存储,它们也可以非常快。

答案 3 :(得分:7)

它们都有不同的功能。并且不要忘记在每次发布之前LinkedIn实际使用/测试过的Project Voldemort

很难比较。你必须问自己你需要什么:例如你想分区吗?如果是这样,那么其中一些,如CouchDB,将不支持它。你想要擦除编码吗?然后大多数人都没有。等

Berkeley DB是一个非常基础的低级存储引擎,也许可以免于讨论。在它之上构建了几个键值系统,以提供复制,版本控制,编码等附加功能。

此外,您的应用需要什么?一些解决方案包含可能不必要的复杂性。例如。如果您只存储不会更改的静态数据,则可以将它们存储在数据的SHA-1内容哈希下(即使用内容哈希作为键)。在这种情况下,您不必担心新鲜度,同步,版本控制,并且可以删除许多复杂性。

答案 4 :(得分:7)

我一直在玩MongoDB,它有一件事使它非常适合我的应用程序,能够直接在数据库中存储复杂的地图/列表。我有一个大的Map,其中每个值都是一个列表,我不需要做任何特殊的事情只是为了编写和检索它而不知道所有不同的键和列表值。我对其他选项了解不多,但速度和能力使Mongo非常适合我的应用程序。此外,Java驱动程序使用起来非常简单。

答案 5 :(得分:6)

您必须做出的一个区别是您将使用数据库? 不要因为时髦而跳板。你需要一个钥匙价值商店吗?或者你需要一个基于文件的商店?你的内存占用要求是多少?在小型VM或单独的VM上运行它?

我建议先列出您的要求,然后查看哪些要求与您的要求重叠。

话虽如此,我使用了CouchDB / MongoDB,并且更喜欢使用MongoDB,因为它易于设置并且可以从mysql样式查询中获得最佳转换。因为动态模式(没有迁移文件!)和更好的数据建模(数组,散列),我在sql上选择了mongodb。我没有根据可扩展性进行评估。

MongoMapper是Ruby的一个很棒的MongoDB orm映射器,并且已经有一个可用的Rails 3分支。

我列出了一些关于为什么我在我的scribd幻灯片中首选mongodb的细节 http://tommy.chheng.com/index.php/2010/02/mongodb-for-natural-development/

答案 6 :(得分:6)

我注意到每个人都在用memcachedb混淆memcached。它们是两个不同的系统。操作员询问了memcachedb。

memcached是内存存储。 memcachedb使用Berkeley DB作为其数据存储区。

答案 7 :(得分:5)

我只有Berkeley DB的经验,所以我会提到我喜欢的内容。

  • 很快
  • 非常成熟稳定
  • 它有出色的文档
  • 它有C,C ++,Java& C#绑定开箱即用。其他语言绑定可用。我相信Python附带绑定作为其“电池”的一部分。

我遇到的唯一缺点是C#绑定是新的,似乎不支持所有功能。

答案 8 :(得分:4)

还有zodb。

答案 9 :(得分:4)

  

哪个关键值存储最有希望/最稳定?

G-WAN KV store看起来相当承诺

DB engine            Traversal
-----------          ----------------------------
SQLite               0.261 ms  (b-tree)
Tokyo-Cabinet (TC)   4.188 ms  (hash table)
TC-FIXED             0.103 ms  (fixed-size array)
G-WAN KV             0.010 ms  (unamed)

此外,它由G-WAN网络服务器内部使用,以其高并发性能(以及稳定性问题)而闻名。

答案 10 :(得分:3)

我非常喜欢 memcached

我在几个网站上使用它,它简单,快速,简单。它真的非常简单易用,API易于使用。它不会在磁盘上存储任何内容,因此名称为memcached,因此如果您正在寻找持久存储引擎,它就会出来。

Python有 python-memcached

我没有使用过Ruby客户端,但快速谷歌搜索显示 RMemCache

如果你只需要一个缓存引擎,memcached就是你要走的路。它已经开发出来,它很稳定,并且它的速度非常快。 LiveJournal制作它并且Facebook开发它是有原因的。它在一些最大的网站上使用,效果很好。它的扩展性非常好。

答案 11 :(得分:2)

Cassandra似乎很受欢迎。

  

Cassandra正在Digg,Facebook,Twitter,Reddit,Rackspace,Cloudkick,Cisco,SimpleGeo,Ooyala,OpenX以及更多拥有大型活跃数据集的公司中使用。最大的生产集群在150多台机器中拥有超过100 TB的数据。

答案 12 :(得分:1)

只是为了完成列表:还有Dreamcache。它与Memcached兼容(在协议方面,所以你可以使用为Memcached编写的任何客户端库),它只是更快。

答案 13 :(得分:1)

正如其他人所说,这完全取决于您的需求。我比较喜欢任何最适合我应用的东西。

我首先使用memcached来进行快速读/写访问。由于Java API我使用了SpyMemcached,因此可以使用非常简单的界面来编写和读取数据。由于内存泄漏(没有RAM),我被要求寻找另一种解决方案,我也无法正确扩展,只是为单个进程增加内存似乎不是一个好成就。

经过一些审查后,我看到了couchbase,它带有复制,集群,自动故障转移和社区版(MS Windows,MacOs,Linux)。对我来说最好的事情是,它的Java客户端也实现了SpyMemcached,所以我几乎没有别的办法来设置服务器并使用couchbase而不是memcached作为数据存储。优点?当然,我的数据现在是持久的,复制的和索引的。它附带一个webconsole,用于在erlang中为文档视图编写map reduce函数。

它支持Python,Ruby,.Net等,通过webconsole和客户端工具轻松配置。它运行稳定。通过一些测试,我能够以每秒10k的速度写入200-400字节长的记录。阅读表现虽然更高(都在本地测试)。做出决定会有很多乐趣。

答案 14 :(得分:1)

只有mongoDB,memchache和redis的经验。这是他们和couchDB之间的comparison

似乎mongoDB最受欢迎。它支持分片和复制,最终一致,在ruby(mongoid)中有很好的支持。它还具有比其他两个更丰富的功能集。所有mongo,redis和memchache都可以将键值存储在内存中,但redis似乎要快得多,根据this post,redis是2x写入,3倍读取比mongo快。它具有更好的数据结构设计和更“轻量化”。

我认为它们有不同的用法,mongoDB可能适用于大型数据集和文档存储,而memchache和redis更适合存储缓存或日志。