我想为我的时间轴设计一个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);
答案 0 :(得分:2)
您可以使用TimeUUID
作为列密钥,即使您有多个应用程序服务器同时写入数据,它们也可以确保您获得唯一密钥(尽管两个应用程序服务器不太可能插入完全相同的内容同一用户的microtime
值,并且它们将按照时间顺序排序,就像常规时间戳一样。
如果您希望更频繁地显示最新项目(例如,如果要显示用户的十个最新时间轴项目),您可能还需要使用反向比较器。使用反向比较器意味着Cassandra将以相反的顺序存储行,最新的项目首先存储。这意味着最近的项目对于Cassandra来说是最容易找到的,你将获得非常好的表现。
要考虑的另一件事是你的行有多宽。如果您不希望时间轴超过一百万左右的项目(具体取决于每个项目中将有多少数据),那么每个用户只有一行可能会有效(但同样请尝试使用反向比较器,否则读取最近的项目将会很慢)。如果您希望用户生成数百万个时间轴项目,您需要考虑将用户的时间轴分成多行的方法。每个用户每月或每天可能有一行。它需要是确定性的,这样你就不必进行查询来查找你应该读取的行 - 并且由于你的列按时排序,使用时间分区成多行是很自然的。