使用Couchbase构建高分表(排行榜)

问题描述 投票:2回答:1

我对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的内容添加到技术堆栈中。我对么?

redis couchbase sortedset
1个回答
0
投票

AFAIK,由于所有索引最终都是一致的,因此无法立即在沙发上更新索引。如前所述,您可以在查询请求中指定一致性选项,这些选项可以等待索引赶上挂起的突变。除非您有大量待处理的写入,否则它应该不会很慢。如果是这种情况,您可以扩展索引节点。

至于索引本身,您应该按desc顺序按分数字段进行索引,否则,默认顺序为asc,这样索引将无法有效地用于desc查询。

© www.soinside.com 2019 - 2024. All rights reserved.