我对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/

10-15 23:40