我对Couchbase数据库很陌生,并且要求在我们的项目中构建排行榜解决方案。理想情况下,它应该像内存排序集一样工作:对于每个添加的项,O(log(N))和O(log(N)+ M),其中N为排序集中的元素数,M为返回的元素数。
Couchbase是否有任何方法可以满足此要求?所有沙发床查询均取决于默认情况下在后台请求后重建的索引( View )。使用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 View 中,值始终按键排序。即使我们将levelScore用作 View 键,我们仍然依靠索引重建所需的时间来获得数据一致性(例如Redis Sorted sets示例中的那样),并且无法满足项目要求。
CouchBase可能更适合存储文档,如果我们需要使用按某些值进行排序的结构,则应将类似于Redis的内容添加到技术堆栈中。我对么?
最佳答案
由于所有索引最终都是一致的,因此AFAIK无法立即在沙发上更新索引。如前所述,您可以在查询请求中指定一致性选项,这些选项可以等待索引赶上挂起的突变。除非您有大量待处理的写入,否则它应该不会很慢。在这种情况下,您可以扩展 inode 。
至于索引本身,则应按desc顺序按score字段进行索引,否则,默认顺序为asc,这样索引将无法有效地用于desc查询。
关于redis - 使用Couchbase构建高分表(排行榜),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33939535/