CouchBase与Memcached混合,失去了大多数CouchDB的哲学和功能?

时间:2012-02-27 09:52:21

标签: java javascript python erlang couchdb

截至目前,我使用较新版 CouchBase 的唯一方法是通过 memcached Client 。我使用 Erlang 作为编程语言,因此我抓住了自己的 Erlang Memcached Client 。我注意到,当发送和接收来自 memcached 的数据时,此客户端使用erlang:term_to_binary/1 and erlang:binary_to_term/1将erlang术语(包括键和值)串行化并反序列化。

在设置CouchBase时,我们被要求选择memcached存储桶或CouchBase存储桶(vbuckets)。现在,我选择了CouchBase(因为我需要持久性)。我开始使用erlang memcached客户端与设置进行交互,没关系,我保存了erlang术语并从数据库中获取了erlang术语。然而,问题从这里开始:

1。由于数据序列化,对象作为附件被接收。即使作为JSON从Erlang发送,它们也作为二进制数据发送,这对CouchBase(或Memcached?)没有任何意义。

{ 
    "_id": "mykey",
    "_rev": "1-000010fb1a2b02ef0000000d59960000",
    "$flags": 38489, 
    "$expiration": 0,
    "$att_reason": "invalid_json",
    "_attachments": {
    "value": {
                "content_type": "application/content-stream",
                "revpos": 2,
                "digest": "md5-n3mJhf2kKVQtkIunIbCJZQ==",
                "length": 13,
                "stub": true
            }
        }
    }

2 。因此,无法搜索此数据,通过 CouchDB views 进行操作。获取数据的唯一方法是“Key”,但嵌套的对象可能是。使用原始的Couch DB,我们可以编写 Advanced Views, Map reduce 来搜索和操作数据库e.t.c中的JSON数据。因此,我们无法使用Couch Base清楚地使用像 Couch Apps Design Documents 这样的东西,因为我们使用Couch DB,因为,这些功能适用于Couch内的JSON数据处理。

问题
1。我知道CouchBase正在寻找与CouchDB不同的方法,但是,作为一名开发人员,我觉得很多东西都被我们带走了。没有更多Couch应用程序,设计文档,视图,e.t.c?
2。也许,我在这里遇到了一些问题,有人可以告诉我如何使用Couch Base完成所有这些操作,就像我使用原装Couch DB一样吗?3。除了Erlang memcached客户端之外,还有其他方法可以在Couch Base 1.8及更高版本中插入,读取或更新数据(使用erlang)吗?这是因为,存在数据序列化,使得该数据对于同一项目中的其他技术无用,因为它们可能无法解码Erlang数据结构。在一个多语言项目中,我们有PHP Developers,C ++,Erlang,Ruby e.t.c.使用相同的Couch Base实例(数据库),通过数据序列化,我们如何访问和理解所有技术中的数据?

有人协助指出从CouchDB到Couch Base的变化,解释为什么新的Couch Base与Memcached如此紧密相关,我们必须使用memcached客户端与CouchBase对话。另外,如果还有另一个Erlang-to-CouchBase SDK可以帮助我对Couch Base说JSON(而不是序列化数据),我希望能够把它放在它上面。

**编辑**
假设以下内容:CouchBase x86_64 1.8.0和Erlang OTP R15B。我需要在Couch Base中使用JSON数据,这样在大型多语言项目中,我们的应用程序可以运行相同的数据集而不会出现序列化挑战。谢谢

3 个答案:

答案 0 :(得分:1)

CouchDB与Couchbase之间存在很大差异,如果我是对的,Couchbase使用CouchDB来存储数据,但不提供/呈现CouchDB的视图和其他很好的功能。

我从Couchbase网站和Couchbase服务器文档中浏览了不同的API(ruby,php),但我没有找到任何关于view或map-reduce的信息。 见doc:http://www.couchbase.com/docs/couchbase-manual-1.8.pdf

Couchbase看起来更像是一个带有由CouchDB支持的持久层的内存缓存服务器,可能它不适合您的需求。您可以存储的数据可以是从int到序列化的任何内容,例如JSON,但在这种情况下,您必须在所有目的上反序列化它。

为什么使用Couchbase而不是CouchDB?我没有旧Couchbase版本的经验,但我知道这些名称,即使它们非常相似,也指的是不同的应用程序,如果它真的是你正在思考的那个,它可能值得进一步研究。

修改 有趣的链接:http://damienkatz.net/2012/01/the_future_of_couchdb.html也阅读了评论,内容中有很多有趣的内容。

从评论中我了解到Damien Katz现在正致力于这个名为Couchbase的新项目,但它不是CouchDB的最后一个版本,而只是另一个NoSQL数据库。

因此,如果你习惯了CouchDB,你可以使用最新版本的CouchDB。或者,如果您想考虑切换到Couchbase,请查看2.0的功能,路线图等,并调查它是否真的符合您的需求。

答案 1 :(得分:1)

Couchbase和CouchDB之间的关系详见:http://www.couchbase.com/couchdb

简而言之,Couchbase针对主要的NoSQL用例:必须为最终用户交互提供的大数据。用于广告定位的会话存储,用于快速增长的社交游戏的游戏数据存储等。或者任何用户需求可能会出乎意料地增长。

Couchbase是水平可扩展的,而CouchDB则不是。为了获得Couchbase提供的可扩展性和速度,我们不得不削减CouchDB中人们喜欢的一些功能。这是一组不同的权衡,但共同点是JSON和地图缩减索引模型。

答案 2 :(得分:0)

关于西普里安,除了“不要使用Couchbase”之外,你的问题确实有一个真正的答案。

Memcache允许比CouchDB更多的数据类型。具体来说,您可以Memcache一个空字符串,字符串“{”,字符串“0”或字符串“{}”。只有最后一个是可以用作CouchDB文档的有效JSON对象。 AFAIK Couchbase的工作方式是,如果您设置或添加的字符串是有效CouchDB文档的JSON表示形式,则将其存储为CouchDB文档,否则将其存储为附件。 [z这是一个我不同意的设计决策(他们可能刚刚在CouchDB文档中插入了一个$value键),但考虑到你可以传递非常大的对象,实际的附件,它是有意义的协议接口。]无论如何,"$att_reason": "invalid_json"是你发现这种情况的暗示。

即将推出的Couchbase 2.0版本现已进入开发者预览版,几乎可以显示所有CouchDB功能,但Couch应用程序除外(如果您使用的是Erlang则无关紧要)。因此,如果你想使用它,你需要通过Memcache接口传递对象的JSON,但请注意,然后你丢失了Memcache的原子快捷键(你需要进行比较和交换,这需要一个额外的网络跳)。