2

我想为我的时间线设计一个 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);
4

1 回答 1

2

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

如果您希望更频繁地显示最近的项目(例如,如果您想为用户显示十个最近的时间线项目),您可能还需要使用反向比较器。使用反向比较器意味着 Cassandra 将以相反的顺序存储行,最近的项目在前。这意味着 Cassandra 最容易找到最新的项目,并且您将获得非常好的性能。

要考虑的另一件事是您的行将变得多宽。如果您不希望时间线会超过一百万个左右的项目(确切的数量取决于每个项目中有多少数据),那么每个用户只有一行可能会起作用(但再次尝试使用反向比较器,否则读取最近的项目会很慢)。如果您希望您的用户生成数以百万计的时间线项目,您需要想办法将用户的时间线分成许多行。也许每个用户每月或每天一行。它必须是确定性的,这样您就不必进行查询来查找您应该阅读的哪一行——而且由于您的列是按时排序的,因此使用时间来划分为多行是很自然的。

于 2013-02-28T07:28:32.853 回答