Cassandra 未读消息计数

Posted

技术标签:

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

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

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

【问题讨论】:

您可以使用此处描述的解决方案 ***.com/questions/43183915/… 或此处 ***.com/questions/1951843/… 或此处 ***.com/questions/35640503/count-rows-in-table 【参考方案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

以上是关于Cassandra 未读消息计数的主要内容,如果未能解决你的问题,请参考以下文章

cassandra中的分区计数

Cassandra 按计数排序结果

CQL3 (Cassandra) upsert 增加一个计数器

Spring Data Cassandra 计数器更新

有没有办法在 cassandra 中过滤计数器列?

Cassandra 错误消息:由于本地暂停,未将节点标记为关闭。为啥?