Cassandra 卡桑德拉时间表模式

Cassandra 卡桑德拉时间表模式,cassandra,phpcassa,Cassandra,Phpcassa,我想为我的时间线设计一个Cassandra模式: 我有用户,每个用户都有一个时间轴,每个时间轴值都是一个字符串 因为每个用户都有一个字符串的时间线,所以我需要尽快从末尾填充每个用户的时间线 我估计每个用户将有10000个时间线对象,我将有10000个用户,因此我将轻松地拥有100000000个对象。这意味着速度非常重要 这是我用过的代码,对吗 $pool = new ConnectionPool('Keyspace', array('127.0.0.1')); $cf = new ColumnF

我想为我的时间线设计一个Cassandra模式:

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

因为每个用户都有一个字符串的时间线,所以我需要尽快从末尾填充每个用户的时间线

我估计每个用户将有10000个时间线对象,我将有10000个用户,因此我将轻松地拥有100000000个对象。这意味着速度非常重要

这是我用过的代码,对吗

$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);

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

如果希望更频繁地显示最近的项目(例如,如果希望为用户显示十个最近的时间线项目),则可能还需要使用反向比较器。使用反向比较器意味着Cassandra将以相反的顺序存储行,首先存储最新的项。这意味着卡桑德拉最容易找到最新的物品,你会得到很好的表现

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