时间轴的Cassandra架构

时间:2013-02-27 21:04:51

标签: cassandra phpcassa

我想为我的时间轴设计一个Cassandra架构:

我有用户,每个用户都有一个时间轴,每个时间轴值都是一个字符串。

由于每个用户都有字符串的时间表,我需要尽快从最后填充每个用户的时间表。

我估计每个用户将拥有10000个时间轴对象,并且我将拥有10000个用户,因此我将轻松拥有100,000,000个对象。这意味着速度非常重要。

这是我用过的代码,是不是?

$pool = new ConnectionPool('Keyspace', array('127.0.0.1'));
$cf = new ColumnFamily($pool, 'timeline');

// Insert a few records
$columns = array(microtime() => "event1", microtime() => "event2", microtime() => "event3", microtime() => "event4" );
$cf->insert('usera', $columns);

1 个答案:

答案 0 :(得分:2)

您可以使用TimeUUID作为列密钥,即使您有多个应用程序服务器同时写入数据,它们也可以确保您获得唯一密钥(尽管两个应用程序服务器不太可能插入完全相同的内容同一用户的microtime值,并且它们将按照时间顺序排序,就像常规时间戳一样。

如果您希望更频繁地显示最新项目(例如,如果要显示用户的十个最新时间轴项目),您可能还需要使用反向比较器。使用反向比较器意味着Cassandra将以相反的顺序存储行,最新的项目首先存储。这意味着最近的项目对于Cassandra来说是最容易找到的,你将获得非常好的表现。

要考虑的另一件事是你的行有多宽。如果您不希望时间轴超过一百万左右的项目(具体取决于每个项目中将有多少数据),那么每个用户只有一行可能会有效(但同样请尝试使用反向比较器,否则读取最近的项目将会很慢)。如果您希望用户生成数百万个时间轴项目,您需要考虑将用户的时间轴分成多行的方法。每个用户每月或每天可能有一行。它需要是确定性的,这样你就不必进行查询来查找你应该读取的行 - 并且由于你的列按时排序,使用时间分区成多行是很自然的。