我希望开始为一些辅助项目使用一个键/值存储(主要是作为一种学习体验),但是最近出现了很多,我不知道从哪里开始.只是从记忆中列出,我可以想到:
CouchDB的
MongoDB的
了Riak
Redis的
东京内阁
伯克利DB
卡桑德拉
MemcacheDB
而且我确信在搜索工作中还有更多内容.有了所有信息,很难在所有竞争对手之间找到可靠的比较.我的标准和问题是:
(最重要的)你推荐哪个,为什么?
哪一个最快?
哪一个最稳定?
哪一个最容易设置和安装?
哪些具有Python和/或Ruby的绑定?
编辑:
到目前为止看起来Redis是最好的解决方案,但这只是因为我得到了一个坚实的回应(来自ardsrk).我正在寻找像他这样的更多答案,因为他们指出了我有用的定量信息的方向.您使用哪个Key-Value商店,为什么?
编辑2:
如果有人有CouchDB,Riak或MongoDB的经验,我很乐意听到你的经历(如果你能对它们中的几个进行比较分析,那就更是如此)
你推荐哪个,为什么?
我推荐Redis.为什么?继续阅读!!
哪一个最快?
我不能说它是否是最快的.但Redis 很快.它很快,因为它将所有数据保存在RAM中.最近,添加了虚拟内存功能,但仍然所有密钥都保留在主内存中,只有很少使用的值被交换到磁盘.
哪一个最稳定?
同样,由于我没有其他键值商店的直接经验,我无法比较.但是,Redis正在被许多Web应用程序(如GitHub和Instagram等)用于生产.
哪一个最容易设置和安装?
Redis很容易设置.抓住源代码并在Linux机器上运行make install
.这会生成redis-server
二进制文件,您可以将其放在路径上并启动它.
redis-server
默认情况下绑定到端口6379.看看redis.conf
有更多配置和设置选项的来源.
哪些具有Python和/或Ruby的绑定?
Redis具有出色的Ruby和Python支持.
回应Xorlev的评论如下:Memcached只是一个简单的键值存储.Redis支持复杂的数据类型,如列表,集合和有序集,同时为这些数据类型提供简单的接口.
make 32bit
即使在64位机器上,也可以使所有指针的大小仅为32位.这可以在RAM少于4GB的计算机上节省大量内存.
您需要了解现代NoSQL现象的含义.
它不是关键值存储.它们已经存在了数十年(例如BerkeleyDB).为什么现在大惊小怪?
它不是关于花哨的文档或面向对象的模式,而是克服"阻抗不匹配".这些功能的支持者多年来一直在吹嘘他们,他们无处可去.
它只是解决3个技术问题:自动(对于维护者)和透明(对于应用程序开发人员)故障转移,分片和复制.因此,你应该忽略任何在这方面无法提供的时尚产品.这些包括Redis,MongoDB,CouchDB等.并专注于真正的分布式解决方案,如cassandra,riak等.
否则你将失去sql给你的所有好东西(adhoc查询,你的老板的Crystal Reports,第三方工具和库)并得不到任何回报.
在今年的PyCon上,Reddit的Jeremy Edberg发表了演讲:
http://pycon.blip.tv/file/3257303/
他说,Reddit使用PostGres作为键值存储,可能是一个简单的2列表; 根据他的讲话,它的基准测试速度比他们尝试过的任何其他键值商店都要快.当然,它非常成熟.
最终,OverClocked是对的; 您的用例决定了最好的商店.但是RDMBS长期以来(ab)被用作键值存储,它们也可以非常快.
它们都有不同的功能.并且不要忘记在每次发布之前LinkedIn实际使用/测试的Project Voldemort.
这很难比较.你必须问问自己你需要什么:例如,你想要分区吗?如果是这样,那么其中一些,如CouchDB,将不支持它.你想要擦除编码吗?然后大多数人都没有.等等.
Berkeley DB是一个非常基础的低级存储引擎,也许可以免于讨论.在它之上构建了几个键值系统,以提供复制,版本控制,编码等附加功能.
此外,您的应用程序需要什么?一些解决方案包含可能不必要的复杂性.例如,如果您只存储不会更改的静态数据,则可以将它们存储在数据的SHA-1内容哈希下(即使用内容哈希作为键).在这种情况下,您不必担心新鲜度,同步,版本控制,并且可以删除许多复杂性.
我一直在使用MongoDB,它有一件事使它非常适合我的应用程序,能够直接在数据库中存储复杂的地图/列表.我有一个大的Map,其中每个值都是一个列表,我不需要做任何特殊的事情只是为了编写和检索它而不知道所有不同的键和列表值.我对其他选项了解不多,但速度和能力使Mongo非常适合我的应用程序.此外,Java驱动程序使用起来非常简单.
您必须做出的一个区别是您将使用数据库?不要因为时髦而跳板.你需要一个钥匙价值商店吗?或者你需要一个基于文件的商店?你的内存占用要求是多少?在小型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/
我注意到每个人都在用memcachedb混淆memcached.它们是两个不同的系统.操作员询问了memcachedb.
memcached是内存存储.memcachedb使用Berkeley DB作为其数据存储区.
我只有Berkeley DB的经验,所以我会提到我喜欢的东西.
它很快
它非常成熟稳定
它有出色的文档
它具有开箱即用的C,C++,Java和C#绑定.其他语言绑定可用.我相信Python附带绑定作为其"电池"的一部分.
我遇到的唯一缺点是C#绑定是新的,似乎并不支持每个功能.