【问题标题】:Cassandra data model design for notifications functionality通知功能的 Cassandra 数据模型设计
【发布时间】:2012-03-06 13:02:30
【问题描述】:

在设计通知数据模型方面需要一些帮助。所以,我想使用 Cassandra,并有一个网页,我想在其中存储用户 f.e. 的通知。 :

  • 收到来自
  • 的消息
  • 用户 xyz 为您的照片投了票
  • 等等……

用户必须获取最后通知的范围并删除单个通知。所以我需要一个最佳模式(50% 的读取与 50% 的写入??)。

我的想法如下...(你怎么看??按时间戳排序的键怎么样):

notifications {
   john : {
       111-1123-3242-9202 : {type: 'newmail'; ...; timestamp: 321948293849}
       555-1123-aaac-ccc3 : {type: 'voted'; ...; timestamp: 321948293433}
   }

   anna : {...}

   ...
}

真的提前谢谢了!

汤姆

【问题讨论】:

    标签: model cassandra


    【解决方案1】:

    我假设“通知”是您的 CF,而“john”、“anna”等是行键。

    假设每个通知的数据相对较小或永远不需要更新,我建议您使用时间戳作为列名,并将整个序列化的通知(可能是 json)放在列值中。这将让您非常有效地获取最后 N 条通知,并允许轻松删除单个通知。

    使用pycassa,获取查询和删除可能如下所示:

    def get_notifications_for(user):
        cols = notifications_cf.get(user, column_count=10)
        return map(json.loads, cols.values())
    
    def delete_notification(user, notification_timestamp):
        notifications_cf.remove(user, columns=[notification_timestamp])
    

    我在这里假设您已将比较器设置为 LongType(reversed=true),这意味着如果您使用时间戳作为列名,您的通知将按时间倒序存储。

    【讨论】:

    • hmm...我再次提出一些问题:在这个用例中使用 Long 作为列类型不安全吗?理论上可以生成重复的列名。我正在使用 Hector & Java 并使用 System.currentTimeInMillis() 生成时间。当然,我可以更改为 TimeUUID,但不确定是否必须。
    • 是的,如果您担心冲突,请改用 TimeUUID。那会很好用。
    • 确定。但是我使用的是 Java 和 Hector 客户端,所以我必须使用 com.eaio.uuid.UUID - 只有一种实现可以保证唯一性。但这只是这个 UUID 的一个问题。初始化对象后,无法获取时间值!! :) 而且我必须将时间戳存储在列中的某处。据我所知,您是一名 Python 编码员,所以这不是您的情况。谢谢。
    猜你喜欢
    • 2017-01-24
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    • 2012-10-19
    • 2016-08-30
    • 1970-01-01
    • 2018-07-28
    • 2015-01-26
    相关资源
    最近更新 更多