【发布时间】:2015-02-17 09:58:48
【问题描述】:
我需要计算 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 那样具有可扩展性。
【问题讨论】: