2011-09-29 56 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來完成排序。

相關問題