我对Couchbase数据库很陌生,并且需要在我们的项目中构建排行榜解决方案。理想情况下,它应该像内存排序集一样工作:添加的每个项目的O(log(N))和O(log(N)+ M),其中N是排序集合中的元素数量,M是返回的元素数量。
有没有办法通过Couchbase达到这个要求?所有couchbase查询都依赖于索引(视图),这些索引在默认情况下在后台重建请求。使用Stale.False选项非常耗时。用于N1QL一致性的GSI还取决于使用Stale参数。是否有任何方法可以在Redis中的Sorted set等某些结构中插入CouchBase键/值对,并且能够立即获得更新数据?
假设我们有用户文档:
{
"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排序集示例中)并且无法满足项目要求。
可能CouchBase更适合存储文档,如果我们需要使用某些值结构进行排序,那么类似于Redis的东西应该添加到技术堆栈中。我对么?
答案 0 :(得分:0)
AFAIK无法通过沙发床立即更新索引,因为所有索引最终都是一致的。如前所述,您可以在查询请求中指定一致性选项,这些选项可以等待索引赶上挂起的突变。除非您有大量待处理的写入,否则它应该不会很慢。在这种情况下,您可以扩展索引节点。
对于索引本身,应按desc顺序在score字段中进行索引,否则,默认顺序为asc,则该索引将无法有效地用于desc查询。