【问题标题】:Sync in Cassandra data model在 Cassandra 数据模型中同步
【发布时间】:2023-04-10 13:24:01
【问题描述】:

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

谢谢你

【问题讨论】:

    标签: cassandra nosql


    【解决方案1】:

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

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

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

    3. 如果将每个新的点赞/评论/分享写入时间线变得过于昂贵,则可以使用内存缓存:计数器存储在缓存中,并在生成时间线时查找。然后可以延迟时间线存储值更新,并作为不在缓存中的计数器的后备。我认为从 RAM 中查找 20 次单个请求是可以的。

    如果您计算条目浏览量,#3 会很有用。由于您不计算观看次数,因此我认为更新每个点赞/评论/分享的时间线是可以的。

    【讨论】:

    • 谢谢。它类似于我的解决方案,我的疑问是关于每个喜欢/评论/分享的计数器的更新。此外,内存缓存是我的想法之一,但在内存中缓存所有帖子的计数器对于许多用户来说需要太多的内存......你不觉得吗?
    • 您不需要将所有帖子的计数器存储在缓存中。通常,它只是时间线的一部分经常更改 - 通常是最新条目。例如,您可以只存储小于 2 天的物品的计数器。并且数字不会占用太多空间。存储 10,000 个 24 字节元组需要 240KB。
    • 好的,这是真的。将计数器存储在缓存(Redis ...)中的最佳方法是什么?如果我只存储早于 2 天的项目,如果用户在他的时间线中看到早于 2 天的项目,我应该从 Cassandra 获得计数器,不是吗?
    • 您需要通过尝试选择最佳的存储方式。最基本的方法 - 将 post_id 映射到计数器 - 我认为会这样做。对,超过 2 天的物品的计数器可以来自 Cassandra 的时间线。
    • 我认为这个答案是个好主意,redis可以在这种情况下提供帮助。
    【解决方案2】:

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

    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';
    

    【讨论】:

    • 最后一条语句,timeline的数据模型是什么?谢谢
    • @user3443051 那是“帖子” - 我已经更新了我的答案
    • 我使用推送方法,所以每篇文章都会插入所有关注者的时间线。只使用一个表帖子对此有好处吗?
    • @user3443051 我的错,我认为这是每个时间线的一个帖子。查看我更新的答案 - 如果每个帖子有多个时间线,那么您可以使用set&lt;text&gt;(或set&lt;uuid&gt; 或其他)作为timeline_id,然后在您的查询中使用CONTAINS 以检索具有给定的所有帖子时间线
    • 你认为 set 是否具有足够的可扩展性来管理许多并发插入(取决于关注者的数量)并通过 CONTAINS 进行选择?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多