1

我想将这个复杂的文档结构迁移到 cassandra:

foo = {
  1: {
    :some => :data,
  },
  2: {
    :some => :data
  },

  ...

  99 :{
    :some => :data
  }

  'seen' => {1 => 1347682901, 2 => 1347682801}
}

问题:它必须在~<5 毫秒内作为一行/记录可检索(可读)。

到目前为止,我正在序列化数据,但这并不是最佳选择,因为我总是需要更新整个数据。

另一件事是,我想将 cassandras ttl 功能用于“看到”哈希中的值。

关于子结构(1..n)如何在 cassandra 中工作的任何想法,因为它们是完全动态的,但应该可以通过一个查询全部读取?

4

1 回答 1

3

创建一个列族。并存储如下

rowKey = foo

columnName           Value
-----------------------------------
1               {:some => :data,..}
2               {:some => :data,..}
...
...
99              {:some => :data,..}
seen            {1 => 1347682901, 2 => 1347682801}

1,2,...“看到”都是动态的。

如果您担心只更新其中一列。这与在列族中插入新列的方式相同。见这里Cassandra 更新专栏

$column_family->insert('foo', array('42' => '{:some => :newdata,..}'));

我还没有使用TTL。但这很简单。在 Cassandra 0.7+ 中的 Expiring Columns 中查看非常简单的方法来实现这一点


更新

Q1。只是为了我的理解:您是否建议创建 99 列?或者是否有可能保持这种动态?

与 RDBMS 不同,列族具有灵活的结构。动态创建的行键可以有无限数量的列。例如:

myCcolumnFamily{
   "rowKey1": {
      "attr1": "some_values",
      "attr2": "other_value",
      "seen" : 823648223
   },
   "rowKey2": {
      "attr1": "some_values",
      "attr3": "other_value1",
      "attr5": "other_value2",
      "attr7": "other_value3",
      "attr9": "other_value4",
      "seen" : 823648223
   },
   "rowKey3": {
      "name"   : "naishe",
      "log"    : "s3://bucket42.aws.com/naishe/logs",
      "status" : "UNKNOWN",
      "place"  : "Varanasi"
   }
}

这是一篇老文章,值得一读:WTF is a SuperColumn?这是一个典型的报价,可以回答您的查询(强调我的):

我想指出的一件事是在这个[ColumnFamily]级别上没有强制执行模式。行没有它们包含的预定义列列表。在上面的示例中,您会看到键为“ieure”的行包含名称为“age”和“gender”的列,而键“phatduckk”标识的行没有。它是 100% 灵活的:一个行可能有 1,989 个列,而另一个有 2 个。一个行可能有一个名为“foo”的列,而其他行都没有。这是 Cassandra 的无模式方面。

. . . .

Q2。你建议序列化子结构?

由你决定。如果您不想序列化,您可能应该使用 SuperColumn。我的经验法则是这样的。如果列中的值表示不能独立访问其部分的单元,请使用列。(这意味着序列化值)。如果列具有可能需要直接访问的零散子部分,请使用 SuperColumn。

于 2012-09-15T05:15:10.963 回答