发布于 2020-09-04 11:55:00
在像IMDG这样的分布式系统中实现领导板似乎是一项非常复杂的任务。如果我错了,请纠正我,但是在Redis中,ZSET是一个更本地的东西,你不能有一个排序集比你最大的碎片更大。我想把这个问题分成两个独立的案例:本地的和分布式的。
Ignite中,可以通过创建一个缓存复制来实现这一点。可以在SQL中使用本地LIMIT/OFFSET查询,但据我所知,没有快速(O(log(n))索引跳转来从具有特定编号的行开始进一步扫描。这使得不可能实现O(log(n) + m)的总体复杂性,其中m是一个窗口大小。从理论上讲,这是可以实现的。我在"Apache开发人员“列表中启动了讨论。不管怎样,这都取决于你的实际用例:你有多少用户,目标延迟是多少,百分位数等等。a到b级别的每个节点获得值就足够了,因为数据分布 (关联映射到节点的键)可能不是绝对均匀的。这意味着您需要扫描每个节点上的整个索引,直到到达b (或最近的值)为止。发布于 2020-09-01 08:42:47
在Hazelcast中,您可以创建IndexType.SORTED。请查看相关文件,Hazelcast参考手册:索引查询。
发布于 2020-09-01 09:25:10
在查询实体中使用Apache Ignite似乎是可能的。这是一个原始的例子。
<bean class="org.apache.ignite.configuration.CacheConfiguration">
<property name="name" value="testCache"/>
<property name="queryEntities">
<list>
<bean class="org.apache.ignite.cache.QueryEntity">
<property name="keyType" value="com.company.ScoreAndId"/>
<property name="keyFields">
<list>
<value>score</value>
<value>id</value>
</list>
</property>
<property name="valueType" value="com.company.UserInfo"/>
<property name="fields">
<map>
<entry key="score" value="java.lang.Long"/>
<entry key="id" value="java.lang.Long"/>
<entry key="name" value="java.lang.String"/>
</map>
</property>
<property name="indexes">
<list>
<bean class="org.apache.ignite.cache.QueryIndex">
<constructor-arg value="id"/>
</bean>
<bean class="org.apache.ignite.cache.QueryIndex">
<constructor-arg>
<list>
<value>score</value>
<value>id</value>
</list>
</constructor-arg>
<constructor-arg value="SORTED"/>
</bean>
</list>
</property>
</bean>
</list>
</property>
</bean>在此之后,可以使用常规的SQL查询从缓存中获取数据。表名将是"USERINFO",因为它是从类型名称:UserInfo继承的,无论如何,重新配置可以这样做。架构来自缓存名称。例如:
SELECT * FROM "testCache"."USERINFO" WHERE SCORE > ? AND SCORE < ?;它将进行范围索引扫描。您可以运行一个EXPLAIN命令来检查所使用的索引(在示例中有两个索引)。
explain SELECT * FROM "testCache"."USERINFO" WHERE SCORE > ? AND SCORE < ?;https://stackoverflow.com/questions/63683458
复制相似问题