Cassandra/Redis:在没有Cassandra“IN”二级索引的情况下创建提要的方法?

Cassandra/Redis:在没有Cassandra“IN”二级索引的情况下创建提要的方法?,cassandra,redis,nosql,Cassandra,Redis,Nosql,我的应用程序功能与Cassandra集成时遇到了一些问题。我正在尝试为我的用户创建内容提要。用户可以创建帖子,而这些帖子又具有字段user_id。我对整个社交图使用Redis,对对象使用Cassandra列。在Redis中,用户1有一个名为user:1:followers的集合,其中包含他/她的所有追随者ID。这些跟随者ID与users表中的Cassandra ID和posts表中的user_ID相对应 我最初的目标是简单地将这个Redis集中的所有用户id插入到一个查询中,该查询将使用用户id

我的应用程序功能与Cassandra集成时遇到了一些问题。我正在尝试为我的用户创建内容提要。用户可以创建帖子,而这些帖子又具有字段user_id。我对整个社交图使用Redis,对对象使用Cassandra列。在Redis中,用户1有一个名为user:1:followers的集合,其中包含他/她的所有追随者ID。这些跟随者ID与users表中的Cassandra ID和posts表中的user_ID相对应

我最初的目标是简单地将这个Redis集中的所有用户id插入到一个查询中,该查询将使用用户id中用户id所在的帖子,并从二级索引用户id中获取所有帖子。问题是Cassandra故意不在二级索引中使用IN运算符,因为该索引将强制Cassandra进行搜索该值的所有节点。我只能看到两个选项:要么创建一个用户的Redis列表:1:跟踪帖子id,然后在单个查询中搜索Cassandra的这些帖子的主索引,要么保持现在的状态,并对用户集中的每个用户id运行一个单独的查询:1:跟踪者集


我真的倾向于第一个选项,因为我在Redis中已经有了大量的图形数据,这个选项将为每个用户添加一个新的列表。第二种方法更糟糕。我会对Cassandra进行大量的读取,对一组ID运行单独的查询需要很长时间。就我所见,我被困在岩石和坚硬的地方之间。有没有办法查询具有多个值的二级索引?如果没有,与更多Redis列表或多个Cassandra查询选项相比,是否有更有效的方式以RAM和速度加载这些内容提要?提前感谢。

如果不知道posts表的模式,最好是其他表的模式,就很难提出任何有用的建议

我不清楚为什么需要将user_id作为辅助索引,而不是主键

一般来说,在创建内容的用户处键入内容(如帖子)是非常有用的,因为它允许您在给定范围内有选择地检索所有帖子,前提是它们按时间顺序进行了非常有效的排序

使用Cassandra,如果您发现一个表可以有效地回答您想要执行的一些查询,但不能回答其他查询,那么通常最好将该表非规范化,并创建另一个具有不同结构的表,以便将查询保留在单个CQL分区和节点上

CREATE TABLE posts (
  user_id int,
  post_id int,
  post_text text,
  PRIMARY KEY (user_id, post_id)
  ) WITH CLUSTERING ORDER BY (post_id DESC)
此表可以回答以下查询:

 select * from posts where user_id = 1234;

 select * from posts where user_id = 1 and post_id = 53;

 select * from posts where user_id = 1 and post_id > 5321 and post_id < 5400;
post_id上的反向集群是通过将最新的post物理地放在sstable中分区的开头,从而使检索最有效

在该示例中,user_id是一个分区列,这意味着具有该user_id的所有cql行将散列到同一个分区,从而散列到相同的物理节点,最终散列到相同的sstable。这就是为什么有可能

检索具有该用户id的所有帖子,因为它们是连续存储的 通过对post_id执行范围查询来检索它们的一部分 通过同时提供分区列user_id和集群列post_id来检索单个post
实际上,这将成为hashmap查找的hashmap。不过,一个主要的警告是,在使用分区和集群列时,您始终需要在查询中从左到右提供所有列,而不跳过任何列。因此,在这种情况下,这意味着您无法在不知道帖子id所属的用户id的情况下检索单个帖子。通过存储反向映射并在必要时进行查找,或者通过将用户id编码为在应用程序中传递的post id,可以在用户代码中寻址,但这绝对是需要考虑的问题。

,因此主键可以是用户id和发布id?主键可以是分区键(任何主键子句中的第一项)和集群键(该主键子句中的所有剩余项)的组合。