我已经使用过 MongoDB、CouchDB、Redis、Tokyo Cabinet 和其他 NoSQL 数据库。最近我偶然发现了 Riak,我觉得它很有趣。为了开始使用它,我决定编写一个小型 Twitter 克隆,即 NoSQL World 中的“hello world”。要获得一个完全可用的克隆,有必要按时间顺序对推文进行排序。在阅读了 Riak 文档后,我发现 Map-Reduce 是完成这项工作的正确工具。在我的开发环境中它工作得很好,但是在生产环境中,有数百个并行查询的性能如何?是否有其他可能更快的数据排序方法,或者是否可以以有序的形式存储数据(如 Cassandra)?
我想我已经找到了解决这个问题的另一种方法——一个简单的链表。因此,一种可能的实现可能是,每个用户都有他/她自己的“时间线存储桶”,其中存储了指向推文数据本身的链接(推文单独存储在“推文”存储桶中)。如您所知,这个时间线桶必须包含一个名为“first”的键,它链接到最新的时间线对象并且是列表的起点。要在时间线中插入一条新推文,只需在时间线桶中插入一个新项目,将此新项目的“下一个”链接设置为“第一个”项目,然后将新项目设置为“第一个”。
简而言之:像在链表中一样插入一个项目......
与 Twitter 一样,个人时间线仅包含向用户显示的 20 条推文。要接收最后 20 条推文,只需 2 次查询。为了加快速度,第一个查询使用 Riak 的链接遍历功能来获取最新的 20 个对象,标记为“下一个”。最后,第二个也是最后一个查询使用第一个查询计算的键来接收推文本身(使用 map/reduce)。
要删除您刚刚取消关注的用户的推文,我会使用 Riak 1.0 的二级索引功能来接收相关的时间线对象/推文。