首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cassandra非重复计数

Cassandra非重复计数
EN

Stack Overflow用户
提问于 2013-03-13 16:09:03
回答 1查看 2.9K关注 0票数 5

我要数一堆卡桑德拉的“东西”。我需要每隔几秒左右增加大约100-200个计数器。

然而,我需要计算不同的“东西”。

代码语言:javascript
复制
result = get cf[key];
if (result == NULL){
    set          cf[key][x] = 1;
    incr counter_cf[key][x];
}

然而,这种读操作会大大降低集群的速度。我试图减少读取,使用了几个列,例如:

代码语言:javascript
复制
result = get cf[key];

if (result[key1]){
    set          cf[key1][x] = 1;
    incr counter_cf[key1][x];
}

if (result[key2]){
    set          cf[key2][x] = 1;
    incr counter_cf[key2][x];
}

//etc....

然后,我将200+的读操作减少到大约5-6次,但这仍然会降低集群的速度。

我不需要精确的计数,但我不能使用位掩码,也不能使用布隆过滤器,因为将会有1M+++计数器,有些计数器可能会超过4000000000。

我知道Hyper_Log_Log计数,但我也看不出有那么多计数器(1M+++)来使用它的简单方法。

目前,我正在考虑使用东京橱柜作为外部键/值存储,但如果这个解决方案有效,将不会像Cassandra那样具有可扩展性。

EN

回答 1

Stack Overflow用户

发布于 2013-03-13 16:19:48

当不同值的数量很大时,使用Cassandra进行不同的计数并不理想。任何时候,如果你需要在写之前进行读操作,你应该问问自己,Cassandra是否是正确的选择。

如果不同项的数量较少,则可以将它们存储为列键并进行计数。计数不是免费的,Cassandra仍然需要组装行来计算列数,但如果不同值的数量在数千左右,可能就没问题了。我假设你已经考虑过这个选项,而且它对你来说是不可行的,我只是想我应该提一下。

人们通常这样做的方式是将HLL或Bloom过滤器放在内存中,然后定期将它们刷新到Cassandra。也就是说,不在Cassandra中进行实际操作,只是为了持久化而使用它。这是一个复杂的系统,但有一个简单的方法来计算不同的值,特别是如果你有大量的计数器。

即使你切换到其他的东西,例如你可以对值进行位操作的东西,你仍然需要防止竞争条件。我建议你只需咬紧牙关,在内存中完成所有的计算。按键对处理节点上的增量操作进行分片,并在这些节点上的内存中保留整个计数器状态(包括增量状态和不同状态)。定期将状态刷新到Cassandra,并在执行时确认增量操作。当节点对其内存中没有的键执行递增操作时,它会从Cassandra加载该状态(如果数据库中没有任何内容,则会创建一个新状态)。如果节点崩溃,操作还没有被确认并将被重新提交(您需要在节点前面有一个良好的消息队列来处理这一点)。由于您对增量操作进行了分片,因此可以确保计数器状态只被一个节点触及。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15379926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档