在Cassandra数据模型中同步

时间:2015-06-14 16:54:57

标签: cassandra nosql

我正在创建社交网络应用,并且我已经将非规范化数据创建为包含所有字段的帖子列表,以便仅使用一个查询。问题是,如果每个帖子都有计数器(喜欢,分享,评论),每次更新计数器时如何在时间线中同步所有帖子记录?或者我应该只在时间轴中有id,所以我只更新一个帖子表,时间线查询由两个查询而不是一个查询组成?

谢谢你

2 个答案:

答案 0 :(得分:2)

我一直在考虑类似的任务,这就是我的想法:

  1. 必须同步时间轴数据 。仅在时间轴中存储ID并在帖子中查找是一个坏主意:您不希望进行20次查找以生成单个时间轴页面。此外,它不会扩展:一旦您向服务器架构添加了更多节点,不同的帖子就可以存储在不同的节点上,这会使查询变慢。

  2. 最好是使用counter数据类型来存储计数器。这需要创建一个单独的仅计数器表。 See here了解更多信息。据我所知,使用此类型可以提高可扩展性(更新)。

  3. 如果写入时间轴时每个新的like / comment / share变得过于昂贵,则可以使用内存缓存:计数器存储在缓存中,并在生成时间线时查找。然后可以延迟时间轴存储值更新,并将其用作不在高速缓存中的计数器的回退。我认为,单个请求从RAM中查找20次是可以的。

  4. 如果计算条目视图,

    #3会很有用。由于您不计算观看次数,我认为更新每个喜欢/评论/分享的时间表都是正常的。

答案 1 :(得分:0)

您可以存储单个帖子,然后使用单个范围查询检索所有帖子 - 这样您就可以使用计数器数据轻松更新各个帖子,但您仍然可以检索时间轴中的所有帖子使用一个查询。有关在气象站使用温度记录的示例,请参阅spec

CREATE TABLE posts (
  post_id text,
  post_time timestamp,
  post text,
  timeline_id set<text>,
  comments_count counter,
  PRIMARY KEY (post_id,post_time)
);
CREATE INDEX timeline_id_index ON posts (timeline_id);
SELECT post, comments_count
FROM posts
WHERE timeline_id CONTAINS ’foo’
AND post_time > ’2013-04-03 07:01:00′
AND post_time < ’2020-04-03 07:04:00′;
UPDATE posts
SET comments_count = comments_count + 1
WHERE post_id='bar';