2011-09-29 52 views
6

我已经有了MongoDB,CouchDB,Redis,东京内阁和其他NoSQL数据库的经验。最近我偶然发现了Riak,这对我来说很有意思。为了开始使用它,我决定在NoSQL世界中编写一个小的推特克隆,即“hello world”。为了获得完整的克隆,有必要按时间顺序排列推文。在阅读Riak文档后,我发现Map-Reduce是这份工作的正确工具。在我的开发环境中,它工作得很好,但生产性能如何,有数百个并行查询?有没有其他的,也许更快的方法来排序数据,或者有可能以有序的形式存储数据(如Cassandra)?如何在Riak中对数据进行排序/订购?

更新: 我想我已经找到了另一个解决这个问题 - 一个简单的链表。因此,一种可能的实现方式可能是,每个用户都可以获得他/她自己的“时间轴桶”,其中存储了数据本身的链接(微博分别存储在“微博”桶中)。如你所知,这个时间轴桶必须包含一个名为“first”的键,它链接到最新的时间轴对象,并且是列表的起点。要在时间轴中插入新的推文,只需在时间轴栏中插入一个新项目,将此新项目的“下一个”链接设置为“第一个”项目,然后将新项目设置为“第一个”。

简而言之:插入一个项目,你会在一个链表做...

与叽叽喳喳,个人时间轴只抱显示给用户20个鸣叫。要收到最后20条推文,只需要2条查询。为了加快速度,第一个查询使用Riak的链接行走功能获取最新的20个对象,标记为“next”。最后,第二个和最后一个查询使用第一个查询计算的键来接收推文本身(使用map/reduce)。

要删除用户的鸣叫你刚刚取消关注,我会用了Riak 1.0的二级索引的能力来接收相关的时间表对象/鸣叫。

+0

由于Riak 1.4排序和分页可用于辅助索引:http://basho.com/basho-announces-availability-of-riak-1-4/ – nacmartin

回答

2

无法在Riak中以有序形式存储数据,而无需重写Riak核心的部分内容。数据大致以桶+键顺序存储。实际顺序取决于您用于Riak的后端存储机制。

Riak 1.0有一些功能可能对您也有帮助。支持二级索引以及Map Reduce操作的改进 - 特别是,它们在高度并发的情况下表现更好。

Alexander Siculars写了一篇关于Pagination with Riak的文章。它很好地概述了这个问题。 Yammer还广泛使用Riak和他们的两名工程师组织了关于Riak at Yammer的演示文稿。它没有涉及很多实现细节,但是你可以学到很多关于他们如何设计他们的解决方案。

结合二级索引的查询和地图降低使得有可能很容易解决您的问题。

0

耶利米说,这是不可能存放在有序的数据,但你仍然可以把它利用二级指标和地图返回排序结果/减少。如上所述,问题在于您无法以有序的方式有效限制查询。

下面是一个使用范围查询列出所有的键,然后使用内置的功能* riak_kv_mapreduce * ::对它们进行排序的例子

{ok, Pid} = riakc_pb_socket:start_link("127.0.0.1", 8087), 
riakc_pb_socket:mapred(Pid            
    , {index, colonel_riak:bucket(context), <<"$key">>, <<0>>, <<255>>}  
    , [{reduce, {modfun, riak_kv_mapreduce, reduce_sort}, none, true}]) 

可以使用的功能模块lists在二郎山或使用原生的JavaScript排序功能。可以通过erlang中的lists:reverse/1来完成排序。

相关问题