【问题标题】:Cassandra unread messages countCassandra 未读消息计数
【发布时间】:2018-08-28 05:01:12
【问题描述】:

请尝试模拟未读消息计数。我有一个 user_messages 表

创建表 user_messages ( 用户文本, 发件人文字, 消息文本, 读取布尔值, 创建日期时间戳, 主键(用户,创建日期) ); 我怎么知道未读消息的总数?我是否需要在每次阅读消息时创建一个计数器表并更新 user_messages 表?
我还读到使用 select count(*) 太贵了,不推荐用于生产。请我需要帮助。

【问题讨论】:

标签: database cassandra nosql datastax cql


【解决方案1】:

您可以使用静态列来保存未读消息的数量,并在您阅读消息时更新它(但您需要确保它不是从两个地方更新的)。比如:

CREATE TABLE user_messages (
  user text,
  unread int static,
  sender text,
  message text,
  read boolean,
  creation_date timestamp,
  PRIMARY KEY (user, creation_date)
);

然后获取未读消息的计数将是简单的查询(或缩小到特定字段):

select * from user_messages limit 1;

并从答案中获取unread 字段。

附:关于count(*) - 当你不指定分区键时它很昂贵,但是当你在分区内计数时(在你的情况下,如果你有when user = ?) - 那么它更便宜,但仍然会有很大的开销,因为传输数据。而且因为read 标志不是集群列,所以不能对其进行限制。

【讨论】:

  • 当你说“你需要确保它不是从 2 个地方更新的?”时,我不明白。同一列并发更新(unread int static)不能保证一致性?
  • 请我还是不明白你对这个问题的回答。我很困惑,我需要进一步澄清。我将如何获得未读消息的总数?每个未读字段(int static)属于每个记录。
  • 如果你想确保数据不会被另一个实例覆盖,那么你需要进行条件更新,比如,UPDATE table SET unread = 1 IF unread = 2
猜你喜欢
  • 2015-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-16
相关资源
最近更新 更多