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 未读消息计数的主要内容,如果未能解决你的问题,请参考以下文章