【问题标题】:User point system in CassandraCassandra 中的用户积分系统
【发布时间】:2013-09-04 17:29:15
【问题描述】:

我想为用户点设计一个系统。该系统主要的两个点是point和log。

我想使用 Cassandra 来存储数据。两个原因:

  1. Cassandra 提供计数器功能,我可以使用它来存储点数。
  2. 点变化的日志可能太多我不得不考虑存储的规模。 Cassandra 可以轻松扩展。

基本数据结构:

// row
name: user_id,
values: {
    point: {
        name: point,
        values: 1000
    },
    log: {
        name: log,
        values: {
            log_timestamp: {
                 name: timestamp,
                 values: xxxx
            },
            log_timestamp: {
                 name: timestamp,
                 values: xxxx
            },
            log_timestamp: {
                 name: timestamp,
                 values: xxxx
            },
            ……
        }
    }
}

我的问题是:

日志太多了有什么问题吗?

【问题讨论】:

    标签: cassandra event-log userpoints


    【解决方案1】:

    @lifei

    你想要的是一张桌子:

    1. 行键(分区键)= userId
    2. 1 点计数器
    3. 1 个日志集合,包含尽可能多的 log_timestamp

    创建这样的表确实很容易:

    CREATE TABLE logs
    (
      userId: int,
      log_timestamp long, //timestamp
      value text,
      PRIMARY KEY (userId,log_timestamp)
    );
    

    它是一个集群实体(宽行),最多有 20 亿个 log_timestamp/value 对。

    对于点计数器,不幸的是您必须创建另一个列族来存储它,因为 Cassandra 不允许将计数器值与其他类型混合。

    【讨论】:

    • 我该如何处理这笔交易?比如我想添加一个日志并增加点,必须一起成功或失败。听说 Cassandra 中的事务是行级的。
    • 在行级别,您具有“原子性”,这意味着一行中的突变(插入/更新/删除)要么成功,要么完全失败。现在,当涉及到 transactions 时,就有点棘手了。幸运的是,Cassandra 2.0 带有使用 CAS(比较和交换)的事务。看看here
    猜你喜欢
    • 1970-01-01
    • 2011-01-31
    • 2012-07-26
    • 2018-03-14
    • 1970-01-01
    • 2021-08-15
    • 2018-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多