在 CassandraDB 中,使用有序列族。我知道你可以得到切片,但你能得到位置。例如,在这个数据模型中,我保存这样的分数:
"Scores":
{
"1000": "bob, lucas",
"900": "tim"
"800": "mario"
}
知道用户的得分为“900”并且他的昵称是“tim”,是否有可能知道他位于有序列族的第 2 位?
Cassandra 没有开箱即用地提供此功能,但您可以使用三个单独的 CF 自己实现此功能。考虑这种情况:
"Scores":
{
"1000": "bob, lucas"
"900": "tim"
"800": "mario"
}
"PlayerScores":
{
"bob": "1000"
"lucas": "1000"
"tim": "900"
"mario": "800"
}
"ScoreTotals":
{
"1000":
{
"1000":2
}
"900":
{
"900":1
}
"800":
{
"800":1
}
}
ScoreTotals CF 将与计数器列一起使用,以在用户每次达到该分数时增加/减少值。如果您的分数有额外的粒度(例如 910 与偶数 900),您可以将键视为存储桶,列名作为特定分数。PlayerScores 显然存在,因此您可以查询玩家的分数。
然后,您可以通过简单地将所有得分高于玩家得分的总和来确定排名。由于分数存储在列名中,因此您可以使用标准切片查询来获取您的范围,而无需使用保留顺序的分区器(这有一些负面影响)。