我需要在 Cassandra 中计算一堆“东西”。我需要每隔几秒左右增加约 100-200 个计数器。
但是我需要计算不同的“事物”。
为了不计算两次,我在 CF 中设置了一个键,程序在增加计数器之前读取该键,例如:
result = get cf[key];
if (result == NULL){
set cf[key][x] = 1;
incr counter_cf[key][x];
}
但是,此读取操作会大大降低集群的速度。我试图减少读取,使用几列,例如:
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+++ 计数器,有些可能超过 4 000 000 000。
我知道 Hyper_Log_Log 计数,但我也看不到将它与那么多计数器 (1M+++) 一起使用的简单方法。
目前我正在考虑将 Tokyo Cabinet 用作外部键/值存储,但如果该解决方案有效,将不会像 Cassandra 那样具有可扩展性。