Cassandra 如何在PlayORM中实现二级索引以及如何支持/处理并发更新?
对于处理并发更新的二级索引,有几种您自己的策略,例如: 它使用3个列族 我的问题是,PlayORMCassandra 如何在PlayORM中实现二级索引以及如何支持/处理并发更新?,cassandra,playorm,Cassandra,Playorm,对于处理并发更新的二级索引,有几种您自己的策略,例如: 它使用3个列族 我的问题是,PlayORM@NoSqlIndexed注释是如何实现的;需要/创建哪些额外的柱族 此外,是否支持并发更新?即,两个相互竞争的更新不可能从一个更新索引,从另一个更新表 到目前为止,Playorm中的所有索引只创建了3个表。i、 所有索引都存储在StringIndice、IntegerIndice和DecimalIndice列族中 除此之外,还有一个正在开发的模式,它将在需要时为列创建一个新表。请参阅。上的模式详
@NoSqlIndexed
注释是如何实现的;需要/创建哪些额外的柱族
此外,是否支持并发更新?即,两个相互竞争的更新不可能从一个更新索引,从另一个更新表 到目前为止,Playorm中的所有索引只创建了3个表。i、 所有索引都存储在StringIndice、IntegerIndice和DecimalIndice列族中
除此之外,还有一个正在开发的模式,它将在需要时为列创建一个新表。请参阅。上的模式详细信息。您可以在不锁定的情况下执行并发更新 幻灯片46的问题是我不能得到假阳性吗?PlayOrm也是如此 需要注意的一点是,您可能需要在读取时解决。这就是一个例子。假设数据库中有地址为123的Fred 现在,两台服务器对Fred进行更新
- 服务器1:Fred的新地址是456(导致删除索引123.Fred并添加456.Fred)
- 服务器2:Fred的新地址是789(结果是删除索引123.Fred并添加789.Fred)
Indexes=
{"User_Keys_By_Last_Name":{
{"adams","e5d…"}: null,
{"alden","e80…"}: null,
{"anderson","e5f…"}: null,
{"anderson","e71…"}: null,
{"doe","e78…"}: null,
{"franks","e66…"}: null,
…:…,
}
}
通过这种方式,我们可以避免阅读,以确定是否需要在名称的后半部分使用1、2、3、4、5。相反,我们使用FK,我们知道它是唯一的,只需进行写入。Cassandra致力于解决读取过程中的冲突,这就是修复过程存在的原因。这是基于这样一个事实,即冲突发生的时间百分比非常低,并且在这个低百分比下受到打击
最后,您可以使用命令行工具查看索引!!!!它在大约200列中分批处理内容,每次流回,这样您就可以有100万个条目,命令行工具将很高兴地继续打印它们,直到您按住ctrl-c键
后来,,
院长谢谢你的精彩解释。我没有意识到CQL会查询所有节点,你能告诉我关于这方面的更多信息吗?还有另一个问题,因为索引的行键是“众所周知的”,这可能意味着如果它被多次命中,您可能会在环中出现热点(取决于您的复制因子)?如果您使用分区,我相信CQL会命中一个分区…没有分区,它不知道(但与此格式不同,所有行都位于该节点上)。此外,是的,在任何设计中,任何人都会遇到热点或写操作,这会增加系统的负载,因为您需要写更多的内容。通常我们使用RF 3,因此您可以点击3个节点进行查询,并且通常会点击3个节点中的2个进行查询。我不确定我在哪里读到这些内容(已经读了很多)而且我并非总是100%正确,所以请随时检查/更正。(但不确定我是从哪里得到信息的)