我对Couchbase数据库非常陌生,并要求在我们的项目中构建排行榜解决方案。理想情况下,它应该像内存排序集一样工作:对于每个添加的项,O(log(N))和O(log(N)+ M),其中N为排序集中的元素数,M为返回的元素数。
Couchbase是否有任何方法可以满足此要求?所有沙发床查询均取决于默认情况下在后台请求后重建的索引(视图)。使用Stale.False选项非常耗时。用于N1QL一致性的GSI还取决于使用Stale参数。是否可以通过某种结构在CouchBase键/值对中插入某种方式,例如Redis中的Sorted set并能够立即获取更新的数据?
假设我们有用户文档:
{
"id": "44-44-45"
"name": "John_Canada",
"country": "Canada",
"city": "Ottawa"
"levelScore": 2147483641,
"type": "user"
}
[要求是根据levelScore构建实时排行榜(这意味着如果某人更改了属性,它应该立即对其他人可见),并且将来能够按国家,城市或其他用户属性进行过滤。在Redis中,可以这样完成:
ZADD "leaderboard" 10 "homer"
ZADD "leaderboard" 25 "marge"
ZADD "leaderboard" 55 "bart"
GETTING A RANKED LIST for top10 players:
ZREVRANGE "leaderboard" 0 10
1) "frank grimes"
2) "lisa"
3) "bart"
Use ZRANK "leaderboard" "lise"
2
在Couchbase视图中,值始终按键排序。即使我们将levelScore用作视图键,我们仍然依靠索引重建所需的时间来获得数据一致性(例如在Redis Sorted sets示例中),并且无法满足项目要求。
可能CouchBase更适合存储文档,如果我们需要按某些值对结构进行排序,则应将类似于Redis的内容添加到技术堆栈中。我对么?
AFAIK,由于所有索引最终都是一致的,因此无法立即在沙发上更新索引。如前所述,您可以在查询请求中指定一致性选项,这些选项可以等待索引赶上挂起的突变。除非您有大量待处理的写入,否则它应该不会很慢。如果是这种情况,您可以扩展索引节点。
至于索引本身,您应该按desc顺序按分数字段进行索引,否则,默认顺序为asc,这样索引将无法有效地用于desc查询。