2013-02-27 59 views
2

我想设计一个卡桑德拉模式为我的时间表:卡桑德拉架构时间表

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

由于每个用户都有一个字符串时间轴,我需要尽快填充每个用户的时间轴。

我估计每个用户都有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); 

回答

2

您可以使用​​作为列键,就可以确保你得到的唯一密钥,即使你有多个应用程序服务器在同一时间写入数据(虽然不太可能两个应用程序服务器可以在完全相同的插入一些microtime值),并且它们将按照时间顺序排序,就像常规时间戳一样。

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

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

+0

嗨,谢谢你的回答,我如何分区行? – Ata 2013-02-28 10:43:44

+0

嗨,你能看到thi链接并说我的问题:http://pastebin.com/fwJksrat – Ata 2013-02-28 11:05:56